Heim  >  Artikel  >  Backend-Entwicklung  >  Erfahren Sie in einer Minute mehr über vorbereitete Anweisungen und Transaktionen in PHP

Erfahren Sie in einer Minute mehr über vorbereitete Anweisungen und Transaktionen in PHP

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-06-16 14:58:192237Durchsuche

Dieser Artikel stellt Ihnen vorbereitete Anweisungen und Transaktionen in PHP vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Erfahren Sie in einer Minute mehr über vorbereitete Anweisungen und Transaktionen in PHP

PDO-Operationen in PHP lernen (2) Vorbereitete Anweisungen und Transaktionen

Im heutigen Artikel erfahren Sie kurz etwas über die Verwendung vorbereiteter Anweisungen und Transaktionen in PDO. Sie befinden sich alle in PDO. Die Operationen unter dem Objekt sind nicht kompliziert und einfache Anwendungen lassen sich leicht umsetzen. Aber in den meisten Fällen verwendet jeder Rahmen und es gibt nur sehr wenige Möglichkeiten für handschriftliches Schreiben.

Vorbereitete Anweisungsfunktion

Eine vorbereitete Anweisung dient dazu, eine auszuführende Anweisung vorzubereiten und dann ein PDOStatement-Objekt zurückzugeben. Im Allgemeinen verwenden wir die Methodeexecute() des PDOStatement-Objekts, um diese Anweisung auszuführen. Warum heißt es Vorverarbeitung? Weil es uns ermöglicht, diese Anweisung mehrmals aufzurufen und die Feldbedingungen in der Anweisung durch Platzhalter zu ersetzen. Im Vergleich zur direkten Verwendung von query() oder exec() mit PDO-Objekten ist die Vorverarbeitung effizienter und ermöglicht es dem Client/Server, Abfragen und Metainformationen zwischenzuspeichern. Der wichtigere Punkt ist natürlich, dass die Verwendung von Platzhaltern grundlegende SQL-Injection-Angriffe wirksam verhindern kann. Ich glaube, dass wir dieses Problem nicht manuell in Anführungszeichen setzen können Auch eine der häufigsten Fragen, die wir in Vorstellungsgesprächen sehen.

