gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:28:39 25 4
gpt4 key购买 nike

我设置了一个数据库,有 2 个不同的列,我想根据从 $_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 注入(inject),您不希望允许用户在未经验证的情况下直接输入查询。

对此的常见解决方案是创建允许值的“白名单”,并确保用户提供的值与其中之一匹配,然后再将其包含在查询中。

例如:

$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);

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

关于PHP - 在 INSERT INTO MySQL 语句中使用变量作为列名的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73818303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com