首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >while循环中的PHP单查询未在MySQL上运行

while循环中的PHP单查询未在MySQL上运行
EN

Stack Overflow用户
提问于 2014-08-06 00:20:09
回答 3查看 631关注 0票数 1
代码语言:javascript
复制
$sql="SELECT retail_peak, number from callplandata ";
$rs=mysql_query($sql,$conn);
$sql2='';
while($result=mysql_fetch_array($rs)) {
    $sql2.="UPDATE callplandata set ".$_POST["callplancopy_newname"]." = '".$result[$_POST["callplancopy"]]."' where number = '".$result["number"]."'; ";
}
$rs2=mysql_query($sql2,$conn) or die(mysql_error());

我正在尝试运行上面的查询,我在末尾设置了一个带有;$sql2,所以我只运行一个查询,而不是许多单独的查询。

我收到以下错误消息:

代码语言:javascript
复制
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE callplandata set dcabr = '0' where number = '44*116'; UPDATE callplandata' at line 1

当我回显$sql2时,它看起来像- http://www.wepaste.com/sql2/

EN

回答 3

Stack Overflow用户

发布于 2014-08-06 00:24:55

mysql已被弃用,但它也不允许在单个查询中使用多个语句。

但是,您可以使用mysqli_multi_query在mysqli的单个查询中使用多个语句

票数 0
EN

Stack Overflow用户

发布于 2014-08-06 00:26:15

直接的问题是,您在while循环中连接$sql2查询以生成一个长字符串,然后尝试将该长字符串作为一个查询执行。

您应该将$sql2的执行移到while循环中,并删除.=运算符以支持=

代码语言:javascript
复制
$sql2=''; // Don't need this line

while($result=mysql_fetch_array($rs)) {
  $sql2="
    UPDATE callplandata 
       SET ".$_POST["callplancopy_newname"]."='".$result[$_POST["callplancopy"]]."'
     WHERE number = '".$result["number"]."'
  ";
  $rs2=mysql_query($sql2,$conn) or die(mysql_error());
}

您还可以遵循Rob的建议,将长字符串作为多个查询执行。

您还应该注意有关SQL注入和弃用函数的注释中的警告。

通过删除WHERE子句,您实际上可以将其作为一条语句运行。这是相同的逻辑。

票数 0
EN

Stack Overflow用户

发布于 2014-08-06 00:55:40

您正在使用反模式来实现以下代码:更新callplancopy表(其中number列不为null)中的所有行,以将列设置为等于某个值。

(注意:原始UPDATE语句中的"WHERE number =“将有效地防止该列中具有空值的行被更新。)

整个混乱的代码正在执行RBAR (逐行痛苦的行),这可以通过向数据库发出一条UPDATE语句来更简单、更有效地完成:

代码语言:javascript
复制
UPDATE callplandata d
   SET d.`somecol` = 'someval'
 WHERE d.number IS NOT NULL

(注意:包含WHERE子句是为了重现原始UPDATE语句的行为,避免更新number列为NULL的行。如果这不是我们想要的,或者不是必需的,那么可以省略WHERE子句。)

(注意:这里假设您为列分配了一个文字值,就像在最初的更新中一样,我们看到用单引号括起来的"callplancopy“,使其成为字符串文字。如果您打算从行中的另一列复制值,那么我们应该用反引号将列标识符括起来,而不是用单引号。)

代码语言:javascript
复制
SET d.`somecol` = d.`some_other_col`

如果我们坚持使用不推荐使用的mysql接口,我们真的需要使用mysql_real_escape_string函数来使不安全的值“安全”地包含在SQL文本中。

代码语言:javascript
复制
$sql = "UPDATE callplandata d
           SET d.`" . mysql_real_escape_string($_POST["callplancopy_newname"]) . "`"
         . " = d.`" . mysql_real_escape_string($_POST["callplancopy"] . "`
         WHERE d.number IS NOT NULL";

# for debugging, echo out the SQL text
#echo $sql;

注意: PHP mysql接口已被弃用。新的开发应该使用PDO或mysqli接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25143724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档