Php 关于PDO和MySQL最佳实践的问题

Php 关于PDO和MySQL最佳实践的问题,php,mysql,pdo,Php,Mysql,Pdo,我有很多关于PDO的问题 我应该只在有参数要绑定时才使用prepare吗?当我需要执行一个简单的查询时,如select*from table order by。。。我应该使用查询吗 当我有更新和删除操作并且需要获得受影响的行数时,我应该使用exec,还是应该使用PDOStatement->rowCount 我应该在插入、更新和删除时使用closeCursor,还是只在需要执行其他选择时使用select $con=NULL;真的要关闭连接吗 将bindParam与foreach结合使用是否有利于多

我有很多关于PDO的问题

我应该只在有参数要绑定时才使用prepare吗?当我需要执行一个简单的查询时,如select*from table order by。。。我应该使用查询吗

当我有更新和删除操作并且需要获得受影响的行数时,我应该使用exec,还是应该使用PDOStatement->rowCount

我应该在插入、更新和删除时使用closeCursor,还是只在需要执行其他选择时使用select

$con=NULL;真的要关闭连接吗

将bindParam与foreach结合使用是否有利于多个插入?我是说性能方面,因为我认为做。。。,。。。同样的插页更好,不是吗

你能给我提供一些关于使用PHP PDO MySQL时性能点的更多信息吗?如果有人有另一个提示,这将是非常有用的

当我在Zend Framework 1.0中开发DB层时,默认情况下,我让它对所有查询都使用prepare/execute。这样做没有什么坏处。*在PHP端有一点开销,但在MySQL端

我的做法是对所有类型的查询使用query,并在更新后调用rowCount。您也可以调用SELECT

如果结果集中有挂起的行,或者在多结果集查询中有挂起的结果集,则CloseCursor在MySQL中很有用。在使用INSERT、UPDATE和DELETE时,不需要这样做

PDO_mysql测试套件使用$con=NULL关闭连接,这是正确的方法。这实际上不会关闭由libmysqlnd管理的持久连接,但这是故意的

一次执行一行准备好的INSERT语句不如执行一个包含多个元组的INSERT语句快。但差别很小。如果要插入大量行,并且性能很重要,那么应该真正使用。有关其他提示,请参见

例如,您可以通过google for PDO MySQL benchmark来查找各种结果。然而,底线是选择PDO和Mysqli并没有明确的赢家。与其他更重要的优化技术(如确保索引适合RAM,以及巧妙地使用应用程序端缓存)相比,这种差异非常微小,可以减小

*有些语句不能作为MySQL中的预处理语句运行,但随着每个主要版本的发布,这些语句的列表会越来越小。如果您仍在使用MySQL的旧版本,无法使用prepare运行某些语句,那么您应该在几年前升级

请回复您的评论:

是的,在大多数情况下,使用查询参数(例如与和)被认为是抵御SQL注入的最佳方法

请注意,在PDO中使用查询参数有一种更简单的方法-您只需传递一个要执行的数组,就不必麻烦使用bindValue或bindParam:

$sql = "SELECT * FROM MyTable WHERE name = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute( array("Bill") );
也可以通过以下方式使用命名参数:

$sql = "SELECT * FROM MyTable WHERE name = :name";
$stmt = $pdo->prepare($sql);
$stmt->execute( array(":name" => "Bill") );
使用并将结果插入查询也是防止SQL注入的一种好方法,但IMHO使代码更难阅读和维护,因为您总是试图找出是否已关闭引号并将点放在正确的位置。使用参数占位符然后传递参数要容易得多


您可以在我的演示文稿中阅读更多关于SQL注入防御的内容。

大多数问题都可以用常识来回答。所以,我来了

其实没关系

绝对不可以。Exec不使用事先准备好的声明。就这些

没关系。如果您曾经需要它,那么您的程序架构可能是错误的

您可以自己轻松地测试它。个人经历总是首选

这种差异被认为是可以忽略的。但是,如果您的多个插入在INNODB上非常慢,例如使用默认设置,您必须使用事务,这将使它们再次变快

没有。PDO只是一个API。但API与性能无关。他们只是将您的命令转换为服务。您的命令或服务可能会影响性能,但不仅仅是API

因此,经验法则是:


影响性能的是查询本身,而不是您运行它的方式。谢谢。。最后一个问题是bindValue和bindParam是否阻止sql注入?或者我需要这样做?小纸条回复:5。如果您需要大量插入值,我经常发现在事务中包装插入将大大加快速度。@STTLCU,是的,这是一个很好的观点,在插入速度手册页面中介绍了事务的使用。