* 注意,mysql扩展现在已经弃用,并且将来会被移除。这是因为它古老、充满不良实践并且缺乏一些现代特性。不要使用它来编写新代码。
call_user_func()
?为什么不直接使用$stmt->bind_param()
,这与PDO的$sth->bindParam()
并没有太大区别?肯定不是到处投反对票的理由。 - martinstoeckliPDO
是 "PHP 数据对象"。我主要使用PDO,所以只能就它的优点发表看法:
你问道:
那么 PDO、准备好的语句和 MySQLi 之间有什么区别...
PDO
和 MySQLi
是DB包装器。 "准备好的语句"是一个完全不同的概念。您可以准备一条可执行多次的查询语句,并且正确参数化的语句是SQL注入安全的(虽然可能不是绝对安全)。这也是您应该使用PDO(或MySQLi)的主要原因,但准备好的语句还可以提高查询的清晰度。
/* mysql_* version */
mysql_connect("host");
$query = "SELECT column FROM db1.t1 WHERE id = ";
foreach ($_GET['id'] as $id) {
$id = mysql_real_escape_string($id);
$result = mysql_query($query . "'$id'";
while ($row = mysql_fetch_assoc($result)) {
echo "$row[column]\n";
}
}
//NOTE: it would probably be better to store the resource returned by
//mysql_connect and use that consistently (in query/escape)
/* PDO version */
$pdo = new PDO('mysql:host=HOST', 'user', 'pass');
$query = $pdo->prepare("SELECT column FROM db1.t1 WHERE id = ?";
foreach ($_GET['id'] as $id) {
$query->execute($id);
echo $query->fetch(PDO::FETCH_COLUMN);
}
//Notice that you skip the escape step.
你可以使用MySQLi
实现基本相同的功能,但我更喜欢PDO
的语法。它可能更快,但我也有可能是在胡说八道。还有PEAR MDB2
这个很少被提到,当然还有其它的选择。由于PDO
已经内置了,我会选择使用它。
mysql_xxx
函数,那么我建议您开始转向MySQLi
扩展。您也可以选择使用PDO,但如果您只需要支持一个数据库,那么这样做并没有太大的价值。对于您的目的,我建议您切换到MySQLi,因为这样更容易,并且您不会立即获得PDO的好处。可用于MySQLi的函数与您熟悉的mysql_xx
函数基本相似。通常可以将现有代码直接替换,然后代码应该继续正常工作。所以这是一个好的起点--让您的代码使用mysqli_xxx
而不是mysql_xxx
。如果可能的话,我建议您使用面向对象的语法而不是过程式语法。MySQLi支持两种语法,过程式语法更接近您所熟悉的语法,但面向对象的语法在长期运行中更加灵活,一旦您习惯了它,就不会有太大的区别。一旦您将代码转换为使用MySQLi库,并且您熟悉了基础知识,您就可以开始使用更高级的功能,比如预处理语句。但首先要让自己熟悉基础知识。从我的角度来看,我认为差异并不真正明显(取决于你使用它的目的)。看起来PDO只是一个数据库API,将所有其他数据库API合并成一个。因此,如果您需要连接到MS Sql服务器和MySQL服务器,只需调用PDO API并指定特定数据库的驱动程序即可。我猜测,MySQL中的任何未来功能和能力都只能在PDO中使用。因此,基本上只需使用PDO以确保您可以访问所有最新功能。
PDO的一个重要优势是平台无关性。这意味着您可以在不必重新编写所有函数调用的情况下迁移到不同的DBMS。这通常是Java(通过JDBC)、.Net(ADO)和大多数其他环境中的做法。优点不仅在于您可以切换DBMS,而且还在于您只需要学习一个API。
至于您的问题,PDO层提供了执行预处理语句的功能。预处理语句的思想是为SQL语句的某些部分创建占位符,这些部分直到运行时才能确定。许多学习者最初通过创建字符串形式的SQL来执行mysqli::query($someQuery)。这有很多问题,其中最突出的是易受SQL注入攻击(请参见stackoverflow.com/questions/5315351以获取类似问题和答案)。使用PDO,您可以避免SQL注入以及处理引号、反斜杠等字符所带来的所有问题。最终结果是您的代码更加安全、可读和可预测。
如果您已经知道如何使用mysqli,那么使用PDO并没有太大区别。上面链接的问题和答案展示了使用PDO预处理语句提交查询的示例,应该是一个有用的指南。