繁体   English   中英

while循环内的PHP单个查询未在MySQL上运行

[英]PHP single query inside a while loop not running on MySQL

$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设置$sql2 ; 最后,我只运行一个查询,而不是多个单独的查询。

我收到此错误消息:

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 ,它看起来像$sql2 : //www.wepaste.com/sql2/

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

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

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

您应该将$sql2的执行转移到while循环中,并放下.=运算符,而使用=

$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子句将其作为一条语句运行。这是相同的逻辑。

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

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

整个代码混乱都在执行RBAR(行通过使行变灰),只需向数据库发出一个UPDATE语句,就可以更简单,更有效地完成此任务:

UPDATE callplandata d
   SET d.`somecol` = 'someval'
 WHERE d.number IS NOT NULL

(注意:包含WHERE子句是为了重现原始UPDATE语句的行为,避免在number列为NULL的情况下避免更新行。如果不需要或不必要,则可以省略WHERE子句。)

(注意:这假定您正在为该列分配一个文字值,就像在原始UPDATE中一样,在其中我们看到“ callplancopy”用单引号引起来,使其成为字符串文字。如果要从另一列复制该值在该行中,然后将列标识符括在反引号中,而不是单引号中。)

SET d.`somecol` = d.`some_other_col`

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

$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接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM