12

是否可以在 PHP 中使用带有 sqlite3 驱动程序的事务(和回滚)?我在这里找不到信息:http: //de2.php.net/manual/en/book.sqlite3.php

我不想使用 PDO...

谢谢你的帮助

4

3 回答 3

27

是的,即使没有 PDO,也可以进行事务和回滚。令人惊讶的是,要找到一个解释如何做到这一点的例子是多么困难。必须深入研究一些现成的代码才能找到答案。

$db=new MyDB("database.db", SQLITE3_OPEN_READWRITE);

$db->exec('BEGIN;');

$stmt=$db->prepare('UPDATE table SET name = :name WHERE id = :id');
$stmt->bindValue(':id', $id, SQLITE3_INTEGER);
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->execute();

$db->exec('COMMIT;');

逻辑来源:sombra2eternity,“MyDB”来源:php.net

于 2015-06-30T12:19:02.327 回答
7

只需执行适当的SQL 命令: BEGIN/COMMIT/ROLLBACK

于 2013-08-15T19:39:46.330 回答
0

对上述 F-3000 答案的简短扩展。如果您创建自己的类,您也可以编写自己的包装函数。例如:

class MyDB extends SQLite3 {

  public function __construct(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey = '') {
    parent::__construct($filename, $flags, $encryptionKey);
    $this->exec('PRAGMA busy_timeout = 9900');
    $this->exec('PRAGMA encoding = "UTF-8"');
    // more pragmas ...
  }

  public function enum(string $table, string $key, string $value) {
    $enum = array();
    $sql = "select distinct $table.$key, $table.$value
      from $table
      where $table.$key is not null";
    if ($key !== $value) {
      $sql .= "
        and $table.$value is not null";
    }
    $sql .= "
      order by null";
    $result = $this->query($sql);
    if ($result !== false) {
      $row = $result->fetchArray(SQLITE3_NUM);
      while ($row !== false) {
        $enum[$row[0]] = $row[1];
        $row = $result->fetchArray(SQLITE3_NUM);
      }
    }
    return $enum;
  }

  public function begin() {
    $this->exec('BEGIN');
  }

  public function commit() {
    $this->exec('COMMIT');
  }

  public function rollback() {
    $this->exec('ROLLBACK');
  }

  // more functions ...

} // MyDB //
于 2021-06-15T08:59:11.137 回答