3

我有很多关于 PDO 的问题...

  1. 我应该prepare()只在有要绑定的参数时使用吗?当我需要做一个简单的查询时,我select * from table order by ...应该使用query()吗?

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

  3. 我应该closeCursor在我做时使用insertupdate并且delete,还是只select在我需要做另一个时使用select

  4. $con = NULL;真的关闭连接吗?

  5. 使用bindParamwithforeach进行多次插入是个好点吗?我的意思是性能方面,因为我认为在相同的情况下执行 (...),(...)insert会更好,不是吗?

  6. 您能否提供一些有关使用 PHP PDO MySQL 时的性能点的更多信息(URL)?如果有人有另一个提示,那将非常有用。

4

2 回答 2

4
  1. 当我在 Zend Framework 1.0 中开发 DB 层时,我让它默认对所有查询使用准备/执行。这样做几乎没有缺点。* PHP 端有一点开销,但在 MySQL 端,准备好的查询实际上更快

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

  3. 如果您有来自结果集中的待处理行或多结果集查询中的待处理结果集,则 CloseCursor 在 MySQL 中很有用。使用 INSERT、UPDATE、DELETE 时没有必要。

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

  5. 一次执行一行准备好的 INSERT 语句不如执行具有多个元组的单个 INSERT 快。但是差异很小。如果您要插入大量行,并且性能很重要,那么您真的应该使用LOAD DATA LOCAL INFILE. 有关其他提示,另请参阅http://dev.mysql.com/doc/refman/5.6/en/insert-speed.html

  6. 您可以搜索“PDO MySQL benchmark”(例如)以查找各种结果。然而,底线是选择 PDO 与 Mysqli 并没有明确的赢家。差异很小,以至于相对于其他更重要的优化技术(例如选择正确的索引、确保索引适合 RAM 以及巧妙地使用应用程序端缓存)而言,它会减少。


* 有些语句不能在 MySQL 中作为准备好的语句运行,但是随着每个主要版本的发布,此类语句的列表会变小。如果您仍在使用无法使用 prepare() 运行某些语句的古老版本的 MySQL,那么您应该在几年前就升级了!


回复您的评论:

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

请注意,在 PDO 中使用查询参数有一种更简单的方法——您只需将一个数组传递给 execute(),因此您不必为 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") );

使用quote()然后将结果插入查询也是防止 SQL 注入的好方法,但恕我直言,使代码更难阅读和维护,因为你总是试图弄清楚你是否关闭了引号并放你的点在正确的地方。使用参数占位符然后传递参数要容易得多。

您可以在我的演示文稿“ SQL 注入神话和谬误”中阅读有关 SQL 注入防御的更多信息。

于 2013-05-13T22:49:06.730 回答
-1

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

  1. 其实没关系。

  2. 绝对绝对 - 不。Exec 不使用准备好的语句。就这样。

  3. 真的没关系。如果你需要这个,你的程序架构可能是错误的。

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

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

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

所以,经验法则是:

影响性能的是查询本身,而不是您运行它的方式。

于 2013-05-14T04:54:30.113 回答