【问题标题】:PDO Update different amount of fields, same statementPDO 更新不同数量的字段,相同的语句
【发布时间】:2015-10-19 21:56:25
【问题描述】:

我的代码中有许多 SQL 语句,我正在尝试转换为 PDO,因为我刚刚了解到它并且我喜欢它。

我的问题是,您能否只更新 Prepared 语句中的 1 或 2 个字段,或者它不能像那样工作。

我有表格,当用户浏览我的网站时,某些字段会更新,例如“lastlogin”或“我的地址”等,但所有这些都存储在一个包含 24 列以上的“用户”表格中。

是否可以使用 1 个 PDO 语句单独更新这些字段,或者我是否必须为我想要更新的每个变体编写一个新的 PDO 语句。就像如果我想更新城市和州,我必须有一个单独的 PDO。或者如果我想做地址和邮政编码,一个单独的,等等

我正在尝试确定仅使用准备好的语句是否值得(因为我必须为 50 列的表行编写 1000 种变体),或者我是否应该只将准备好的语句用于大条目并执行其他方式(见此处)并根据需要进行消毒。

$sql = "DELETE FROM addresses WHERE usernumber = '$usernumber' and number = '$add_to_del'";
$result = mysqli_query($conn,$sql);

【问题讨论】:

  • “另辟蹊径”如何减少需要编写的sql语句数??
  • 我在想 PDO 方法会减少我必须编写的代码,因为我可以只调用我准备好的语句(所以我不必编写“UPDATE table SET”或“SELECT * FROM表”一遍又一遍,但是当我在写完这个问题后做更多的研究时,我想知道我是否真的理解 PDO。我可能需要更多地研究它,因为看起来我可以在编写语句时准备它们而不必传递变量...
  • Stored Procedures 可以让你大开眼界 - 将表名、字段名和值作为参数传入

标签: php pdo


【解决方案1】:

答案是:是的。

PDO 就像 mysql_ 一样是一个抽象层,但要好得多。

要在 PDO 中重写您的示例查询,您可以执行以下操作:

$sql = 'DELETE FROM addresses WHERE usernumber = :usernumber and number = :add_to_del';
$sth = $db->prepare($sql);
$sth->execute(array(':usernumber' => $usernumber, ':add_to_del' => $add_to_del));

我认为您误解了 PDO 是什么。 PDO 就像 mysql_ 一个抽象层,但比旧的已弃用的 mysql_ 库更安全(因为准备好的语句)并且具有更多功能。

强烈建议您重构代码以改用 PDO 或 MySQLi 之类的东西。 mysql_ (mysql_query, etc) 已被弃用,这意味着 PHP 不再支持它,并且将在未来的版本中删除(如果还没有的话)。

【讨论】:

  • 我使用的是 mysqli_(不是 mysql_),但这需要我自己对注射进行卫生处理,这就是为什么我试图学习 PDO 是为了从我的代码中删除“人为错误”因素关于 sql 注入
  • @DerekConlon mysqli_ 已准备好声明,您不必自己做卫生。
  • @DerekConlon 见mysqli_prepare()mysqli_stmt_bind_param()
  • 啊,我很快就做出了假设。然后我鼓励你看看上面提到的@Barmar 函数。您应该始终使用准备好的语句来插入来自用户的数据:)
【解决方案2】:

我将您的问题理解为:

我可以执行查询吗:UPDATE my_table SET a=1UPDATE my_table SET b=2 只使用一个语句

答案是NO。准备好的陈述不会解决您的问题。您可以做的是编写一个完整的更新 SQL 语句并使用不同的值运行它(一个和相同的),为未修改的字段传递现有值。

例如你有一张桌子:

|a|b|c|d|e|
-----------
|1|1|1|1|1|
|2|2|2|2|2|
|3|3|3|3|3|

您想更新第一行的 a=5,第二行的 c=7,最后一行的 e=9。所以准备好的语句看起来像(匿名参数):

UPDATE my_table SET a=?, b=?, c=?, d=?, e=? WHERE a=?

然后你用数据触发它:

array(5,1,1,1,1,1)
array(2,2,7,2,2,2)
array(3,3,3,3,9,3)

【讨论】:

  • 或者你可以使用 ORM 并忘记这些问题 :)
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2013-05-04
相关资源
最近更新 更多