访问数据库
在 PHP 中访问数据有两种方法:
- 使用数据库特定的拓展
- 使用不受数据库约束的 PDO ( PHP 数据对象)库
如果使用数据库特定的扩展,你的代码会和你所使用的数据库密切相关。也就是说你先把数据库从 MySQL 迁移到 PostgreSQL ,会引起代码的重大改动。而 PDO ,用一个抽象层为你隐藏了数据库特定的函数,因此在数据库系统间进行迁移,改变程序或 php.ini 文件中的一行代码这么简单。但是这种可移植性也是有代价的。使用 PDO 的代码会比使用原生数据库特定扩展的代码在执行速度上慢一点。
需要注意的是,抽象层并不能保证你的 SQL 语句是真正可移植的。如果你的应用使用了任何非泛型的 SQL ,那么在数据库迁移时你不得不对 SQL 语句进行重大改造。
PDO ( PHP 数据对象)
连接
$db = new PDO($dsn, $username, $password);
$db = new PDO("mysql:host=localhost;bdname=text", "username", "password");
数据库交互
使用 query()
函数
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');
$result = $db->query("select * from users");
foreach($result as $row){
print_r($row);
}
$result = null; // 释放结果集对象
预处理语句
先使用预处理函数 prepare()
,在运行执行函数 execute()
。
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');
$result = $db->prepare("select * from users");
$result->execute();
while ($row = $result->fetch()) {
print_r($row);
}
$result = null; // 释放结果集对象
利用占位符来进行重复插入
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');
$statement = $db->prepare("insert into posts (title, body) values (:title, :body)");
$statement->execute([
'title' => 'What is PHP?',
'body' => 'best language'
]);
$db = null;
也可以使用位置占位符(不命名),用 ? 标志。
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');
$statement = $db->prepare("insert into posts (title, body) values (?, ?)");
$statement->execute([