一个while循环中的PHP单个查询没有在MySQL上运行

时间:2014-08-05 16:20:09

标签: php mysql sql

$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 ;,所以我只运行一个查询而不是多个单独的查询。

我收到此错误消息:

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/

3 个答案:

答案 0 :(得分:0)

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

但是,您可以使用mysqli_multi_query

在mysqli的单个查询中使用多个语句

答案 1 :(得分:0)

您当前的问题是,您正在连接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子句将其作为一个语句运行..它是相同的逻辑。

答案 2 :(得分:0)

您正在使用反模式来实现此代码尝试实现的目标:更新callplancopy表中的所有行(number列不为空)以将列设置为等于一个值。

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

整个代码混乱都在执行RBAR(Row By Agonizing Row),只需向数据库发出一个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 函数来制作不安全的值" safe"包含在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接口。