Mysqli Multi Query

时间:2016-07-06 23:00:31

标签: php mysqli php-5.5

除了我还没有包含可能导致我收到此错误的数据库连接器之外?

  

您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在正确的语法附近使用' UPDATE EventData SET deviceID =" 631403956MB21"在哪里deviceID =" 4631403956MB'在第1行"

这是我的php mysqli多查询。

  $sql =  "UPDATE Device      SET deviceID = \"631403956MB21\" WHERE
  deviceID = \"4631403956MB2\"   ";

  $sql .= "UPDATE EventData   SET deviceID = \"631403956MB21\" WHERE
  deviceID = \"4631403956MB2\"   ";

  $sql .= "UPDATE NotifyQueue SET deviceID = \"631403956MB21\" WHERE
  deviceID = \"4631403956MB2\"   ";

  $sql .= "UPDATE RuleTrigger SET deviceID = \"631403956MB21\" WHERE
  deviceID = \"4631403956MB2\"   ";

  $sql .= "UPDATE RuleList    SET deviceID = \"631403956MB21\" WHERE
  deviceID = \"4631403956MB2\"   ";

  $result = mysqli_multi_query($db, $sql);

  if ($result)  {
      echo 'true';   
  } else {
      echo 'false';         
      echo mysqli_error($db);   
  }

  mysqli_close($db);

谢谢, 麦克

3 个答案:

答案 0 :(得分:1)

插入/更新多个查询并使用循环时禁用自动提交:

$mysqli = dbConnect(); // Connect with database
$mysqli->autocommit(FALSE); // Set autocommit off

// You can prepare and bind outside the foreach loop, so you don't 
// have to write and bind each query individually.

$sql = "UPDATE RuleList SET deviceID = ? WHERE deviceID = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ii', $deviceID1, $deviceID2);

foreach($ids as $id):
    $deviceId1 = $id;
    $stmt->execute();
endforeach;

$stmt->close();
$mysqli->commit(); // Commit all queries
$mysqli->close();

以上是一个例子

答案 1 :(得分:0)

正确查询:

<?php
$myImagesList = array (
'image1.png' ,
'image2.png' ,
'image3.png' 
);

shuffle ($myImagesList);
echo '<div style = "background: #0600ff" class = "div02">';
for ($i=0; $i<5; $i++) {
    if ($i < 5) {
        echo '' . $myImagesList[$i] . '';
    }
    if ($i == 5) {
       echo '</div>';
       echo ' <script type='text/javascript'>
var cpmstar_pid = 45265;
document.writeln('<SCR' + 'IPT language='Javascript' src='' + (document.location.protocol=='https:'?'//server':'//cdn') + '.cpmstar.com/cached/js/feedback_v101.pack.js'></SCR' + 'IPT>');
</script> ';
        echo '<div style = "background: #0600ff" class = "div02">';
     }  
     if ($i > 5) {
        echo '' . $myImagesList[$i] . '';
      }
  }
 echo '</div>';
?>

所以,最后,你没有分配“;”在每个查询结束时。您只分配一个“;”在PHP代码的最后。

UPDATE Device      SET deviceID = '631403956MB21' WHERE deviceID = '4631403956MB2';
UPDATE EventData   SET deviceID = '631403956MB21' WHERE deviceID = '4631403956MB2';
...

↓↓↓

$sql =  "UPDATE Device      SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\"   ";
$sql .= "UPDATE EventData   SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\"   ";
...

请尝试并希望它有所帮助。

答案 2 :(得分:-1)

您不应在同一查询中包含多个UPDATE子句。您尝试使用mysqli_multi_query,但需要使用分号分隔查询:

首先创建一个数组:

$queries = [
    "UPDATE Device...",
    "UPDATE EventData...",
    "UPDATE NotifyQueue...",
];

从那里你有两个选择。首先是循环并一次执行一个查询

foreach($queries as $sql):
    $result = mysqli_query($db, $sql);
    ...
endforeach;

这不是一个好主意,因为它需要多次访问数据库。更好的选择是您实际尝试执行的操作:执行多查询语句

$multi_query = implode('; ',$queries);
mysqli_multi_query($db, $multi_query);
...

重要提示

multi_query不使用预准备语句,因此如果您不小心,您将容易受到SQL注入攻击。使用这种方法,在将它们包含在查询中之前,请务必转义字符串并将所有数值转换为数字(例如:$var = (int)$var)。

顺便说一下,我注意到您在多个表格中deviceID进行了相同的更改。这可能表明您的架构设计不佳。如果您有InnoDB表,则可以使用主键和外键来指示deviceIDEventData ...表中的NotifyQueue是链接到{中的主键的外键{1}}表。然后,如果您在更新时将更改设置为级联,则您需要做的就是更改Device表中的ID,并且数据库将负责在其他任何位置更改它。这是quick intro to the concept

相关问题