2012-06-26 9 views
5

Tengo una conexión PDO con ODBC (v2000.86.359.00) se conecta a un servidor SQL Server (SP4 v8.00.2039 Standard Edition) de base de datos.error al parámetro de fecha de declaración preparada vinculante - Uso de PHP DOP/ODBC con SQL Server

Esto funciona:

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

Pero si trato de usar una declaración preparada de esta manera:

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

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

me sale este error (de $ SMT-> errorInfo()):

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

He intentado: 1) Encerrando: duedate en comillas simples 2) Encuadernación fecha a fecha Unix entero 3) Encuadernación: DueDate al objeto DateTime php 4) Inserción de sólo $ DueDate en la instrucción SQL antes de preparar

En este punto, puede ser atrapado por el método de consulta $ db-> y desinfección de las entradas lo mejor que puedo, pero realmente agradecería cualquier sugerencia.

Uso de PHP 5,38 en una máquina Windows Server 2003.

Actualizaciones: He eliminado algunas de las variables de una versión anterior de esta pregunta. El mensaje de error ha cambiado, pero el resultado final es el mismo.

También he intentado manualmente la unión de los parámetros de este modo:

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

Junto con la adición de la función de conversión a SQL, así:

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

que devuelve: "campo de recuento incorrecto o error de sintaxis "

Y me he dado cuenta de que SQL Server no hace realmente play nice con marcas de tiempo Unix ...

+0

¿Qué contiene 'duedate'? –

+0

Cadena con una fecha formateada - He intentado '27 de junio de 2012' y '2012-06-27 00: 00.000' –

+0

Bueno, ¿has probado long-form: '$ smt-> bindValue (': duedate' , $ duedate, PDO :: PARAM_INT); '? O, lanzando '$ duedate = intval ($ duedate);'? – Wrikken

Respuesta

3

resolvieron Finalmente esta descargando e instalando tanto el sqlsrv php drivers (I utiliza la versión 2.0) y la SQL Server 2008 Native Client.

Con un pequeño arreglo al parámetro $ DSN, el resto del código funciona como magia - no vinculante, la conversión o fundición requerido.

Terminé utilizando únicamente el php_pdo_sqlsrv_53_ts_vc9.dll, pero asegúrese de seleccionar la versión correcta del navegador que sea segura para la ejecución de subprocesos o no, ya que el dll incorrecto en su php.ini bloqueará su servidor.

1

Ha intentado strtotime?

$phpdate = strtotime($duedate); 

También podría tratar de usar SQL's CONVERT en su estado de cuenta

convert(datetime, :duedate, 100) 

El tipo de datos de fecha y hora en SQL es, ¿verdad?

o probar:

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í. Mismo error. –

+0

Muéstrenos su $ duedate = – user1166147

+0

En este punto estoy usando un literal de cadena en la matriz: '$ input = array (': id' => 486, ': borrower' => 'JOHNSMITH', ': loaner' => 'KOPERW', ': duedate' => '27 de junio de 2012', ': loaneragain' => 'KOPERW'); ' –

0

"COUNT campo incorrecto o error de sintaxis" puede ocurrir si configura una consulta parametrizada pero no pasa el número requerido de parámetros en la lista de parámetros.

Sin embargo, su código se ve bien en ese frente.

Cuestiones relacionadas