PDO - wie herausbekommen, dass uniquer Datensatz doppelt
jobo
- datenbank
Hallo,
wie krieg ich denn mit PDO-Klasse heraus, ob der Versuch, Daten in eine DB zu schreiben daran scheiterte, dass ein Unique-Feld schon mit dem Wert belegt ist?
Gruß
jobo
Hello,
wie krieg ich denn mit PDO-Klasse heraus, ob der Versuch, Daten in eine DB zu schreiben daran scheiterte, dass ein Unique-Feld schon mit dem Wert belegt ist?
in der Theorie durch Überprüfen von errorCode. Eigentlich sollte dir hier standardisierte Fehlerinformation zur Verfügung stehen. "Eigentlich" und "Theorie" weil ich mir jetzt zwei verschiedene SQLSTATE-Listen angeschaut habe und in keiner auf Anhieb die entsprechenden Einträge finden konnte. Aber vielleicht bringts dich in die richtige Richtung.
MfG
Rouven
Hallo,
http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
Error: 1022 SQLSTATE: 23000 (ER_DUP_KEY)
Message: Can't write; duplicate key in table '%s'
$stmt = $dbh->prepare("INSERT INTO fotos
(id, filename,timestamp,day,hour,minute)
VALUES
(:id, :filename, :timestamp, :day, :hour, :minute)");
$stmt->bindParam(':id', $id);
$stmt->bindParam(':filename', $filename);
$stmt->bindParam(':timestamp', $timestamp);
$stmt->bindParam(':day', $day);
$stmt->bindParam(':hour', $hour);
$stmt->bindParam(':minute', $minute);
$id = NULL;
$filename = "test9.jpg";
$timestamp = time();
$day = date("D",time());
$hour = date("H",time());
$minute = date("m",time());
$stmt_res = $stmt->execute();
echo "stmt_res exec\n";
var_dump($stmt_res);
if (!$stmt_res) {
var_dump($dbh->errorCode());
var_dump($stmt->errorCode());
}
}
bringt dann bei var_dump($stmt->errorCode) eben string(5) "23000"
Gruß
jobo
Hallo,
Hallo,
http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
Error: 1022 SQLSTATE: 23000 (ER_DUP_KEY)
php_myadmin aber kann mir ausgeben:
#1062 - Duplicate entry 'test2.jpg' for key 2, was aber ein andere Error ist???
Message: Can't write; duplicate key in table '%s'
Und eine andere Message.
Gruß
jobo
Moin!
php_myadmin aber kann mir ausgeben:
#1062 - Duplicate entry 'test2.jpg' for key 2, was aber ein andere Error ist???
Nutzt das PDO? Nein!
- Sven Rautenberg
Hallo,
Nutzt das PDO? Nein!
Naja, aber man könnte halt schauen, bei welchem jpg die DB schon einen Eintrag hätte, obwohl sie es eigentlich nicht haben sollte, da ja in diesem Skript jedes Bild nur einmal eingetragen werden soll (auslesen und converten und eintragen, wenn schon converted, dann nicht eintragen). Aber der Cronjob sollte vielleicht mitloggen, wenn es mal doch wieder erwarten einen duplicate key geben sollte (was nicht sein kann, weils nicht sein darf (;-) http://www.christian-morgenstern.de/dcma/index.php?title=Die_unmögliche_Tatsache).
- Sven Rautenberg
Gruß
jobo
Hallo,
php_myadmin aber kann mir ausgeben:
#1062 - Duplicate entry 'test2.jpg' for key 2, was aber ein andere Error ist???
Message: Can't write; duplicate key in table '%s'
Und eine andere Message.
die aber durch $stmt->errorInfo ausgegeben werden kann:
http://www.php.net/manual/de/pdo.errorcode.php
Wie man aber auf den Fehler 1062 kommt, weiß ich noch nicht. PDO::errorInfo() erhalte ich nur array[0] = "00000"; aber das statement wurde ja auch vom statementobjekt abgefeuert, nicht vom dbh.
Gruß
jobo
Hallo,
http://www.php.net/manual/de/pdo.connections.php
schlägt im catchblock vor:
print "Error!: " . $e->getMessage() . "<br/>";
Und schreibt, dass sonst u.U. auch das Passwort im Backtrace mit veröffentlicht würde. O.g. gibt aber bereits DB-Username und DB-Name aus. Ist das sinnvoll? Oder besser schlicht:
<h1>Keine Verbindung mit der Datenbank möglich</h1>.. bitte schicken sie eine Mail an mich@example.com.
Gruß
jobo
Moin!
Hallo,
http://www.php.net/manual/de/pdo.connections.php
schlägt im catchblock vor:
print "Error!: " . $e->getMessage() . "<br/>";
Nein, "vorschlagen" würde ich das nicht nennen. "Demonstrieren der einfachsten Methode, die Sinnvolles tut im Sinne eines Beispiels" wäre zutreffender.
Und schreibt, dass sonst u.U. auch das Passwort im Backtrace mit veröffentlicht würde. O.g. gibt aber bereits DB-Username und DB-Name aus. Ist das sinnvoll? Oder besser schlicht:
<h1>Keine Verbindung mit der Datenbank möglich</h1>.. bitte schicken sie eine Mail an mich@example.com.
Es ist niemals sinnvoll, den User einer Live-Installation einer Website mit Dingen zu belästigen, die ihn weder etwas angehen, noch die er korrigieren kann.
Sinnvoll ist, den Request beim Scheitern der DB-Connection mit HTTP-Status "500 Internal Server Error" zu beantworten (für die Suchmaschinen etc.), eine allgemeine Unverfügbarkeitsmeldung mitzuschicken (keine Details), und dafür zu sorgen, dass der Admin informiert wird. Wie das im Detail geschieht, ist offen.
Du willst vermutlich nicht bei JEDEM fehlgeschlagenen Request direkt eine Mail losschicken, weil sonst dein Postfach schnell gefüllt ist. Schlau ist eine Monitoring-Lösung wie z.B. Nagios, die regelmäßig die Verfügbarkeit von Dingen prüft und ggf. Benachrichtigungen über Statusveränderung losschickt.
- Sven Rautenberg