gpt4 book ai didi

php - 关于 PDO & MySQL 最佳实践的问题

转载 作者:可可西里 更新时间:2023-11-01 08:19:59 25 4
gpt4 key购买 nike

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

  1. 只有当我有参数要绑定(bind)时,我才应该使用 prepare() 吗?当我需要执行像 select * from table order by ... 这样的简单查询时,我应该使用 query() 吗?

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

  3. 我应该在执行insertupdatedelete 时使用closeCursor,还是仅使用select 当我需要做另一个 select 时?

  4. $con = NULL;是否真的关闭了连接?

  5. bindParamforeach 一起使用是否可以使多个插入成为一个好点?我的意思是性能方面,因为我认为在同一个 insert 上执行 (...),(...) 不是更好吗?

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

最佳答案

  1. 当我在 Zend Framework 1.0 中开发 DB 层时,我让它默认对所有查询使用准备/执行。这样做没有什么坏处。* 在 PHP 端有一点开销,但在 MySQL 端,prepared queries are actually faster .

  2. 我的做法是对所有类型的查询使用 query(),并在更新后调用 rowCount()。您还可以调用 SELECT ROW_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 基准测试”(例如)以找到各种结果。然而,归根结底,选择 PDO 与 Mysqli 并没有明显的赢家。差异非常小,以至于相对于其他更重要的优化技术(例如 choosing the right indexes)而言,它会减少。 ,确保索引适合 RAM,并巧妙地使用应用程序端缓存。


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


回复你的评论:

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

请注意,有一种更简单的方法可以通过 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 注入(inject)的好方法,但恕我直言,代码更难阅读和维护,因为你总是试图弄清楚你是否已经关闭你的引号并将你的点放在正确的位置。使用参数占位符然后传递参数要容易得多。

您可以在我的演示文稿 SQL Injection Myths and Fallacies 中阅读有关 SQL 注入(inject)防御的更多信息.

关于php - 关于 PDO & MySQL 最佳实践的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16532200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com