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()
undexecute()
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
$cxn
->$cnx
?echo $row->userid;
nichtecho $stmt->userid;
. GrüßeRufen Sie einfach "ausführen" nach dem Aufruf von "beginTransaction".
Wo Sie rufen Sie "vorbereiten" ist nicht wirklich wichtig.
Hier ist ein vollständiges Beispiel:
http://php.net/manual/en/pdo.begintransaction.php
BEISPIEL:
PS:
1) ich bin natürlich vorausgesetzt, dass $user_input und $user_input_2 sind ab sofort verfügbar. Sie nicht möchten, dass Ihre Transaktion offen zu unnötig langen 😉
2) Basierend auf Ihren Kommentar Antworten oben, ich denke, man könnte verwirrend sein, "ausführen" und "begin tran/commit". Schauen Sie bitte auf meinen link.
3) haben Sie selbst müssen eine Transaktion? Du bist gerade dabei zwei "select".
4) Schließlich, warum nicht einen "join" (oder union, wenn kompatibel) anstelle von zwei "select"?
Meinst du diesen?
Wird vorausgesetzt, dass die beiden Tabellen Daten keine doppelten Feldnamen, sonst wirst du zu haben, um zu verwenden: