【问题标题】:PHP - using a variable in the INSERT INTO portion of a MySQL statementPHP - 在 MySQL 语句的 INSERT INTO 部分中使用变量
【发布时间】:2022-09-23 01:04:56
【问题描述】:

我设置了一个数据库,并且有 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);

    标签: php mysql


    【解决方案1】:

    您不能参数化列名,而且为了安全起见,您不希望允许用户直接输入查询而无需验证。

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

    例如:

    $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”表中,并将外键返回到产品表。这样您就不需要更改查询中的列名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2023-03-06
      • 2011-12-04
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多