2010-03-25 6 views
15

Non ho davvero idea di cosa fare ora, lo sto fissando da ore e lo ho reqcritto .. non posso farlo funzionare!php/mysql - Inserimento preparato PDO, non funziona e nessun messaggio di errore

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() restituisce un handle di connessione valido? Esiste $ this-> db? $ Interrogare un oggetto PDOStatement valido? – bdl

risposta

16

Sono abbastanza sicuro che MySQL soffoca sul nome desc campo - si tratta di una parola riservata. Dovresti metterlo tra virgolette "" "o, meglio, cambiare il nome del campo.

Per quanto riguarda la segnalazione degli errori, utilizzare il metodo errorInfo. È possibile fare in modo che PDO in effetti restituisca il risultato di una query non riuscita nell'eccezione, ma il comportamento predefinito, penso, è quello di generare un'eccezione solo se la query non può essere eseguita affatto, ma non fallisce se la query è difettoso.

+2

Ah, buona presa. Ero concentrato sugli oggetti. Presumo che phpMyAdmin colpisca di nuovo (sfuggire magicamente a parole riservate a tua insaputa)! – bdl

+0

Corretto! .. odio quelle parole riservate .. – Simsevu

35

Volevo solo aggiungere a questo, ha avuto simili frustrazioni dalla mancanza di un messaggio di errore.

Per interrompere il PDO in caso di errore non presidiato, è possibile impostare la modalità errore sulla connessione PDO.

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

C'è anche PDO::ERRMODE_WARNING se si vuole errori, ma ancora continua.

+3

Trovato su google durante la ricerca di un problema simile (ma non correlato) e hai salvato la mia giornata. –

+1

Tu, signore, sei un eroe. (Sapevo che potevi farlo ma non ci pensavo!) – Magicode

+1

Questo è davvero un buon suggerimento. Finalmente ho impostato la modalità di errore sulla connessione PDO e questo mi ha permesso di vedere che ho dimenticato di impostare il valore in un ID di chiave esterna. Errore "violazione del vincolo di integrità: 1452 non può aggiungere o aggiornare una riga secondaria: un vincolo di chiave esterna non riesce".Sono tornato su questo codice dopo un po 'e mi ero completamente dimenticato della chiave esterna. – Robert

0

Problemi simili possono verificarsi quando qualcuno gira/abbandona l'autoincremento del DB sul campo ID principale.

3

Anche io dovevo affrontare quell'errore.

Ho usato print_r($con->errorInfo()); mi dà 0000 in chiave 0th di matrice.

Quindi ho abbinato tutti i nomi di colonna e ho capito che sto usando un nome di campo errato.

This salva la giornata.

+0

grazie !!!! così tanto –

-1

ho faticato con questo inserto silenzioso fallire questa settimana. ed ecco la soluzione che ha funzionato per me. Non stavo chiamando commit sulla transazione, quindi l'inserto è stato messo in stato di attesa ma non è mai stato completato nel database - quindi nessun errore. questo è stato più complicato perché il wrapper db PDR in questo progetto è una classe statica quindi non chiude automaticamente

soluzione: assicurati di chiamare il commit sul manico PDO dopo le azioni di inserimento/aggiornamento/cancellazione - oppure a pagina chiudi .

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

1

succede anche quando si utilizza PDOStatement::bindValue() con PDO::PARAM_BOOL. Soluzione: passa a PDO::PARAM_INT.