2010-03-25 13 views
15

No tengo ni idea de qué hacer con esto ahora, lo he estado mirando durante horas, y lo reqritten .. no puedo ¡haz que funcione!php/mysql - PDO preparado inserto, no funciona, y no hay mensaje de error

require_once("Abstracts/DBManager.php"); 
require_once("UI/UI.Package.php"); 
class BlogDBM extends DBManager 
{ 
    private $table = "blog_records"; 
    function saveRecord($title,$url,$desc,$feedId,$pubDate) 
    { 
     $PDO = $this->db->connect(); 
     try 
    { 

    $query = $PDO->prepare(" 
    INSERT INTO ".$this->table." 
    (title,url,desc,feed_id,pubdate) VALUES 
    (:title,:url,:desc,:feed_id,:pubdate)"); 
    $query->bindParam(":title", $title); 
    $query->bindParam(":url", $url); 
    $query->bindParam(":desc", $desc); 
    $query->bindParam(":feed_id", $feedId, PDO::PARAM_INT); 
    $query->bindParam(":pubdate", $pubDate, PDO::PARAM_INT); 
    $query->execute(); 
    //return $PDO->lastInsertId(); 


    } catch(PDOException $e) 
    { 
    echo "Error " . $e->getMessage(); 

    } 
    $PDO = NULL; 
    } 
} 
+0

¿$ this-> db-> connect() devuelve un identificador de conexión válido? ¿$ This-> db incluso existe? ¿$ Consulta es un objeto PDOStatement válido? – bdl

Respuesta

16

Estoy bastante seguro de que MySQL se ahoga con el nombre desc campo - es una palabra reservada. Tendría que ponerlo en "` "comillas o, mejor, cambiar el nombre del campo.

En cuanto a los informes de errores, utilice el método errorInfo. Puede hacer que PDO muestre realmente el resultado de una consulta fallida en la excepción, pero el comportamiento predeterminado, creo, es lanzar una excepción solo si la consulta no se puede realizar en absoluto, pero no falla si la consulta es defectuoso.

+2

Ah, buena captura. Estaba centrado en los objetos. ¡Asumo que phpMyAdmin ataca de nuevo (escapando mágicamente palabras reservadas sin su conocimiento)! – bdl

+0

¡Correcto! ... odio esas palabras reservadas ... – Simsevu

35

Solo quería agregar a esto, tuvo frustraciones similares por la falta de un mensaje de error.

Para evitar que PDO silenciosamente falle, puede establecer el modo de error en la conexión PDO.

$dbh = new PDO(); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Existe también PDO::ERRMODE_WARNING si quieres errores, pero aún continúa.

+3

Encontré esto en google mientras buscaba un problema similar (pero no relacionado) y me salvaste el día. –

+1

Usted, señor, es un héroe. (¡Sabía que podrías hacer eso pero no pensé en eso!) – Magicode

+1

Esto es realmente una buena pista. Finalmente, configuré el modo de error en la conexión PDO y esto me permitió ver que olvidé establecer el valor en una ID de clave externa. Error "violación de la restricción de integridad: 1452 no puede agregar o actualizar una fila secundaria: una restricción de clave externa falla".Volví a este código después de un tiempo y me había olvidado por completo de la clave externa. – Robert

0

Pueden ocurrir problemas similares cuando alguien da vuelta/abandona la autoincrementación de DB en el campo de id. Principal.

3

También estaba enfrentando ese error.

utilicé print_r($con->errorInfo()); me da 0000 en 0th key of array.

Luego hice coincidir todos los nombres de las columnas y me di cuenta de que estoy usando un nombre de campo incorrecto.

This me salva el día.

+0

gracias !!!! tanto –

-1

tuve problemas con este inserto silencioso que falló esta semana. y aquí está la solución que funcionó para mí. No estaba llamando commit en la transacción, por lo que el inserto se puso en el estado pendiente, pero nunca se completó en la base de datos, por lo tanto, no hay ningún error. esto fue más complicado porque el contenedor PDR db en este proyecto es una clase estática, por lo que no cierra automáticamente

solución: asegúrese de invocar la confirmación en el identificador PDO después de las acciones insertar/actualizar/eliminar - o en la página cerrar .

$PDO->exec("COMMIT;");

1

También sucede cuando se utiliza con PDOStatement::bindValue()PDO::PARAM_BOOL. Solución: simplemente cambie al PDO::PARAM_INT.

Cuestiones relacionadas