【问题标题】:foreach in PDO prepared statementPDO 中的 foreach 准备好的语句
【发布时间】:2015-11-10 19:12:15
【问题描述】:


我想澄清一下准备好的语句,以及它们在以其他方式组装时的行为方式。

下面的示例代码来自 Straight out this W3 entry。我的问题是,比本示例中提供的四个值要多得多,我希望将它们存储在一个数组中,然后运行一个 foreach 来准备每个字符串。

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) 
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);

// insert a row
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

// insert another row
$firstname = "Mary";
etc



下面的编辑对应用程序是否安全,或者它是否破解了准备好的语句的全部要点?

$stuff = array("firstname", "lastname", "email");
foreach ($stuff as $singlestuff) {
$singlestuff1 = ':'.$singlestuff;
$singlestuff2 = '$'.$singlestuff;
$stmt = $conn->prepare("INSERT INTO MyGuests ($singlestuff1) ) VALUES ($singlestuff2)");
$stmt->bindParam($singlestuff1, $singlestuff2);
}


如有宏观错误,请见谅,代码只是概念的说明。
提前致谢!

【问题讨论】:

  • 请阅读 php 手册以了解您使用的功能。你会发现他们在 w3schools 中没有告诉你的东西。
  • 你的 for/each 波浪线的终点在哪里?您单独绑定,但很难说没有波浪线您甚至在做什么。好像绑定的概念生成的源代码行数太高,困扰你
  • @Drew 很抱歉 foreach 结束,刚刚编辑了上面的代码。无论如何,我一直在考虑这种解决方法,以拥有一个可以以不同形式运行的灵活脚本。因此,如果每个表单都有自己的输入列表,那么拥有一个 foreach 肯定会加快开发和更新的过程。但是话又说回来,老实说,我不确定这段代码是否会引发安全问题或更糟,所以您能否进一步解释一下您的观点?您是否建议按原样处理准备好的语句?
  • 下面的回答有用吗,还是删掉?

标签: php mysql pdo foreach prepared-statement


【解决方案1】:

在foreach循环中绑定,假设变量存在:

foreach ($stuff as $singlestuff) {
    $stmt->bindParam(':' . $singlestuff, $$singlestuff);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2011-07-13
    • 2017-09-29
    • 2014-07-20
    • 2016-12-30
    相关资源
    最近更新 更多