我试图在同一个sql语句中执行UPDATE和SELECT。出于某种原因,下面的代码失败了。
$sql = "UPDATE mytable SET last_activity=CURRENT_TIMESTAMP,
info1=:info1, info2=:info2 WHERE id = {$id};";
$sql .= "SELECT id, info1, info2 FROM myTable
WHERE info1 >=:valueA AND info2>:valueB;"
$stmt = $conn->prepare($sql);
$stmt->bindParam(":info1", $info1);
$stmt->bindParam(":info2", $info2);
$stmt->bindParam(":valueA", $valueA);
$stmt->bindParam(":valueB", $valueB);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($result);
问题:我可能做错了什么?我已经花了好几个小时来解决这个问题,因为我知道这可能是一个很小的错误。
编辑:
我在加载包含php代码的页面时收到此错误消息:
未捕获的异常' PDOException'消息' SQLSTATE [HY000]: 一般错误'在ajaxCall.php中:89堆栈跟踪:#0 ajaxCall.php(89): 第89行的ajaxCall.php中抛出PDOStatement-> fetchAll(2)#1 {main}
我使用ajax调用包含上述代码的php页面,当我从浏览器加载php页面时,我收到上述错误消息。
第89行是:$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
答案 0 :(得分:2)
由于您正在运行两个查询,因此需要调用nextRowset来访问第二个查询的结果。
所以,这样做:
// code
$stmt->execute();
$stmt->nextRowset();
// code
运行两个或多个查询时,会得到多行集结果。这意味着你会得到像这样的东西(仅代表,不真的这个):
Array(
[0] => rowset1,
[1] => rowset2,
...
)
由于您需要第二个设置 - SELECT
- 的结果,您可以通过调用nextRowset
消费第一个设置。这样,您就可以从重要的'中获取结果。组。
(尽管'消费'可能不是正确的词,但它适合理解目的)
答案 1 :(得分:0)
只有在使用mysqlnd
时才允许使用一次调用执行两个查询。即使这样,在使用预准备语句时,您必须将PDO::ATTR_EMULATE_PREPARES
设置为1
。您可以使用以下方式设置:
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
或者,您可以使用$conn->exec($sql)
,无论如何都可以。但是,它不允许您将任何数据绑定到已执行的SQL。
总而言之,一次通话不会执行多个查询。