2016-06-21 5 views
-1

Ich habe ein PDO-Transaktionsskript, das nicht funktioniert.PDO Transaktion wird nicht in die Datenbank geschrieben

Ich öffne die Verbindung mit:

<?php 
$DBhost="localhost"; 
$DBuser="userid"; These are set properly 
$DBpassword="password"; These are set properly 

try { 
    # MySQL with PDO_MYSQL 
    $conn = new PDO("mysql:host=$DBhost; charset=utf8", $DBuser, $DBpassword); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

ich dann eine Reihe von SQL-Anweisungen erstellen, die ich habe ausgeführt müssen. Sie alle funktionieren ordnungsgemäß, wenn sie manuell in phpMyAdmin ausgeführt werden.

So, hier ist meine Transaktionscode:

try { 
    echo "size of sql = " . sizeof($sql) . "<br />"; 
    $conn->beginTransaction(); 
    for($i=0; $i<sizeof($sql); $i++){ 
     $stmt = $conn->prepare($sql[$i]); 
     $stmt->execute($sql[$i]); 
     echo "executing " . $sql[$i] . "<br />\r\n"; 
    } 
    $conn->commit(); 
    $message = "Player successfully updated !!"; 
    $json = array('status' => 'success', 'message' => $message); 
    $json_data = json_encode($json); 
    echo $json_data; 
    return; 

} catch (PDOException $e) { 
    $conn->rollback(); 
    $message = "Could not process transaction. Error:" . $e->getMessage(); 
    $json = array('status' => 'failure', 'message' => $message); 
    $json_data = json_encode($json); 
    echo $json_data; 
    return; 
} 

Dies erzeugt die folgende Ausgabe:

size of sql = 7 
executing INSERT INTO bowlingt_lg_shared.player_changes (change_date, change_text) VALUES ('2016-06-21', 'Player ID # 1812(Brady Jr., Tom - LB - MIN) name had changed from Brady Jr., Tom to Brady, Tom') 
executing INSERT INTO bowlingt_lg_shared.player_changes (change_date, change_text) VALUES ('2016-06-21', 'Player ID # 1812(Brady Jr., Tom - LB - MIN) tm_id had changed from 9022 to 9003') 
executing INSERT INTO bowlingt_lg_shared.player_changes (change_date, change_text) VALUES ('2016-06-21', 'Player ID # 1812(Brady Jr., Tom - LB - MIN) pos had changed from LB to QB') 
executing INSERT INTO bowlingt_lg_shared.player_changes (change_date, change_text) VALUES ('2016-06-21', Player ID # 1812 (Brady Jr., Tom - LB - MIN) has changed eligible positions from QB, R, LB, DEF to QB, RB, R, K) 
executing INSERT INTO bowlingt_lg_shared.player_changes (change_date, change_text) VALUES ('2016-06-21', 'Player ID # 1812(Brady Jr., Tom - LB - MIN) active had changed from 0 to 1') 
executing INSERT INTO bowlingt_lg_shared.player_changes (change_date, change_text) VALUES ('2016-06-21', 'Player ID # 1812(Brady Jr., Tom - LB - MIN) tm_abbr had changed from MIN to NE') 
executing UPDATE bowlingt_lg_shared.players SET Name = 'Brady, Tom', tm_id = 9003, pos = 'QB', elig_pos = 'QB, RB, R, K', active = 1 WHERE id = 1812 
{"status":"success","message":"Player successfully updated !!"} 

So ist es denkt, dass es alle SQL-Anweisungen korrekt ausgeführt, aber nicht verarbeitet sie nicht die Datenbank. Ich bin sehr neu in PDO, aber ich habe MySQL & mysqli ohne Probleme seit Jahren verwendet.

Ihre Hilfe wäre willkommen.

+0

'if (! $ Conn-> commit();) { $ message =" Transaktion Commit fehlgeschlagen "); } else {$ message = "Spieler erfolgreich aktualisiert !!";} ' – Alex

+0

Es gibt keine Ausnahme, wenn das Commit fehlgeschlagen ist, nehme ich an. – Alex

+0

Sie sollten nicht sein. Ihre vierte Abfrage enthält keine Anführungszeichen, was zu einem Syntaxfehler führt, der in der Vorbereitungsphase eine Ausnahme auslösen sollte. –

Antwort

0

Ihr Problem liegt in der execute() Anruf. Die Parameter werden nur benötigt, wenn Sie ein Array von Eingabewerten für Parametermarken haben, was Sie nicht tun. Wenn Sie $stmt = $conn->prepare($sql[$i]) aufrufen, ordnet php die korrekte $sql-Anweisung der Variablen $stmt zu, und sie wird bei jedem folgenden Aufruf überschrieben. Ändern Sie wie folgt vor:

$stmt = $conn->prepare($sql[$i]); 
$stmt->execute($sql[$i]); 

zu:

$stmt = $conn->prepare($sql[$i]); 
$stmt->execute(); 

Siehe the manual für weitere Informationen.

-1

ich die Antwort ... gefunden

$stmt->execute($sql[$i]); 

einfach sein muß:

$stmt->execute(); 

, dass das Problem zu lösen schien.

+0

In der Tat brauchen Sie überhaupt nicht ausführen. Führen Sie query() aus, anstatt execute vorzubereiten –

Verwandte Themen