2012-08-05 15 views
20

tengo el código de abajo:PHP PDO. número de error '00000' cuando la consulta es correcta

$sql3 = "update news set date='$time' where id='2'"; 
$sql3 = $connect->exec($sql3); 
if(!$sql3) 
{ 
    print_r($connect->errorInfo()); 
    $error = $connect->errorInfo(); 
    die ("Error: (".$error[0].':'.$error[1].') '.$error[2]); 
} 

Cuando ejecuto el guión, a veces me da el número de error '00000'. Quiero decir, entra en el IF. y es todo aleatorio. salida (a veces):

Array ([0] => 00000 [1] => [2] =>) 

¿Qué debo hacer para solucionar este problema?
PD: la secuencia de comandos se ejecuta correctamente cada vez.

+1

error 0 significa el éxito –

+0

El código de error 00000 significa que la consulta 'MySQL' se ha ejecutado correctamente. –

+0

No siempre. Ver mi respuesta a continuación. – Collector

Respuesta

31

El código de error 00000 de PDO significa que todo funciona bien. El motivo por el que está presionando el código de comprobación de errores es que $sql3 está devolviendo 0 (no se realizaron filas) y PHP lo evalúa como falso. (! $ SQL3) tratar de manera explícita la comprobación de un return false;

if($sql3 === false) 
+0

Eso no es cierto, ver mi respuesta. – Collector

+0

@Collector Hay una gran diferencia entre "fallido" y "no hizo lo que el programador pretendía". '00000' significa que no hubo fallas, pero no ofrece garantías de que el código hizo lo que usted quería. – SomeKittens

7

Si ejecutivo no actualiza cualquier fila, devolverá 0. hace que si como resultado false, debe hacerse lo siguiente:

if($sql3 === false){ 

} 
1

00000 significa que funciona bien. debe cambiar su si a esto: $sql3 === false.

1

Acabo de recibir una situación similar en mi proyecto php: se produjo una excepción PDO con el código de error '00000' cuando intenté insertar una fila con un campo establecido en NULL mientras la columna definía el campo en la base de datos ENUM('0', '1') y restricción NOT NULL. Después de modificar el script PHP para colocar '0' en lugar de NULL, el error desapareció.


Además codificación trajo más luz en la situación - Estaba realizando más de un statments PDO dentro de una transacción de base de datos pero la comprobación de errores (en el bloque El manejo de excepciones) basándose sólo en la primera declaración DOP ejecutada mientras que el error real, se produjo int la tercera declaración PDO.

0

Tuve el mismo problema. También me torturaba mucho, pero finalmente lo descubrí.

Supongamos que tiene 7 columnas en su tabla.

Usted es insertando datos en 4 de ellos.

Si para el restante 3 columnas el valor predeterminado no está establecido (digamos NULL for alpha-numeric columns, CURRENT_TIMESTAMP for date-time related columns etc.), se produce el problema antes mencionado.

Si va a insertar datos en todas esas columnas 7 o al menos en esas columnas para las que el valor por defecto no está establecido, usted no conseguirá ningún error y obtendrá los datos insertados.

2

En mi experiencia las consultas mal formadas (errores de sintaxis) y las consultas fallidas (por ejemplo, un INSERT que no insertó nada) también pueden devolver WRONGLY el código de error 00000. Debería seguir adelante e intentar ejecutar la consulta completa en su Consola SQL y ver por qué falló. Realmente no sé por qué no se devuelve el mensaje de error adecuado.He aquí un fragmento del código que usamos

$r = $pdo->prepare($sql); 
    if (!$r->execute($input_parameters)) { # query failed 
     if ($bLogFailures) { 
      error_log('query failed: ERROR['.$pdo->errorCode().':'.print_r($pdo->errorInfo(), true).'] QUERY['.$sql.']'); 
     } 
     return false; 
    } 
+0

Esta ayuda muchas gracias – RichardBrock

0

El PDO :: exec declaración devuelve un entero para indicar el número de filas que se vieron afectados. Entonces, en su caso particular, como indica SomeKittens, si se afectaron 0 filas, se activará su código de error.

Sin embargo, si le preocupa si su consulta funcionó, su mejor acción puede ser utilizar PDO :: query (en términos de su código ($ returnObj = $ connect-> query ($ sql3) en lugar de PDO :: exec.

El $ returnObj se puede verificar para ver si hubo un error en la ejecución de SQL, y luego puede solucionar su consulta SQL porque le dirá cuál fue el error y dónde se ubicó.

Su mejor opción para hacer esto sería:

//set PDO to throw an error so you can wrap the query in a try/catch block. 
$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$sql3 = "update news set date='$time' where id='2'"; 
try { 
    $returnObj = $connect->query($sql3); 
} catch (PDOException $e) { 
    print_r($returnOjb->errorInfo()); 
    $error = $returnObj->errorInfo(); 
    die ("Error: (".$error[0].':'.$error[1].') '.$error[2]); 
} 
+2

[Por favor, no mueras!] (Https://phpdelusions.net/programming) –