php中连接mysql时,pdo和mysqli各有优劣,选择取决于具体需求。pdo支持多种数据库(如sqlite、oracle),而mysqli仅支持mysql;两者都提供预处理语句以防止sql注入。若需跨数据库兼容性或面向对象风格,选pdo;若仅需mysql且偏好过程式编程,选mysqli。

PDO支持哪些数据库类型
PDO支持包括MySQL、SQLite、Oracle在内的多种数据库驱动,通过统一接口操作不同数据库。例如,使用PDO::MYSQL连接MySQL,PDO::SQLITE连接SQLite。这种灵活性使代码更易迁移,但需注意特定数据库的方言差异。

<?php // PDO示例:连接MySQL
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([1]);
$user = $stmt->fetch();
print_r($user);
?>
预期结果:输出ID为1的用户数组,如Array ( [id] => 1 [name] => John )。验证:$pdo->getAttribute(PDO::ATTR_DRIVER_NAME)返回'mysql',确认驱动正确。
MySQLi如何防止SQL注入
MySQLi通过预处理语句和参数绑定有效防止SQL注入。例如,使用mysqli_prepare()创建语句,mysqli_bind_param()绑定参数,确保用户输入被安全处理。相比拼接字符串,此方法避免恶意代码执行。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。

<?php // MySQLi示例:预处理防注入
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$stmt = $mysqli->prepare('SELECT * FROM users WHERE name = ?');
$name = 'John';
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
print_r($row);
?>
预期结果:输出名称为'John'的用户关联数组,如Array ( [id] => 1 [name] => John )。验证:$stmt->error为空,表示无错误;若输入' OR '1'='1,查询仍安全返回空或匹配记录,不引发注入。
当使用PDO连接SQLite时会发生什么
当使用PDO连接SQLite时,程序会创建本地SQLite数据库文件并执行查询,无需网络配置。例如,new PDO('sqlite:test.db')自动初始化文件,适合轻量级应用。但需注意SQLite的并发限制和事务行为。
<?php // PDO连接SQLite示例
$pdo = new PDO('sqlite:test.db');
$pdo->exec('CREATE TABLE IF NOT EXISTS logs (id INTEGER PRIMARY KEY, msg TEXT)');
$pdo->prepare('INSERT INTO logs (msg) VALUES (?)')->execute(['Test']);
$stmt = $pdo->query('SELECT * FROM logs');
while ($row = $stmt->fetch()) {
print_r($row);
}
?>
预期结果:输出日志记录,如Array ( [id] => 1 [msg] => Test )。验证:$pdo->getAttribute(PDO::ATTR_DRIVER_NAME)返回'sqlite',确认连接成功;文件test.db生成,包含表结构。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










