c11k / pdo
用于从小型PHP项目迁移MySQLi到PDO的简单PDO类
Requires
- php: ^7.1
Requires (Dev)
- phpstan/phpstan: ^0.9.1
- phpunit/dbunit: ^4.0
- phpunit/phpunit: ^7.4
- squizlabs/php_codesniffer: 3.0.2
README
您可以使用这个小型类从后端或前端项目查询您的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);