MySQL Update和Select在一个语句中

时间:2016-07-24 15:51:22

标签: php mysql ajax

我试图在同一个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);

2 个答案:

答案 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。

总而言之,一次通话不会执行多个查询。