在我们的地方,我们使用mysqli和PDO来处理准备好的语句和事务支持。有些项目使用其中一种,有些使用另一种。我们几乎不可能迁移到另一个RDBMS。
我更喜欢PDO,原因只有一个,它允许对预处理语句使用命名参数,而据我所知mysqli不允许。
当我们合并我们的项目只使用一种方法时,选择其中一种作为标准是否还有其他优点和缺点?
在我们的地方,我们使用mysqli和PDO来处理准备好的语句和事务支持。有些项目使用其中一种,有些使用另一种。我们几乎不可能迁移到另一个RDBMS。
我更喜欢PDO,原因只有一个,它允许对预处理语句使用命名参数,而据我所知mysqli不允许。
当我们合并我们的项目只使用一种方法时,选择其中一种作为标准是否还有其他优点和缺点?
当前回答
就我个人而言,我使用PDO,但我认为这主要是一个偏好问题。
PDO有一些特性可以帮助防止SQL注入(准备好的语句),但是如果你小心使用SQL,你也可以用mysqli实现。
迁移到另一个数据库并不是使用PDO的原因。只要你不使用“特殊的SQL特性”,你就可以从一个DB切换到另一个DB。然而,只要你使用例如“SELECT…”你不能去MS-SQL,它是“SELECT TOP 1…”所以这是有问题的。
其他回答
PDO有一件事,MySQLi没有,我真的很喜欢的是PDO的能力,返回一个结果作为一个指定类类型的对象(例如$ PDO ->fetchObject('MyClass'))。MySQLi的fetch_object()将只返回一个stdClass对象。
PDO是标准,它是大多数开发人员希望使用的。mysqli本质上是针对特定问题的定制解决方案,但它具有其他特定于dbms的库的所有问题。PDO是所有努力工作和聪明思维的归宿。
就我个人而言,我使用PDO,但我认为这主要是一个偏好问题。
PDO有一些特性可以帮助防止SQL注入(准备好的语句),但是如果你小心使用SQL,你也可以用mysqli实现。
迁移到另一个数据库并不是使用PDO的原因。只要你不使用“特殊的SQL特性”,你就可以从一个DB切换到另一个DB。然而,只要你使用例如“SELECT…”你不能去MS-SQL,它是“SELECT TOP 1…”所以这是有问题的。
在执行速度方面,MySQLi胜出,但除非你有一个使用MySQLi的良好包装器,否则它的函数处理预处理语句是很糟糕的。
我的还有些bug,但如果有人想要的话,给你。
所以简而言之,如果你正在寻找一个速度增益,那么MySQLi;如果你想要易用性,那么PDO。
嗯,你可以反驳面向对象方面,准备好的语句,它成为标准的事实,等等。但我知道大多数情况下,使用杀手级功能更能说服别人。就是这样:
PDO的一个优点是你可以获取数据,自动将其注入到一个对象中。如果你不想使用ORM(因为它只是一个快速脚本),但你喜欢对象映射,它真的很酷:
class Student {
public $id;
public $first_name;
public $last_name
public function getFullName() {
return $this->first_name.' '.$this->last_name
}
}
try
{
$dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)
$stmt = $dbh->query("SELECT * FROM students");
/* MAGIC HAPPENS HERE */
$stmt->setFetchMode(PDO::FETCH_INTO, new Student);
foreach($stmt as $student)
{
echo $student->getFullName().'<br />';
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}