c11k/pdo

此包已弃用且不再维护。未建议替代包。

用于从小型PHP项目迁移MySQLi到PDO的简单PDO类

0.1.3 2018-11-28 22:50 UTC

This package is auto-updated.

Last update: 2024-01-29 03:01:13 UTC


README

pipeline status coverage report

您可以使用这个小型类从后端或前端项目查询您的MySQL服务器。

GitLab上查看。

GitHub分叉。

根据此链接MIT许可证

使用自动加载

composer require c11k/pdo

require_once 'vendor/autoload.php';
$database = new \C11K\Pdo\Database();

配置

类期望5个环境变量,这些变量将按以下方式放置在PDO DSN中

$this->dbh = new \PDO(
    getenv('DB_PREFIX') . 'host=' . getenv('DB_HOST') . ';dbname=' . getenv('DB_NAME'),
    getenv('DB_USER'),
    getenv('DB_PASS')
);

DB_PREFIX应该是已安装和有效的PDO驱动程序之一,包括结尾冒号。目前包括mysql:sqlite:sqlite::memory:pgsql:。如果您需要其他驱动程序,请分叉、添加并创建Pull Request。

如果需要端口号,请添加可选环境变量DB_PORT

用法

插入数据

$database = new \C11K\Pdo\Database();
$sql = "INSERT INTO table (name, lastname) VALUES (:name, :lastname)";
$database->prepare($sql);*/
$database->bind(':name', 'John');
$database->bind(':lastname', 'Doe');
$database->execute();

作为数组

$database = new \C11K\Pdo\Database();
$sql = "INSERT INTO table (name, lastname) VALUES (:name, :lastname)";
$database->prepare($sql);
$database->bindArray([
    ':name' => 'Jane',
    ':lastname' => 'Doe'
]);
$database->execute();

获取插入ID

$database->lastInsertId();

事务

如果您的数据库引擎支持事务,只需简单地调用beginTransaction()endTransaction()。使用cancelTransaction()取消事务。

$database = new \C11K\Pdo\Database();
$database->beginTransaction();
  $sql = "INSERT INTO table (name, lastname) VALUES (:name, :lastname)";
  $database->prepare($sql);
  $database->bind(':name', 'John');
  $database->bind(':lastname', 'Doe');
  $database->execute();

  $database->bind(':name', 'Jane');
  $database->bind(':lastname', 'Smith');
  $database->execute();

  $database->bind(':name', 'Mary');
  $database->bind(':lastname', 'Redford');
  $database->execute();
$database->endTransaction();

获取数据(1行)

$database = new \C11K\Pdo\Database();
$sql = "SELECT * FROM table WHERE name = :name";
$database->prepare($sql);
$database->bind(':name', 'Jenny');
$row = $database->single();     // Note no execute()
echo $row['name'];

获取数据(多行)

$database = new \C11K\Pdo\Database();
$sql = "SELECT * FROM table WHERE lastname = :lastname";
$database->prepare($sql);
$database->bind(':lastname', 'Smith');
$rows = $database->resultSet();
foreach($rows as &$row) {
    echo $row['lastname'];
}

unset($row);

// Or, send a PDO fetch_style:
$rows = $database->resultSet(\PDO::FETCH_NUM);
foreach($rows as &$row) {
    echo $row[2];
}

unset($row);

注意如果您通过引用循环,请确保使用unset销毁引用。有关更多详细信息,请参阅PHP文档

获取行数

返回DELETE、INSERT或UPDATE语句影响的行数。对于大多数数据库,此函数不会返回SELECT语句影响的行数。

`$database->rowCount();`

更新数据

$id = 14;
$sql = "UPDATE table SET name = :name, lastname = :lastname WHERE id = :id";
$database->prepare($sql);
$database->bind(':id', $id);
$database->bind(':name', 'Mary');
$database->bind(':lastname', 'Jane');
$database->execute();

作为数组更新

$id = 14;
$sql = "UPDATE table SET name = :name, lastname = :lastname WHERE id = :id";
$database->prepare($sql);
$database->bindArray(array(
  ':id' => $id,
  ':name' => 'Mary',
  ':lastname' => 'Jane'
));
$database->execute();
$id = 14;
$sql = "UPDATE table SET name = ?, lastname = ? WHERE id = ?";
$database->prepare($sql);
$database->bindArray(array(
  1' => $id,
  2 => 'Mary',
  3 => 'Jane'
));
$database->execute();

删除数据

$id = 14;
$sql = "DELETE FROM table WHERE id = :id";
$database->prepare($sql);
$database->bind(':id', $id);
$database->execute();

从MySQLi迁移

您可以通过更改mysqli_snake_case函数从mysqli_命令迁移到PDO。只需删除`mysqli`部分,然后将剩余的下划线转换为驼峰命名。

mysqli_fetch_assoc()转换为$database->fetchAssoc()mysqli_real_escape_string()转换为$database->realEscapeString()。请注意,mysqli_query($sql)可能转换为$database->rawQuery($sql),并且它将查询直接发送到数据库,而不进行PDO绑定和准备。这适用于将整个代码集从mysqli_迁移到PDO的中间步骤,而不是一次性迁移。

已提醒您,但这是mysqli_query()的方式,所以请仅将其用作迁移步骤,并确保回到代码中完成转换为PDO。尽管如此,您仍然可以跳过中间步骤。这完全取决于您保持现有项目运行的工作量。

  • 首先,将此类添加到代码中作为自动加载。如果您使用composer,您应该已经自动加载了。
  • 根据需要,在配置中添加您的环境变量。
  • $database = new \C11K\Pdo\Database();添加到您的设置脚本中。
  • mysqli_替换为$database->并将下划线转换为驼峰式命名。
    例如,将mysqli_query()替换为$database->rawQuery()。将mysqli_fetch_assoc()替换为$database->fetchAssoc()
  • 然后,遍历您的代码,将rawQuery()替换为query()prepare(),将您的参数转换为命名参数,使用bind()bindArray()绑定参数,并执行。

$sql = "SELECT * FROM users WHERE email = " . $email;
$result = mysqli_query($sql);
while ($row = mysqli_fetch_assoc($result)) {
    // Do stuff
}

mysqli_free_result($results)

$sql = "SELECT * FROM users WHERE email = :email";
$database->prepare($sql);
$database->bind(":email", $email);
$database->execute();
while ($row = $database->fetchAssoc()) {
    // Do Stuff
}

$database->freeResult($results);