这个问题已经在这里有一个答案:
- 库MySQLi或PDO -什么利弊? [关闭] 13个答案
我只是完成了PHP的入门课程,并在整个计算器论坛人都建议我改用PDO,预处理语句或mysqli的,我简要地检查了手册,但当中的大部分都在我头上。
我一直在使用mysql_ *函数到目前为止所以这些概念是新的我。 我认为,他们被用来访问和执行数据库的具体行动,但我不知道。
那么究竟是什么PDO,准备语句和库MySQLi的区别,它们有什么不同的功能,完成相同的任务? 他们是在脚本兼容,或者是它“选择一个或其他”? 而最后它提供了最佳的性能?
更新:谢谢你的答案,我会打猎更PDO教程。
仅供参考我还发现以下职位有用:
哪一个是快,重量轻-库MySQLi或PDO
库MySQLi或PDO -什么利弊?
在基层的mysql,mysqli的和PDO扩展名的所有回答我怎么跟数据库的问题? 它们都提供功能和功能连接到数据库,并从它发送和检索数据。 您可以同时建立多个连接到数据库的同时使用他们,但是这通常是无稽之谈。
MYSQL *是一个非常简单的扩展,基本上可以让你连接到数据库,发送SQL查询和其他人并不多。
mysqli的通过添加参数化查询和一些其他的东西混进去改进了这个(顾名思义)。
PDO是抽象的几个数据库驱动器集成到一个封装的延伸,也就是说,它可以让你使用相同的代码连接到MySQL,甲骨文,MS SQL Server和其他一些数据库,而不需要使用数据库特定的扩展或重新编写代码时你(至少在理论上)切换数据库。 它还支持参数化查询。
如果你知道你将要专门使用MySQL中,mysqli的是一个不错的选择。 特别是因为你可以在一个程序的方式使用它,你已经从mysql扩展使用到什么。 如果你不熟悉面向对象的,这是有帮助的。 否则,PDO是面向一个很好的对象,灵活的数据库连接器。
*注意MySQL扩展现在已经过时 ,将在未来某个时候删除 。 这是因为它是古老的,充满了糟糕的做法,缺乏一些现代特色。 不要用它来编写新的代码。
PDO
是“PHP数据对象”。 我主要使用PDO,所以我只能在它的优点发言:
- 工作在很多超过数据库MySQL的只是(可能无所谓你)
- 编译C,所以它的速度更快(据说)
- 准备好的语句(别人有这些,虽然)
- 如此看来喜欢它,所以你可以在这里至少可能会得到很多的帮助
- 各种获取/错误处理模式,你可以设置和动态更改
你问
那么究竟是什么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支持,以及程序的语法将接近你习惯什么,但OO语法是从长远来看更灵活了,真的是没有太大的不同,一旦你习惯了。
一旦你得到了你的代码转换为使用的MySQLi库,你是舒适的基础知识,你就可以开始使用像准备好的发言更先进的功能。 但是,让自己舒服的基础知识第一。
从相同的角度来看,你来了。 从我的角度来看,我不认为差异是真正显着的(取决于你使用它的内容)。 它看起来像PDO是一个简单的数据库的API,合并所有其他数据库的API为一体。 所以,如果你需要连接到一个MS SQL Server和MySQL服务器,你可以简单地呼吁PDO API和指定的驱动程序特定的分贝。 我的猜测也是未来功能和能力在MySQL将只在PDO可用。 所以基本上只使用PDO,以确保您能够获得所有最新功能。
PDO的一个大优势是平台独立性。 这意味着你可以迁移到在某一点不同的数据库管理系统,而无需重新编写所有的函数调用。 这是怎么会事通常是在Java中(通过JDBC),净(ADO)和大多数其他环境中完成的。 其优点是不仅是你可以切换DBMS本身,它也是你只有一个API来学习。
至于你的问题,在PDO层提供设施做准备的语句。 预处理语句背后的想法是,你创建的,不会直到运行时知道你的SQL语句的部分占位符。 许多学生通过创建SQL作为被调用的mysqli ::查询($ someQuery)执行的字符串开始。 这是有问题的原因有很多,其中最突出的是易受SQL注入(参见stackoverflow.com/questions/5315351了类似的问题和答案)。 随着PDO,你能避免SQL注入和所有的处理字符,如引号,反斜线等问题,最终的结果是,你的代码更安全,可读性和可预见性。
如果你已经想通了如何使用则mysqli的使用PDO是没有太大的不同。 链接的问题和答案以上示出了使用制备PDO应作为一个有用的导向作用语句被提交的查询的一个例子。
那么究竟是什么PDO,准备语句和库MySQLi的区别,它们有什么不同的功能,完成相同的任务?
所不同的是相当简单的。
PDO是 预处理语句 使用和mysqli的不是 。
只要使用本地预处理语句运行既API一些常用的查询,你会清楚地看到差异。