无法执行多个查询

时间:2016-08-17 16:17:42

标签: php mysql

我试图执行多个查询,但出了点问题。

$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;很关键,但看不出有什么不对。

任何帮助?

2 个答案:

答案 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,以强制该列具有连续值。你表中的行数越多越慢,对吧?

您应该重新考虑为什么需要该列具有连续值。