在我们的地方,我们使用mysqli和PDO来处理准备好的语句和事务支持。有些项目使用其中一种,有些使用另一种。我们几乎不可能迁移到另一个RDBMS。

我更喜欢PDO,原因只有一个,它允许对预处理语句使用命名参数,而据我所知mysqli不允许。

当我们合并我们的项目只使用一种方法时,选择其中一种作为标准是否还有其他优点和缺点?


当前回答

如果你的站点/web应用真的变得很简单,PDO将使它更容易扩展,因为你可以每天设置主连接和从连接,在数据库中分配负载,加上PHP正朝着PDO作为标准的方向发展。

PDO信息

扩展Web应用程序

其他回答

PDO是标准,它是大多数开发人员希望使用的。mysqli本质上是针对特定问题的定制解决方案,但它具有其他特定于dbms的库的所有问题。PDO是所有努力工作和聪明思维的归宿。

如果你的站点/web应用真的变得很简单,PDO将使它更容易扩展,因为你可以每天设置主连接和从连接,在数据库中分配负载,加上PHP正朝着PDO作为标准的方向发展。

PDO信息

扩展Web应用程序

PDO有一件事,MySQLi没有,我真的很喜欢的是PDO的能力,返回一个结果作为一个指定类类型的对象(例如$ PDO ->fetchObject('MyClass'))。MySQLi的fetch_object()将只返回一个stdClass对象。

关于PDO的另一个值得注意的(好的)区别是,它的PDO::quote()方法自动添加外围引号,而mysqli::real_escape_string()(和类似的)不会:

PDO::quote()在输入字符串周围放置引号(如果需要)和 使用引号转义输入字符串中的特殊字符 适合底层驱动程序的样式。

嗯,你可以反驳面向对象方面,准备好的语句,它成为标准的事实,等等。但我知道大多数情况下,使用杀手级功能更能说服别人。就是这样:

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();
}