我设置了一个数据库,有两个不同的列,我想根据从$_GET
传入的ID将值动态插入这两列中的一列。bindParam
变量部分正在工作,但我不确定如何在语句的INSERT INTO
部分中使用变量。
一列被称为product1_vote
,另一列被称作product2_vote
。我正在从$_GET
获取1
或2
,我想将其传递到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表。这样就不需要更改查询中的列名了。