如何在PHP中使用implode更新多个数据

How to update multiple data with implode in PHP

提问人:Denis 提问时间:11/29/2015 最后编辑:Nisse EngströmDenis 更新时间:11/22/2022 访问量:2061

问:

我有一个脚本用于使用 method 在 PHP 中插入多个数据,但我不知道如何在 UPDATE 语法中使用它。implode

<input type="text" name="field_name" value="unyil"/>

像这样使用 PHP:

foreach($_POST['id_table'] as $row=>$id_table)
{
    $id_table=$id_table;
    $full_name=$_POST['full_name'][$row];

    $query_row[] = "('$id_table','$full_name')";
}

$sql="INSERT INTO tb_client_table_rows (id_table, full_name) VALUES " . implode(',',$query_row); 

if (!mysql_query($sql))
{
    die('Error: ' . mysql_error());
}

但是我怎样才能用它来更新行值呢?

php mysql 内爆

评论

0赞 VIDesignz 11/29/2015
为什么要使用 implode?
1赞 edoceo 12/1/2015
SQL注入的成熟度;使用 PDO 和参数化查询。
1赞 Mike Brant 12/1/2015
您希望以这种方式更新的典型行数和最大行数是多少?您期望更新的行数与表中的总行数相比如何?这可能会对哪种方法最有效产生重大影响。

答:

0赞 VIDesignz 11/29/2015 #1

不要使用内爆...说干就干

$sql="UPDATE tb_client_table_rows SET full_name=$full_name WHERE id_table=$id_table";
1赞 Nisse Engström 12/1/2015 #2

Mohamed Hossam在MySQL参考手册(已存档)的评论中发布了以下内容:

更新同一表中的多行的一种对服务器资源非常友好的方法是使用(有一个非常重要的注释)。WHEN THEN

UPDATE tbl_name SET fld2 = CASE fld1
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE fld2 END

注意的是:不要忘记 ELSE。如果不使用它,则超出更新值范围的所有行都将设置为空白!

(添加了强调和格式。


基于此,您可以使用来构造具有多个值的查询:implodeUPDATE

<?php

  /* Sample data: */

  $_POST['id_table'] = array ('1746', '1834', '1944');
  $_POST['full_name'] = array ('lumbar', 'bezoar', 'sniggle');

  /* Code */

  foreach($_POST['id_table'] as $row=>$id_table)
  {
    /* Don't forget to escape data to avoid SQL injection */

    $id_table  = mysql_real_escape_string ($id_table);
    $full_name = mysql_real_escape_string ($_POST['full_name'][$row]);

    $query_row[] = "'$id_table' THEN '$full_name'";
  }

  $query = "UPDATE tb_client_table_rows\n"
         . "   SET full_name = CASE id_table\n"
         . "                     WHEN "

         . implode ("\n                     WHEN ", $query_row) 

         . "\n                     ELSE full_name\n"
         . "                   END";

  echo "$query\n";

输出:

UPDATE tb_client_table_rows
   SET full_name = CASE id_table
                     WHEN '1746' THEN 'lumbar'
                     WHEN '1834' THEN 'bezoar'
                     WHEN '1944' THEN 'sniggle'
                     ELSE full_name
                   END

请注意,MySQL扩展已弃用,不再维护。这些天你应该使用MySQLiPDO

评论

0赞 Mike Brant 12/1/2015
这将表现不佳,因为您最终会更新表中的每一行。您可以轻松地将其与 WHERE 子句结合起来,例如仅对目标行执行更新。在这种情况下,您可以放弃 ELSE 条件。WHERE id_table IN (?, ?, ?, ...)
0赞 Nisse Engström 12/1/2015
@MikeBrant:很好。我应该补充一点,我不知道它的表现如何。我认为这是一个有趣的弦乐练习。你认为是否值得添加该条款,或者无论哪种方式,答案都是毫无意义的垃圾?WHERE
0赞 Nisse Engström 12/1/2015
@MikeBrant:您是否知道查询将命中每一行,或者是否可以优化分支?ELSE
0赞 Mike Brant 12/1/2015
如果没有 WHERE 子句,则该 UPDATE 将更新表上的每一行。这就是 UPDATES 的工作方式。事实上,关于ELSE子句的注释应该是这个的死赠品(即你需要ELSE来防止意外记录中的数据被吹走)。您可以通过执行我提到的操作并使用 WHERE 子句限制被触及的记录来优化 ELSE。
0赞 Mike Brant 12/1/2015
对于您之前关于是否值得使用 WHERE 子句的问题,我想说的是,使用这种方法,不使用它是愚蠢的,因为无论如何您都是动态构建查询,如果没有 WHERE,您可能会不必要地触及表中的每一行。现在,这种方法是否比循环的单次更新(最好使用预准备语句)、跨联接更新等更好,实际上取决于许多因素,例如表架构、表的大小、要更新的典型/最大行数、对原子性的需求等。