【问题标题】:Mysqli multi_query not executing all queriesMysqli multi_query 未执行所有查询
【发布时间】:2015-04-08 14:42:12
【问题描述】:

我正在使用 Mysqli 和 multi_query 在数据库表中更新或插入多行。当我在本地 MAMP 服务器上使用它们时它们工作正常,但当我将它们放到网上时它们会崩溃。在远程服务器上,只执行了四个查询中的三个......

两个环境都有 PHP 和 mysql 版本 5+,并且包括“PHP 扩展:mysqli”。我看到的唯一区别是 phpMyAdmin 版本。远程服务器有 3.5.6,我的本地 MAMP 服务器有 4.2.5。这会产生影响吗?

我当然要更改密码,所有变量都应该是有效的,因为它们在本地工作。

我不知所措...谢谢!

$mysqli = new mysqli("localhost", "root", "root", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$sql = "INSERT INTO categories (id, name, descr)  VALUES ('$id1', '$name1', '$descr1') ON DUPLICATE KEY UPDATE name='$name1', descr='$descr1';";
$sql.= "INSERT INTO categories (id, name, descr)  VALUES ('$id2', '$name2', '$descr2') ON DUPLICATE KEY UPDATE name='$name2', descr='$descr2';";
$sql.= "INSERT INTO categories (id, name, descr)  VALUES ('$id3', '$name3', '$descr3') ON DUPLICATE KEY UPDATE name='$name3', descr='$descr3';";
$sql.= "INSERT INTO categories (id, name, descr)  VALUES ('$id4', '$name4', '$descr4') ON DUPLICATE KEY UPDATE name='$name4', descr='$descr4';";

if (!$mysqli->multi_query($sql)) {
     echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;
}else{
     echo("Succes.");
}
$mysqli->close()

更新: 用单个查询替换查询确实有效,但在所有情况下都不是很可行,并且需要大量重写......使用硬编码变量没有帮助。

$sql2 = "INSERT INTO categories (id, name, descr)  VALUES ('$id1', '$name1', '$descr1'), ('$id2', '$name2', '$descr2'), ('$id3', '$name3', '$descr3'),('$id4', '$name4', '$descr4') 
    ON DUPLICATE KEY UPDATE name=VALUES(name), descr=VALUES(descr)";

【问题讨论】:

  • @Fred-ii- 这可能是问题吗?这些相同的语句在本地工作......
  • phpMyAdmin 只是`基于web的MySQL管理工具`,它既不是必需的,也不会影响mysqlphp的功能。
  • @Jorgos 我删除了我的评论。这是有效的。我以为需要SET,但是看了手册后,两种方法都有效dev.mysql.com/doc/refman/5.6/en/insert.html
  • 感谢您的确认,@t.niese!预计会是这样。知道还有什么可能导致不同的行为吗?
  • 如果只能看到四个查询中三个的结果并且没有发生错误,那么其中两个具有相同的键,否则我无法解释这种行为。但是如果没有categories 的表结构和在您的遥控器上创建的最终$sql,则无法分辨。

标签: php mysql mysqli mamp multi-query


【解决方案1】:

使用php.net 中所示的“面向对象样式”修复了该问题。仍然不确定为什么我以前的方法只能在本地工作,但没关系,我们称之为修复。

/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
    /* store first result set */
    if ($result = $mysqli->store_result()) {
        while ($row = $result->fetch_row()) {
            printf("%s\n", $row[0]);
        }
        $result->free();
    }
    /* print divider */
    if ($mysqli->more_results()) {
        printf("-----------------\n");
    }
} while ($mysqli->next_result());
}

/* close connection */
$mysqli->close();

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多