PHP-在INSERT INTO MySQL语句中使用变量作为列名的一部分



我设置了一个数据库,有两个不同的列,我想根据从$_GET传入的ID将值动态插入这两列中的一列。bindParam变量部分正在工作,但我不确定如何在语句的INSERT INTO部分中使用变量。

一列被称为product1_vote,另一列被称作product2_vote。我正在从$_GET获取12,我想将其传递到prepare调用中,以确定要更新的列。

$productID = $_GET['id'];
$stmt = $pdo->prepare('INSERT INTO products (id, title, product1_vote) 
VALUES(:id, :title, :product1_vote);
$id = $pdo->lastInsertId();
$title = 'Test';
$date = date('m/d/Y h:i:s', time());
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':title', $title, PDO::PARAM_STR);
$stmt->bindParam(':product1_vote', $date, PDO::PARAM_STR);

我该如何将INSERT INTO部分更改为动态工作,而不是当前的硬编码product1_vote

像这样的东西让你知道我想要什么:

$stmt = $pdo->prepare('INSERT INTO products (id, title, product.$productID._vote) 
VALUES(:id, :title, :product.$productID._vote);
$id = $pdo->lastInsertId();
$title = 'Test';
$date = date('m/d/Y h:i:s', time());
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':title', $title, PDO::PARAM_STR);
$stmt->bindParam(':product.$productID._vote', $date, PDO::PARAM_STR);

您不能参数化列名,但为了防止SQL注入,您不希望在未经验证的情况下允许用户直接输入查询。

对此的一个常见解决方案是制作一个";白名单";的值,并确保用户提供的值与其中一个值匹配,然后再将其包含在查询中。

例如:

$productID = $_GET['id'];
$voteIDs = ["1", "2"];
if (!in_array($productID, $voteIDs)) {
echo "invalid input value";
die();
};
$stmt = $pdo->prepare('INSERT INTO products (id, title, product'.$productID.'_vote) 
VALUES(:id, :title, :product1_vote);

p.S.出现这种情况可能是因为您的数据库可以更好地规范化。如果每个产品有多个投票,可以考虑将它们存储在一个单独的";productVotes";带有外键的表返回到products表。这样就不需要更改查询中的列名了。

最新更新