当他们超过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中运行查询吗?
答案 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
调用它们