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 ...
Cosa contiene 'duedate'? –
Stringa con una data formattata - Ho provato "27 giugno 2012" e "2012-06-27 00: 00.000" –
Bene, hai provato la forma lunga: '$ smt-> bindValue (': duedate' , $ dueDate, DOP :: PARAM_INT); '? Oppure, lanciare '$ duedate = intval ($ duedate);'? – Wrikken