jobo: PDO - wie herausbekommen, dass uniquer Datensatz doppelt

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

  1. 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

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Whatever you do, don't congratulate yourself too much, or berate yourself either. Your choices are half chance. So are everybody else's.  --  Mary Schmich (Chicago Tribune; 1997); Baz Luhrmann (1999), see http://en.wikipedia.org/wiki/Wear_Sunscreen
    1. 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

      1. 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

        1. 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

          1. 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

        2. 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

  2. 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

    1. 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