我确信我需要迁移到 PDO 并且正在努力完成。到目前为止,我有两个问题...
(1) 使用准备好的语句总是合适的吗?如果我只想列出一个表中的一组或多个记录,而该表上只有一个查询,该怎么办?准备好的语句不会减慢第一个查询的速度吗?
(2) 假设我有一个包含 10 个字段的表。我可以声明一个只有六个字段的类,然后使用 PDO::FETCH_CLASS, "foo" 其中 "foo" 是我的缩写类吗?
差异被认为可以忽略不计。真的。没有人报告过由准备好的语句引起的性能问题(尽管,真正使用它们的人太少了,不仅告诉其他人使用它们,而且无论如何)。
如果这个想象中的问题仍然困扰您太多,PDO 为您提供了一种模拟模式,当没有使用真正的准备并且只执行一次到数据库的往返时,就好像根本没有使用准备好的语句一样。同样安全。
所以 - 是的,总是使用准备好的语句。只要养成它的习惯。
我发现这种愚蠢的语法糖FETCH_CLASS
毫无用处,我自己也从未使用过。然而,如果您要求获得懒惰并使用*
而不是手动列出所有六个必填字段的权限 - 为什么不试试看呢?
磁贴上的注释: 虽然没有技术原因来替换mysqli(因为这个改进的 mysql 库被认为与 PDO 一样好),但是,因为您很可能会在应用程序代码中使用原始 API 调用,所以 PDO 确实是一种方式更好地替代旧的 mysql ext
我认为尽可能优先考虑准备好的语句是一种很好的做法。我在公司的一个大流量项目 (*) 中使用了 PDO,我们发现调用 likerequire_once
比 PDO 查询更成问题(至少在我们的架构中)。
是的,但其他 4 个字段仍然可用。例如:
class Foo {
private $col1;
private $col2;
public static function findAll()
{
$pdo = new PDO(...);
$query = $pdo->prepare('SELECT * FROM foo');
$query->execute();
return $query->fetchAll(PDO::FETCH_CLASS, 'Foo');
}
}
print_r(Foo::findAll());
假设表 'foo' 有 col1、col2、col3 和 col4 列,那么上面的代码将导致:
Array
(
[0] => Foo Object
(
[col1:Foo:private] => 1
[col2:Foo:private] => 2
[col3] => 3
[col4] => 4
)
...
)