2010-03-25 4 views
15

Ich habe wirklich keine Ahnung von was ich jetzt damit zu tun, ich habe es stundenlang angeguckt, und reqritten es .. ich kann nicht Mach es zur Arbeit!php/mysql - PDO vorbereitete einfügen, funktioniert nicht, und keine Fehlermeldungen

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

Gibt $ this-> db-> connect() ein gültiges Verbindungshandle zurück? Ist $ this-> db überhaupt vorhanden? Setzt $ ein gültiges PDOStatement-Objekt ab? – bdl

Antwort

16

Ich bin mir ziemlich sicher, dass mySQL auf den Namen desc Felddrosseln - es ist ein reserviertes Wort ist. Sie müssten es in "" Anführungszeichen setzen, oder, besser, ändern Sie den Feldnamen.

Verwenden Sie für die Fehlerberichterstattung die Methode errorInfo. Sie können veranlassen, dass PDO tatsächlich das Ergebnis einer fehlgeschlagenen Abfrage in der Ausnahme ausgibt, aber das Standardverhalten - denke ich - besteht darin, eine Ausnahme nur dann auszulösen, wenn die Abfrage überhaupt nicht durchgeführt werden kann ist fehlerhaft.

+2

Ah, guter Fang. Ich war auf die Objekte konzentriert. Ich nehme an, dass phpMyAdmin wieder zuschlägt (magisch reservierten Wörtern ohne Ihr Wissen entkommen)! – bdl

+0

Richtig! .. Ich hasse diese reservierten Worte .. – Simsevu

35

Ich wollte nur hinzufügen, hatte ähnliche Frustrationen aufgrund des Fehlens einer Fehlermeldung.

Um zu verhindern, dass PDO automatisch stört, können Sie den Fehlermodus für die PDO-Verbindung festlegen.

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

Es gibt auch PDO::ERRMODE_WARNING wenn Sie Fehler wollen aber noch weiter.

+3

Gefunden bei Google bei der Suche nach einem ähnlichen (aber nicht verwandten Problem) und Sie meinen Tag gerettet. –

+1

Sie, Sir, sind ein Held. (Ich wusste, dass du das tun könntest, aber ich habe einfach nicht daran gedacht!) – Magicode

+1

Das ist wirklich ein guter Hinweis. Schließlich habe ich den Fehlermodus auf der PDO-Verbindung eingestellt und dies erlaubte mir zu sehen, dass ich vergessen habe, den Wert in einer Fremdschlüssel-ID zu setzen. Fehler "Integritätseinschränkungsverletzung: 1452 kann keine untergeordnete Zeile hinzufügen oder aktualisieren: Eine Fremdschlüsseleinschränkung schlägt fehl".Ich war nach einer Weile wieder bei diesem Code und hatte den Fremdschlüssel total vergessen. – Robert

0

Ähnliche Probleme können auftreten, wenn jemand das DB-Autoinkrement auf dem Haupt-ID-Feld ein-/ausschaltet.

3

Ich war auch mit diesem Fehler konfrontiert.

Ich verwendete print_r($con->errorInfo()); es gibt mir 0000 in 0th Schlüssel des Arrays.

Dann passte ich alle Spaltennamen und herausgefunden, dass ich falsche Feldname verwende.

This spart meinen Tag.

+0

danke !!!! so sehr –

-1

ich kämpfte mit dieser stillen Einlage diese Woche fehlschlagen. und hier ist die Lösung, die für mich funktioniert hat. Ich habe das Commit für die Transaktion nicht aufgerufen, daher wurde das Insert in den Status "Ausstehend" versetzt, aber in der Datenbank nie abgeschlossen - daher kein Fehler. Das war kniffliger, weil der PDR-DB-Wrapper in diesem Projekt eine statische Klasse ist, so dass er nicht automatisch schließt

Lösung: Stellen Sie sicher, Commit auf dem PDO-Handle nach dem Einfügen/Aktualisieren/Löschen Aktionen - oder auf Seite zu rufen .

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

1

Es kommt auch vor, wenn Sie PDOStatement::bindValue() mit PDO::PARAM_BOOL verwenden. Lösung: Wechseln Sie einfach zu PDO::PARAM_INT.