如何使用多个 for 循环在 php 中创建 sql 语句

Posted

技术标签:

【中文标题】如何使用多个 for 循环在 php 中创建 sql 语句【英文标题】:How can I use multiple for loops to create an sql statement in php 【发布时间】: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 注入开放。为什么要绑定除一个用户提供的变量之外的所有变量? 【参考方案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);

【讨论】:

以上是关于如何使用多个 for 循环在 php 中创建 sql 语句的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环中使用 udf 在 Pyspark 中创建多个列

For 循环无法在 Adob​​e Animate CC 中创建多个矩形

在 for 循环中在 django admin 中创建另一个模型对象

如何使用引导程序和 for 循环在 django 中创建电影片段?

如何在 Python 中创建多个嵌套文件夹?

如何在矩阵内使用for循环和数据在R中创建点图?