通过mysqli运行多个查询时出现语法错误

时间:2018-03-14 20:56:56

标签: php mysql mysqli

当他们超过6小时时,我正试图将行从一个表移到另一个表。虽然我的代码在PMA中完美运行,但我只是通过PHP得到错误。 这是我的PHP代码:

$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
$timestamp6h = time() - 21600;
$sql="BEGIN;
INSERT INTO archiv6h SELECT * FROM links WHERE tweettimestamp < $timestamp6h
ON DUPLICATE KEY UPDATE archiv6h.tweetscount= archiv6h.tweetscount+ links.tweetscount, archiv6h.followerscount= archiv6h.followerscount + links.followerscount, archiv6h.tweettimestamp= archiv6h.tweettimestamp + links.tweettimestamp;
DELETE FROM links WHERE tweettimestamp < $timestamp6h;
COMMIT;";
if (!mysqli_query($conn, $sql)) {
    printf("Errormessage: %s\n", mysqli_error($conn));
}
$result = mysqli_query($conn, $sql);
$conn->close();

然后我收到以下错误消息:

错误消息:

  

您的SQL语法有错误;查看与您的MariaDB服务器版本对应的手册,以便在'INSERT INTO archiv6h SELECT * FROM links WHERE tweettimestamp&lt;附近使用正确的语法。 1521038638 ON'在第1行

当我在PMA中将其用作查询时,它的工作方式与预期相符:

BEGIN;
INSERT INTO archiv6h SELECT * FROM `links` WHERE tweettimestamp < 1521038638
ON DUPLICATE KEY UPDATE archiv6h.tweetscount= archiv6h.tweetscount+ links.tweetscount, archiv6h.followerscount= archiv6h.followerscount + links.followerscount, archiv6h.tweettimestamp= archiv6h.tweettimestamp + links.tweettimestamp;
DELETE FROM `links` WHERE tweettimestamp < 1521038638;
COMMIT;

有人知道如何在PHP中运行查询吗?

2 个答案:

答案 0 :(得分:4)

BEGIN;COMMIT;是四个陈述。您无法在一次mysqli_query()调用中运行多个语句。如果您需要交易,请使用mysqli::begin_transaction()。并且每mysqli_query()次调用仅使用一个语句:

$conn->begin_transaction();
$conn->query("INSERT ...");
$conn->query("DELETE ...");
$conn->commit();

请注意,您还应该配置mysqli以抛出异常。我会按照以下方式编写脚本:

// set connection variables

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = mysqli_connect($servername, $username, $password, $dbname);
$timestamp6h = time() - 21600;

$conn->begin_transaction();
$conn->query("
    INSERT INTO archiv6h SELECT * FROM links WHERE tweettimestamp < $timestamp6h
    ON DUPLICATE KEY UPDATE
        archiv6h.tweetscount    = archiv6h.tweetscount    + links.tweetscount,
        archiv6h.followerscount = archiv6h.followerscount + links.followerscount,
        archiv6h.tweettimestamp = archiv6h.tweettimestamp + links.tweettimestamp
");
$conn->query("DELETE FROM links WHERE tweettimestamp < $timestamp6h");
$conn->commit();

如果有任何失败,将永远不会执行$conn->commit();,脚本将输出错误消息。 Threre甚至不需要关闭连接,因为它将在脚本结束时关闭。

答案 1 :(得分:1)

这不是一个查询,而是多个查询。尝试使用mysqli_multi_query

调用它们