MySQL,MySQLi,MySQL准备语句还是PDO?

时间:2011-02-13 13:47:20

标签: php mysql database pdo mysqli

从过去几天开始,我一直在关注与数据库交互的不同方法的大量教程。像旧的MySQL方式,MySQLi,MySQL准备语句,PHP的PDO等。

我仍然是编程的新角色,因为我学习并开始编码已经不到1年了。我不时地努力改进我的代码并遵守Web开发人员定义的标准。现在是时候我觉得我改变了习惯用mysql_connect()和mysql_query()之类的旧MySQL方式与数据库进行交互的方式。

我的生产机器上有以下配置。

  • 安装了MAMP的Mac OSX 10.6
  • PHP版本:5.2.13
  • MySQL客户端版本:5.1.44

您认为我应该使用什么来进行数据库访问?为什么?

  • MySQL的
  • 库MySQLi
  • MySQL准备好的声明
  • PDO

3 个答案:

答案 0 :(得分:3)

不知道什么是MySQL Prepared Statement,但是我坚持用PDO或使用Mysql手工编写的语句。
因为Mysql很熟悉而且PDO比mysqli更好

答案 1 :(得分:1)

这实际上取决于你在做什么。

如果您正在进行大量使用预准备语句的大量查询,则准备语句(通过mysqli或PDO)会很有用。准备好的语句更快,另外你不必担心像使用预准备语句转义数据这样的事情,但它们需要一些代码开销,所以对于一个简单的应用程序,有时候不值得使用预准备语句并使用旧的mysql_ *函数是更容易实现预期目的。

答案 2 :(得分:0)

与直接使用MySQLi相比,PDO for MySQL有几个主要优势。

  1. PDO支持多个数据库后端。如果您的某个客户端请求将应用程序的端口连接到其他数据库,这会有所帮助。
  2. 除了MySQLi支持的位置(?)占位符之外,PDO中的预处理语句还支持命名占位符。
  3. PDO支持一次绑定单个参数,而不是一次绑定所有参数。这允许单步执行参数数组并绑定每个参数,而不必构造一个类型字符串,然后使用call_user_func_array()黑魔法。
  4. PDO通过将数组传递给$stmt->execute()来支持方便的快捷方式,其中每个键的值都作为键绑定到占位符。 (警告:它会将每个值转换为字符串,因此您必须bind one at a time if your statement has a variable LIMIT。这是documented,并且feature request to change this casting to string。{/ li>

    第2项到第4项相结合,使很多更容易以可证明的注射安全方式表达操作员IN的右侧。使用PDO,您可以使用顺序名称(例如[':likeval0'=>$val0, ':likeval1'=>$val1, ':likeval2'=>$val2]))构建关联数组,然后在该数组的右侧安全地构建占位符列表。代码可能如下所示:

    $args = [];
    foreach ($usernames as $n=>$value) {
        $args[":likeval$n"] = $value;
    }
    $list = implode(',', array_keys($args));
    // result is like ':likeval0,:likeval1,:likeval2'
    $stmt = "SELECT * FROM app_users WHERE `username` IN ($list)";
    $stmt = $dbh->prepare($stmt);
    $c = $stmt->execute($args);
    

    MySQLi仅支持?占位符和通过变量参数函数调用的一次性绑定。在MySQLi中,通过对列表中的每个元素使用IN,构造运算符$dbh->escape_string()的右侧实际上要容易得多。如果经过充分测试,这种方法可以安全地防止SQL注入,但会引发一些"Bobby Tables" parameterization purists的红旗。