【问题标题】:PDO prepared statements and their executionPDO 准备好的语句及其执行
【发布时间】:2014-03-20 21:06:47
【问题描述】:

我最近从 MYSQL*“升级”到 PDO,我有几个相关的问题:

1/ 我在网页上有一个提交大量数据的表单。与其有 1 个 looong 准备好的语句,其中可能包含 50 个项目,不如将其拆分为 5 个单独的语句:

//TODs
$stmt = $db->prepare("UPDATE first_page_data(tod_house, tod_bung, tod_flat, tod_barnc, tod_farm, tod_small, tod_build, tod_devland, tod_farmland) SET(?,?,?,?,?,?,?,?,?) WHERE email_address=?");

$stmt->bindValue(1, $_POST['tod_house'], PDO::PARAM_STR);
$stmt->bindValue(2, $_POST['tod_bung'], PDO::PARAM_STR);
$stmt->bindValue(3, $_POST['tod_flat'], PDO::PARAM_STR);
$stmt->bindValue(4, $_POST['tod_barnc'], PDO::PARAM_INT);
$stmt->bindValue(5, $_POST['tod_farm'], PDO::PARAM_STR);
$stmt->bindValue(6, $_POST['tod_small'], PDO::PARAM_STR);
$stmt->bindValue(7, $_POST['tod_build'], PDO::PARAM_STR);
$stmt->bindValue(8, $_POST['tod_devland'], PDO::PARAM_STR);
$stmt->bindValue(9, $_POST['tod_farmland'], PDO::PARAM_STR);
$stmt->bindValue(10, $_SESSION['buyer_email']);
$stmt->execute();

这是 5 个区块中的第一个。如果我不拆分它,则此语句将有 50 项长。我的问题是拆分它会有任何明显的不利影响吗?速度、服务器压力等...因为数据库的更新量会减少 5 次,而不是 1 次。

2/ 我的第二个问题很简单——上面的代码被认为是“安全的”吗?我见过人们将 $_POST 值放入变量中(主要是因为 MYSQL),然后放入语句中。我读过使用 PDO 可以防止任何注入,因此可以将 POST 值直接放入 bindValue 但我不完全确定!

【问题讨论】:

  • 最好是一个大的,你将只执行一个查询而不是很多,你会减少使用的内存。是的,你的代码是安全的
  • 1.唯一的缺点是您必须编写大量代码。 2.它是安全的。 3. 代码量可以大幅度减少,从answer to the very recent question可以看出

标签: php pdo


【解决方案1】:

是的,它是安全的(PDO::prepare 负责处理),一个大语句比一系列小语句更有效。但是您可以编写代码以减少阅读和编辑的痛苦。建议:

  1. 将查询放在一个字符串中,使其更加垂直,每个参数一行。 Heredoc 语法对此非常有用,并且避免了连接。

  2. 在查询中使用 :whatever 代替编号值,只是为了清晰和可移植性。

  3. 您可以构建一个数组,然后将其整个传递给execute(),而不是重复调用bindValue;数组是 PHP 可以做的最简单的事情,并且应该比重复调用 bindValue 开销更少,尽管真正的差异可能可以忽略不计。

    $arrParams[] = array(':tod_house' => $_POST["tod_house"];

    $stmt->execute($arrParams);

【讨论】:

  • 好建议,但是如何使用数组方法在不同的数据类型之间指定?
  • 对于数组,所有值都被视为字符串,所以如果您接收回参数值,这可能对您不起作用?但是对于更新本身并不重要,因为 SQL 语句是一个字符串,并且由 MySQL 根据分配的列来转换值。
  • 我从来不知道!如果服务器根据数据库设置解释它,为什么当您将参数绑定到插入/更新语句时,甚至还有一个选项来指定参数数据类型?
  • @Giovanni 有时你需要一个特殊的类型,但一般来说字符串就足够了
  • @BarryDevSF 你最好验证你的后一个陈述。
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2011-04-23
  • 2018-07-11
  • 2011-07-13
  • 2017-09-29
相关资源
最近更新 更多