// 使用 :name 形式创建一个只进游标的 PDOStatement 对象
$stmt = $pdo->prepare("select * from zyblog_test_user where username = :username", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

var_dump($stmt);
// object(PDOStatement)#2 (1) {
//     ["queryString"]=>
//     string(57) "select * from zyblog_test_user where username = :username"
//   }

$stmt->execute([':username' => 'aaa']);
$aUser = $stmt->fetchAll();

$stmt->execute([':username' => 'bbb']);
$bUser = $stmt->fetchAll();

var_dump($aUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "1"
//       [0]=>
//       string(1) "1"
//       ["username"]=>
//       string(3) "aaa"
//       ……

var_dump($bUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "2"
//       [0]=>
//       string(1) "2"
//       ["username"]=>
//       string(3) "bbb"
//       ……

Der erste Parameter der Prepare()-Methode ist die SQL-Anweisung, die wir ausführen müssen. In diesem Code verwenden wir einen Platzhalter in der Form :xxx, also im PDOStatement-Objekt, das durch den Aufruf der Prepare()-Methode zurückgegeben wird Beim Ausführen der Methodeexecute() müssen wir den Wert des Platzhalters angeben. Im Code verwenden wir diese SQL-Anweisung, um zwei Abfragen zu implementieren, indem wir unterschiedliche Platzhalterinhalte ersetzen. Der zweite Parameter der

prepare()-Methode ist der Eigenschaftssatz für das zurückgegebene PDOStatement-Objekt. Übliche Verwendung ist: Wenn Sie PDO::ATTR_CURSOR auf PDO::CURSOR_SCROLL setzen, erhalten Sie einen scrollbaren Cursor.

Einige Treiber verfügen über Optionen auf Treiberebene, die während der Vorbereitung festgelegt werden. PDO::ATTR_CURSOR ist der Typ, der den Datenbankcursor setzt, und PDO::CURSOR_FWDONLY bedeutet, ein PDOStatement-Objekt zu erstellen, das nur den Cursor vorrückt. Dies ist die Standard-Cursoroption, da dieser Cursor der schnellste und gebräuchlichste Datenzugriffsmodus in PHP ist. Für Kenntnisse über Datenbankcursor können Sie die relevanten Inhalte selbst überprüfen.

Darüber hinaus kann PDOStatement auch Platzhalterdaten über die Methode bindParam() binden. Wir werden in den folgenden Artikeln weiter lernen, die sich auf PDOStatement-Objekte beziehen.

Als nächstes schauen wir uns die Verwendung des ?-Platzhalters zum Implementieren der Abfrage an. Der ?-Platzhalter wird beim Binden in Form eines Indexes gebunden.

// 使用 ? 形式创建一个只进游标的 PDOStatement 对象
$stmt = $pdo->prepare("select * from zyblog_test_user where username = ?", [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

$stmt->execute(['aaa']);
$aUser = $stmt->fetchAll();

var_dump($aUser);
// array(1) {
//     [0]=>
//     array(8) {
//       ["id"]=>
//       string(1) "1"
//       [0]=>
//       string(1) "1"
//       ["username"]=>
//       string(3) "aaa"
//       ……

Natürlich ist diese Art von vorkompilierter Anweisung nicht auf Abfrageanweisungen beschränkt. Sie kann hinzugefügt, gelöscht oder geändert werden und unterstützt auch Platzhalter. Vorbereitete Anweisungen zum Bearbeiten von Datenbanken in PHP Dieser Artikel enthält detaillierte Beispiele.

Transaktionsfähigkeit

Jeder muss über ein gewisses Verständnis von Transaktionen verfügen, daher werde ich hier keine spezifischen Konzepte vorstellen. Schauen wir uns nur an, wie Transaktionen in PDO implementiert werden. Schauen wir uns zunächst an, was passiert, wenn keine Transaktionen stattfinden.

$pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)"); // 成功插入

$pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 报错停止整个PHP脚本执行
// Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist

Angenommen, diese beiden Tabellen müssen gleichzeitig aktualisiert werden, aber die zweite Anweisung meldet einen Fehler. Ohne eine Transaktion wird unser erstes Datenelement normal erfolgreich eingefügt, was nicht das Ergebnis ist, das wir benötigen. Zu diesem Zeitpunkt benötigen wir die Hilfe von Transaktionsfunktionen, damit wir dafür sorgen können, dass die beiden Tabellen gleichzeitig erfolgreich sind oder fehlschlagen.

try {
    // 开始事务
    $pdo->beginTransaction();

    $pdo->exec("insert into tran_innodb (name, age) values ('Joe', 12)");
    $pdo->exec("insert into tran_innodb2 (name, age) values ('Joe', 12)"); // 不存在的表

    // 提交事务
    $pdo->commit();
} catch (Exception $e) {
    // 回滚事务
    $pdo->rollBack();
    // 输出报错信息
    echo "Failed: " . $e->getMessage(), PHP_EOL;
    // Failed: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.tran_innodb2' doesn't exist
}

Die erste ist die Methode beginTransaction(), mit der die automatische Übermittlung der Datenbank deaktiviert und eine Transaktion gestartet wird. Nach dieser Methode wird die Transaktion erst geschlossen, nachdem die Methode commit() oder rollBack() aufgetreten ist. Die Methode

commit() dient dazu, alle Datenoperationen nach beginTransaction() zu packen und zu übermitteln, wenn es während der Operation zu keinen Unfällen kommt.

rollBack() dient dazu, Daten zurückzusetzen, wenn nach beginTransaction() ein Problem mit einer Anweisung oder einem Code auftritt, wird die vorherige Datenoperation zurückgesetzt, um sicherzustellen, dass alle Anweisungen nach beginTransaction() entweder erfolgreich sind oder fehlschlagen.

Drei einfache Funktionen wie diese vervollständigen für uns den gesamten Transaktionsvorgang. Wir werden die eingehende Untersuchung von Transaktionen in Zukunft diskutieren, wenn wir MySQL eingehend untersuchen. Hier müssen wir beachten, dass es für das PDO-Objekt am besten ist, den Fehlermodus anzugeben, um eine Ausnahme auszulösen. Wenn der Fehlermodus nicht angegeben ist, werden Fehler in der Transaktion nicht direkt gemeldet, sondern es wird ein Fehlercode zurückgegeben. Wir müssen den Fehlercode verwenden, um zu bestimmen, ob ein Commit oder ein Rollback durchgeführt werden soll. Dies ist weit weniger prägnant und intuitiv als der Ausnahmemechanismus.

总结

我们简单的梳理并学习了一下 PDO 中的预处理和事务相关的知识,接下来就要进入 PDOStatement 对象相关内容的学习。PDOStatement 对象就是 PDO 的预处理对象,也就是在日常开发中我们会接触到的最多的数据操作对象。这块可是重点内容,大家可不能松懈了哦!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E7%9A%84PDO%E6%93%8D%E4%BD%9C%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%BA%8C%EF%BC%89%E9%A2%84%E5%A4%84%E7%90%86%E8%AF%AD%E5%8F%A5%E5%8F%8A%E4%BA%8B%E5%8A%A1.php

推荐学习:php视频教程

Das obige ist der detaillierte Inhalt vonErfahren Sie in einer Minute mehr über vorbereitete Anweisungen und Transaktionen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen