我试图执行多个查询,但出了点问题。
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
$sql = "
UPDATE tmatria SET par = " . $newpar . ", inde = " . $newinde . " WHERE id =" . $cutid . ";
SELECT * FROM tmatria ORDER BY inde ASC;
SET @i := 0;
UPDATE tmatria SET inde = @i := @i + 1;
";
try {
$db->exec($sql);
}
catch (PDOException $e) {
echo $e->getMessage();
die();
}
我想更新一些列,然后按inde
列对表进行排序,最后将inde
值设置为1 2 3...
我认为行UPDATE tmatria SET par...
和SELECT * FROM tmatria ORDER BY inde ASC;
很关键,但看不出有什么不对。
任何帮助?
答案 0 :(得分:1)
您需要一次将查询传递给PDO。您仍然可以使用@i
之类的变量,因为PDO会按顺序运行您的查询。但它不会在一次调用中运行一堆查询。
答案 1 :(得分:1)
您对如何使用SQL有一些基本的误解。您执行SELECT ... ORDER BY,然后您希望以下UPDATE遵循相同的顺序。 UPDATE按照自然顺序对表进行排序,它根本不关注SELECT查询。
作为编码问题,在一次调用中执行多个SQL语句没有必要或好处。 PDO允许它,但它不是一个好习惯。您应该每次调用执行一个SQL语句。只要您使用相同的数据库连接,会话变量@i
将保留其值。
当您想要将PHP变量与SQL语句组合时,也使用准备好的查询;不要将PHP变量连接到SQL字符串中。
try {
$sql = "UPDATE tmatria SET par = ?, inde = ? WHERE id = ?";
$stmt = $db->prepare($sql);
$stmt->execute([$newpar, $newinde, $cutid]);
$sql = "SET @i := 0";
$db->exec($sql);
$sql = "UPDATE tmatria SET inde = @i := @i + 1 ORDER BY inde ASC";
$db->exec($sql);
}
catch (PDOException $e) {
echo $e->getMessage();
die();
}
在每次更新后,您还试图重新编号inde
,以强制该列具有连续值。你表中的行数越多越慢,对吧?
您应该重新考虑为什么需要该列具有连续值。