2010-10-22 14 views
25

Aquí hay un fragmento de mi código:mensaje de error de PDO?

$qry = ' 
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table 
    WHERE description LIKE "%:search_string%" 
    AND available = "yes" 
    ON DUPLICATE KEY UPDATE score = score + 40 
'; 
$sth = $this->pdo->prepare($qry); 
$sth->execute($data); 

print_r($this->pdo->errorInfo()); 

Esto me debe dar un error porque ni siquiera existen las tablas. Sin embargo, todos lo que consigo es la siguiente:

Array ([0] => 00000)

¿Cómo puedo obtener una mejor descripción del error para que pueda depurar el problema?

+0

intente imprimir el error después de la de preparar, pero antes de la ejecución de – thetaiko

+0

El error parece bastante claro para mí,: SEARCH_STRING que se reemplazarán con algo como 'parametro' (incluyendo las comillas), por lo que su La instrucción sql final se parecería a "%" foobar "%". Lo que debe hacer es agregar el% a los $ datos en la sentencia -> execute().Como esto fue hace 3 años, estoy seguro de que descubrió el error – relipse

+0

Por cierto, me estoy cruzando con el mismo problema, no hay ningún mensaje de error. La única forma en que aprendí a solucionarlo es copiar y pegar el SQL en phpmyadmin y buscar el resultado. ¿Alguien más resolvió esto? Intenté las respuestas a continuación. – relipse

Respuesta

68

Tal vez puedas probar:

print_r($sth->errorInfo()); 

EDIT:

Añadir esto antes de su preparar:

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

Esto cambiará el tipo de informe de errores DOP y hacer que se emita una advertencia cada vez hay un error de PDO Debería ayudarlo a rastrearlo, aunque su errorInfo debería haberse establecido.

+0

Gracias, eso me da exactamente lo mismo, 'Matriz ([0] => 00000)'. –

+0

Agregué otra cosa que puedes probar, pero si errorInfo no se configura correctamente puede haber algo más. –

+0

Esto parece estar funcionando. –

2

Del manual:

Si el servidor de base de datos correctamente prepara el estado, PDO :: prepare() devuelve un objeto PDOStatement. Si el servidor de base de datos no puede correctamente preparar la instrucción, PDO :: prepare() devuelve FALSE o emite PDOException (dependiendo del manejo de errores).

La sentencia de preparación probablemente causó un error porque la base de datos no podría preparar la instrucción. Pruebe a detectar un error inmediatamente después de preparar su consulta y antes de ejecutarla.

$qry = ' 
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table 
    WHERE description LIKE "%:search_string%" 
    AND available = "yes" 
    ON DUPLICATE KEY UPDATE score = score + 40 
'; 
$sth = $this->pdo->prepare($qry); 
print_r($this->pdo->errorInfo()); 
+0

Lo intenté y tampoco me ayudó – relipse

3

Tal vez este post es demasiado viejo, pero puede ayudar como una sugerencia para alguien mirando en torno a esto: En lugar de utilizar:

print_r($this->pdo->errorInfo()); 

Uso de PHP implosión() Función:

echo 'Error occurred:'.implode(":",$this->pdo->errorInfo()); 

Esto debería imprimir el código de error, información detallada de error, etc. que normalmente obtendría si estuviera usando alguna interfaz de usuario SQL.

Espero que ayude

+1

Debe querer decir 'echo 'Se produjo un error:' .implode (": ", $ this-> pdo-> errorInfo();'. No tiene sentido usar 'print_r' si el objeto no es una matriz :-) –

+0

@ShaquinTrifonoff pdo-> errorInfo() es de hecho una matriz. Vea aquí: http://php.net/manual/en/pdo.errorinfo.php – Vikram

+0

Eso es lo que estoy diciendo - 'implode' lo convierte en una cadena, por lo que no hay razón para usar' print_r' en una cadena . –

4

Viejo hilo, pero tal vez mi respuesta ayudará a alguien. Lo resolví ejecutando primero la consulta, luego estableciendo una variable de errores, y luego comprobando si esa matriz variable de errores está vacía. ver ejemplo simplificado:

$field1 = 'foo'; 
$field2 = 'bar'; 

$insert_QUERY = $db->prepare("INSERT INTO table bogus(field1, field2) VALUES (:field1, :field2)"); 
$insert_QUERY->bindParam(':field1', $field1); 
$insert_QUERY->bindParam(':field2', $field2); 

$insert_QUERY->execute(); 

$databaseErrors = $insert_QUERY->errorInfo(); 

if(!empty($databaseErrors)){ 
    $errorInfo = print_r($databaseErrors, true); # true flag returns val rather than print 
    $errorLogMsg = "error info: $errorInfo"; # do what you wish with this var, write to log file etc...   

/* 
$errorLogMsg will return something like: 
error info: 
Array(
    [0] => 42000 
    [1] => 1064 
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table bogus(field1, field2) VALUES             ('bar', NULL)' at line 1 
) 
*/ 
} else { 
    # no SQL errors. 
} 
Cuestiones relacionadas