【问题标题】:Dynamically change column name in PDO statement [duplicate]在 PDO 语句中动态更改列名 [重复]
【发布时间】:2013-05-28 21:59:32
【问题描述】:

是否可以在准备好的 MySQL 语句中将列名作为参数传递?举个例子:

UPDATE Images
SET :placement = :imageURL
WHERE ID = :titleID;

PDO在每个参数周围加上',所以上面的中间行变成了:

SET 'Homepage' = '1.jpg'

哪个 MySQL 不喜欢。有没有办法在 PDO 语句中包含字段名的参数并让它们被接受?

否则我想我将不得不编写几个不同的 PDO 语句,具体取决于所选择的内容(?)。

【问题讨论】:

标签: php mysql pdo prepared-statement


【解决方案1】:

在这种情况下,我使用不同类型的替换参数,如下所示:

$unitLabel = 'store_number';
$sql = 'select * from users where [unitLabel] = :unit and level = :level;';
$sql = str_replace('[unitLabel]', $unitLabel, $sql);
$params = array(
  ':unit' => 300,
  ':level' => 'admin',
);
$stmt = $dbh->prepare($sql);
$stmt->execute($params);

准备好的 SQL 查询最终被处理(或多或少)为:

SELECT * FROM USERS WHERE store_number = 300 AND level = 'admin';

这适用于我的情况。我希望这有帮助。 :)

【讨论】:

  • 这是否容易受到 SQL 注入的攻击?
  • 不是我的情况,因为所涉及的变量不使用来自受污染源的值。使用此方法时必须小心,以确保来自任何来源的任何用户输入在使用前都经过验证和清理,但这对于熟练的程序员来说应该是本能的。
  • 我实现这个的方式是我只是使用"SELECT * FROM table WHERE {$var} = ?" 而不是使用str_replace。我使用了一组可能的参数并检查了$var 是否存在,如果不存在,它会终止页面。在您看来,这安全吗?
【解决方案2】:

你需要做这样的事情:

$column = 'someColumn';

$stmt = $db->prepare("UPDATE tableName SET {$column} = :columnValue WHERE ID = :recordId");

参数化占位符仅用于值。

我建议您阅读@YourCommonSense 针对您的问题发布的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2016-08-03
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多