Mysqli multi_query 没有执行所有查询
Mysqli multi_query not executing all queries
我正在使用 Mysqli 和 multi_query 在数据库表中更新或插入多行。当我在我的本地 MAMP 服务器上使用它们时它们工作正常,但当我将它们放到网上时它们就崩溃了。在远程服务器上只执行了四个查询中的三个...
两个环境都有 PHP 和 mysql 版本 5+,并包括 "PHP extension: 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)";
使用 'Object oriented style' 解决了问题,如 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();
我正在使用 Mysqli 和 multi_query 在数据库表中更新或插入多行。当我在我的本地 MAMP 服务器上使用它们时它们工作正常,但当我将它们放到网上时它们就崩溃了。在远程服务器上只执行了四个查询中的三个...
两个环境都有 PHP 和 mysql 版本 5+,并包括 "PHP extension: 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)";
使用 'Object oriented style' 解决了问题,如 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();