2012-06-26 13 views
5

Ho una connessione pdo con ODBC (v2000.86.359.00) che si collega a un database SQL Server (v8.00.2039 SP4 Standard Edition).Errore nel parametro della data di associazione all'istruzione preparata - Utilizzo di PDO/ODBC PHP con SQL Server

Questo funziona:

$id = 486; 
$duedate = 'June 27, 2012'; 
$query ="INSERT into AssetHistory (AssetID, DateDue) Values($id, $duedate);";     
$noParams = $db->exec($query); 
$db->query($query); 

Ma se provo ad usare una dichiarazione preparata in questo modo:

$sql = 'INSERT into AssetHistory 
    (AssetID, DateDue) 
    Values(:id, :duedate);';     

$input = array(':id'=>486, ':duedate'=>'June 27, 2012'); 
$smt = $db->prepare($sql); 
$smt->execute($input); 

ottengo questo errore (da $ all'SMT> errorInfo()):

"[Microsoft][ODBC Driver Manager] Function sequence error (SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254)" 

Ho provato: 1) In chiusura: duedate tra virgolette singole 2) Rilegatura data unix timestamp intero 3) Binding: dueDate per oggetto PHP DateTime 4) Inserimento di soli $ dueDate in istruzione SQL prima di preparare

A questo punto potrei essere bloccato utilizzando il metodo di query $ DB-> e sanificazione ingressi come meglio posso, ma apprezzerei davvero ogni suggerimento.

Utilizzo di PHP 5.38 in una casella di Windows Server 2003.

Aggiornamenti: Ho rimosso alcune delle variabili da una versione precedente di questa domanda. Il messaggio di errore è cambiato, ma il risultato finale è lo stesso.

Ho anche provato manualmente i parametri vincolanti in questo modo:

$smt->bindValue(':id', 486, PDO::PARAM_INT); 
$smt->bindValue(':duedate', 'June 27, 2012', PDO::PARAM_STR); 

Insieme con l'aggiunta della funzione di conversione a SQL in questo modo:

$sql = 'INSERT into AssetHistory 
    (AssetID, DateDue) 
Values(:id, convert(datetime,:duedate, 100));'; 

che restituisce: "campo COUNT errato o errore di sintassi "

E ho notato che SQL Server in realtà non è play nice con timestamp unix ...

+0

Cosa contiene 'duedate'? –

+0

Stringa con una data formattata - Ho provato "27 giugno 2012" e "2012-06-27 00: 00.000" –

+0

Bene, hai provato la forma lunga: '$ smt-> bindValue (': duedate' , $ dueDate, DOP :: PARAM_INT); '? Oppure, lanciare '$ duedate = intval ($ duedate);'? – Wrikken

risposta

3

finalmente risolto questo scaricando e installando sia il sqlsrv php drivers (ho usato la versione 2.0) e la SQL Server 2008 Native Client.

Con un piccolo aggiustamento al parametro $ dsn, il resto del codice funziona come per magia: non è richiesto alcun binding, conversione o casting.

Ho finito per utilizzare solo il php_pdo_sqlsrv_53_ts_vc9.dll, ma assicurati di selezionare la versione di thread-safe/non-thread corretta del driver, poiché la dll errata in php.ini bloccherà il tuo server.

1

Hai provato strtotime?

$phpdate = strtotime($duedate); 

Si potrebbe anche provare a utilizzare SQL's CONVERT nell'istruzione

convert(datetime, :duedate, 100) 

Il tipo di dati in SQL è datetime, giusto?

o provare:

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate'=>strtotime($duedate), 

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate"=>$duedate),"0000-00-00 00:00:00" 
+0

Sì. Lo stesso errore. –

+0

Mostraci il tuo $ duedate = – user1166147

+0

A questo punto sto usando una stringa letterale nell'array: '$ input = array (': id' => 486, ': borrower' => 'JOHNSMITH', ': loaner' => 'KOPERW', ': duedate' => '27 giugno 2012', ': loaneragain' => 'KOPERW'); ' –

0

"COUNT campo errato o errore di sintassi" può verificarsi se si imposta una query con parametri ma non si riesce a passare il numero di parametri richiesto nell'elenco dei parametri.

Il tuo codice sembra ok su quel fronte, tuttavia.

Problemi correlati