【问题标题】:How can I use multiple for loops to create an sql statement in php如何使用多个 for 循环在 php 中创建 sql 语句
【发布时间】:2021-10-08 14:18:32
【问题描述】:

我正在一个网站上工作,我可以通过多种不同的形式接受用户数据以更新数据库中的表,而不是为每个表编写单独的函数,我认为使用字符串连接和 for 循环编写是个好主意为我准备的 SQL 语句。基本上它需要 4 个参数,一个表、id、需要更新的列(参数)和一个用户输入数组。我相信我非常接近我需要的东西,但它无法执行并给我一个错误

SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '(name,comment) VALUES ('sadf','asdf') WHERE music_work_ID=14' 附近使用正确的语法

这是我打印出 $sql 时显示的内容,

sql = UPDATE music_work SET (name,comment) VALUES (:name,:comment) WHERE music_work_ID=14

我不知道是否有更好的方法来创建这样的东西,或者我没有使用正确的语法,但现在我陷入了僵局。

function music_work_update($userInput, $userID_selection){
  foreach ($userInput as $k => $v) {
    if($userInput[$k] === '') {
      unset($userInput[$k]);
    }
  }
  update("music_work", $userID_selection, ["name", "comment"], $userInput);
}

function update($table, $userID_selection, $params, $input){
  $conn = connect();
  try {
    $sql = "UPDATE ".$table." SET (";
    for ($i = 0; $i < sizeof($params); $i++) {
      $sql .= "`".$params[$i]."`,";
    }
    $sql = substr_replace($sql ,"", -1); 
    $sql .= ") VALUES ( ";
    
    for ($i = 0; $i < sizeof($params); $i++) {
      $sql .= ":".$params[$i].",";
    }
    $sql = substr_replace($sql ,"", -1); 
    $sql .= ") WHERE `music_work_ID`=$userID_selection";
    echo ("sql = $sql <br>");

    $command = $conn->prepare($sql);

    for ($i = 0; $i < sizeof($params); $i++) {
      $command->bindParam(':'.$params[$i], $input[$params[$i]], PDO::PARAM_STR);
    }


    if ($command->execute()) {
      echo "<script type= 'text/javascript'>alert('New Record Inserted Successfully');</script>";
    }
    else{
      echo "<script type= 'text/javascript'>alert('Data not successfully Inserted.');</script>";
    }
    echo "failed before execute";
    $conn = null;
  }
  catch(PDOException $e)
  {
    echo ($e->getMessage());
  }
}

【问题讨论】:

  • 该查询对 SQL 注入开放。为什么要绑定除一个用户提供的变量之外的所有变量?

标签: php mysql sql


【解决方案1】:

您混淆了多个 INSERT INTO 和多个 UPDATE。

对于多个 UPDATE 使用:

UPDATE music_work SET name = x, comment = y WHERE id = z;

对于多个 INSERT INTO:

INSERT INTO table_name (column_list)
VALUES
  (value_list_1),
  (value_list_2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2013-10-05
    • 1970-01-01
    • 2013-12-26
    • 2014-08-20
    相关资源
    最近更新 更多