繁体   English   中英

Mysqli多查询

[英]Mysqli Multi Query

因此,除了数据库连接器之外,我还没有包括什么可能导致我收到此错误?

您的SQL语法有误; 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在'UPDATE EventData SET deviceID =“ 631403956MB21” WHERE 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);

谢谢,迈克

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

$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();

以上是一个例子

正确的查询:

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

因此,最后,您没有分配“;” 在每个查询的末尾。 您只分配一个“;” 在php代码的末尾。

$sql =  "UPDATE Device      SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\"   ";
$sql .= "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';   ";
...

请尝试,希望对您有所帮助。

您在同一查询中不应有多个UPDATE子句。 您正在尝试使用mysqli_multi_query但是需要用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表,你可以使用主键和外键来指示deviceIDEventDataNotifyQueue ...表是链接到主键的外键Device表。 然后,如果您将更改设置为在更新时级联,那么您要做的就是更改Device表中的ID,DB会负责在其他地方进行更改。 这是该概念快速介绍

暂无
暂无

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

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