提问人:Denis 提问时间:11/29/2015 最后编辑:Nisse EngströmDenis 更新时间:11/22/2022 访问量:2061
如何在PHP中使用implode更新多个数据
How to update multiple data with implode in PHP
问:
我有一个脚本用于使用 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());
}
但是我怎样才能用它来更新行值呢?
答:
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
。如果不使用它,则超出更新值范围的所有行都将设置为空白!
(添加了强调和格式。
基于此,您可以使用来构造具有多个值的查询:implode
UPDATE
<?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扩展已弃用,不再维护。这些天你应该使用MySQLi或PDO。
评论
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,您可能会不必要地触及表中的每一行。现在,这种方法是否比循环的单次更新(最好使用预准备语句)、跨联接更新等更好,实际上取决于许多因素,例如表架构、表的大小、要更新的典型/最大行数、对原子性的需求等。
下一个:数组组合不适用于变量
评论