2016-04-20 20 views
0

Warum bei ersten Server einen solchen Code auf Update gesetzt „00-00-00 00:00:00“ und am 2d gesetzt aktuelle ZeitMysql pdo unterschiedliches Verhalten bei 2 Servern

$pdo = new PDO; 
$sth = $pdo->prepare("INSERT INTO `tbl_process` 
         SET `good` = :good, `type` = :type, `pid` = :pid, `time` = :time 
         ON DUPLICATE KEY UPDATE `time` = :time"); 
$sth->bindParam(':good', $good); 
$sth->bindParam(':type', $type); 
$sth->bindParam(':pid', $pid); 
$sth->bindParam(':time', $time); 
$sth->execute(); 

wenn ich Code ändern zu dies (add: time2) - ich bekomme die richtige Zeit in beiden Fällen

$pdo = new PDO; 
$sth = $pdo->prepare("INSERT INTO `tbl_process` 
         SET `good` = :good, `type` = :type, `pid` = :pid, `time` = :time 
         ON DUPLICATE KEY UPDATE `time` = :time2"); 
$sth->bindParam(':good', $good); 
$sth->bindParam(':type', $type); 
$sth->bindParam(':pid', $pid); 
$sth->bindParam(':time', $time); 
$sth->bindParam(':time2', $time); 
$sth->execute(); 
+1

Ist die Emulation aktiviert? 'Sie können eine benannte Parametermarkierung mit dem gleichen Namen nicht mehr als einmal in einer vorbereiteten Anweisung verwenden, es sei denn, der Emulationsmodus ist aktiviert. '-http: //www.php.net/manual/en/pdo.prepare.php – chris85

+0

Stellen Sie sicher, dass Sie konfigurieren PDO, um nützliche Ausnahmen auszulösen. In der Standardeinstellung wird außer bei der ersten Verbindung automatisch ein Fehler ausgegeben. Siehe: http://php.net/manual/de/pdo.error-handling.php. – Mike

Antwort

-3

PDO hat drei Fehlerbehandlungsmodi.

PDO :: ERRMODE_SILENT verhält sich wie mysql_ * wo Sie jedes Ergebnis überprüfen müssen und dann auf $ db-> errorInfo(); um die Fehlerdetails zu erhalten. PDO :: ERRMODE_WARNING löst PHP-Warnungen aus PDO :: ERRMODE_EXCEPTION löst PDOException aus. Meiner Meinung nach ist dies der Modus, den Sie verwenden sollten. Es verhält sich sehr ähnlich oder stirbt (mysql_error()); Wenn es nicht gefangen, aber anders als oder stirbt(), kann die PDOException korrekt abgefangen und behandelt werden, wenn Sie dies tun.

Erste der Last Insert Id

<?php 
$result = mysql_query("INSERT INTO table(firstname, lastname) VALUES('John', 'Doe')") or die("Insert Failed ".mysql_error()); 
$insert_id = mysql_insert_id(); 

Bisher haben wir nur einfache Aussagen gezeigt, dass in allen Variablen nicht nehmen. Dies sind einfache Anweisungen und PDO hat die Shortcut-Methoden Abfrage für SELECT-Anweisungen und Exec für INSERT, UPDATE, DELETE-Anweisungen. Für Anweisungen, die variable Parameter verwenden, sollten Sie gebundene Parametermethoden verwenden, um Ihre Abfragen sicher auszuführen. Betrachten Sie den folgenden mysql_ * -Code.

+1

Dies beantwortet die Frage nicht und ist nach dem letzten Satz auch unvollständig. – Mike

+1

OP verwendet 'PDO', warum zurück zu' mysql_' gehen? Dies betrifft auch nicht die Frage, die das OP hat. – chris85

0

Platzhalter müssen innerhalb einer Abfrage UNIQUE sein. Sie dürfen sie nicht erneut verwenden:

SET `good` = :good, `type` = :type, `pid` = :pid, `time` = :time 
                  ^^^^^ 
    ON DUPLICATE KEY UPDATE `time` = :time"); 
            ^^^^^ 

Die zweite Abfrage funktioniert, weil Sie einen anderen Platzhalternamen verwendet haben.

+0

Sie lesen die Frage nicht aufmerksam – yeryr

+0

und haben Sie diese Lösung sogar versucht? Sie haben einen Platzhalter erneut verwendet, der nicht zulässig ist. –

Verwandte Themen