Wie kann ich die Verwendung von vorbereiteten Anweisungen in Kombination mit Transaktionen mit PHP?

Mein Ziel ist die Verwendung einer Transaktion und eine vorbereitete Anweisung gleichzeitig zu erreichen sowohl die Integrität der Daten und die Verhinderung von SQL-injection.

Habe ich dieses:

   try {
        $cnx = new PDO($dsn,$dbuser,$dbpass);   
        $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $cnx->beginTransaction();
        $cnx->query("SELECT * FROM users WHERE username=$escaped_input");
        $cnx->query("SELECT * FROM othertable WHERE some_column=$escaped_input_2");

        $cnx->commit();
    }

    catch (Exception $e){
           $cxn->rollback();
           echo "an error has occured";

    }

Möchte ich integrieren Sie die Abfrage so, als würde man mit einer vorbereiteten Anweisung:

$stmt=$cxn->prepare("SELECT * FROM users WHERE username=?");
$stmt->execute(array($user_input));

$stmt_2=$cxn->prepare("SELECT * FROM othertable WHERE some_column=?");
$stmt_2->execute(array($user_input_2));

Wie kann ich das erreichen?

Bearbeiten

Bekomme ich diesen Fehler:

PHP Parse error: syntax error, unexpected T_CATCH

Hier ist meine aktuelle code:

try 
{
    $cnx = new PDO($dsn,$dbuser,$dbpass);   
    $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $cnx->beginTransaction();
    $stmt=$cnx->prepare("SELECT * FROM users WHERE username=?");
    $stmt->execute(array($username));

    $cnx->commit();

    while ($row=$stmt->fetch(PDO::FETCH_OBJ)){
    echo $stmt->userid;

}

catch(Exception $e) { 
    if (isset($cnx)) 
        $cnx->rollback();
       echo "Error:  " . $e; 
    }
  • Können Sie noch einmal die Frage?
  • Nein, weil ich nicht weiß, was zu tun commit() und execute() weil Sie zu tun in etwa das gleiche
  • Nein, "commit" und "ausführen" nicht "tun ungefähr das gleiche" 😉
  • Ich erwartete diese Antwort, ich wurde gefragt, für die es.. :), Was macht commit zu tun? Ich dachte, es eingereicht/ausgeführt, alle Anfragen insgesamt
  • Bitte Lesen Sie meine ursprüngliche Antwort weiter unten 🙂 Es sollte auch erläutern Sie den Unterschied zwischen "autocommit" (das könnte auch die Quelle der Verwirrung) und "begin tran/commit". Außerdem sollten Sie leicht in der Lage sein, beide wählt in der gleichen Anweisung (ohne Transaktion überhaupt).
  • Hallo, vielen Dank für Ihre Antwort. Eigentlich benutze ich SELECT-Anweisung nur für den sake des Beispiels, aber ich möchte in der Lage sein, um 2 oder 3 UPDATE-Anweisungen innerhalb einer Transaktion. Grüße
  • Ihnen fehlt eine geschweifte Klammer der WHILE-Anweisung am Ende

InformationsquelleAutor alexx0186 | 2012-05-17
Schreibe einen Kommentar