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

use*_*974 2 php mysql pdo prepared-statement

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

一列称为product1_vote,另一列称为product2_vote。我正在获取或1,我想将其传递到调用中以确定要更新哪一列。2$_GETprepare

$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);
Run Code Online (Sandbox Code Playgroud)

我将如何更改 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);
Run Code Online (Sandbox Code Playgroud)

ADy*_*son 5

您无法参数化列名,而且为了防止 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);
Run Code Online (Sandbox Code Playgroud)

PS 出现这种情况可能是因为您的数据库可以更好地规范化。如果每个产品有多个投票,请考虑将它们存储在单独的“productVotes”表中,并使用返回产品表的外键。那么您就不需要改变查询中的列名称。