2016-07-24 110 views
1

我正在尝试在同一个sql语句中执行UPDATE和SELECT。出于某种原因,下面的代码失败了。MySQL更新和选择一条语句

$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); 

问:什么可能我是做错了什么?我一直在这个问题上花费数小时,因为它可能是我鼻子下面的一个小错误。


被修改:

未捕获的异常 'PDOException' 与消息“SQLSTATE [HY000]:

予加载包含PHP代码的页面时获得此错误消息 一般错误'在ajaxCall.php:89堆栈跟踪:#0 ajaxCall.php(89): PDOStatement-> fetchAll(2)#1 {main}抛出ajaxCall.php在线89

我正在使用ajax调用包含上述代码的php页面,并且当我从浏览器加载php页面时,出现上述错误消息。

线89:$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

+0

您是否收到错误?为什么不绑定'$ id'? – chris85

+0

@ chris85 $ id是从$ _SESSION获得的,从未从用户获得。我现在会检查一个错误。 $ valueA在这里拼写错了,代码 – Webeng

+0

没有开始会话吗?这是根据评论中的新代码。你也标记为ajax,为什么?任何相关性? –

回答

2

由于您正在运行两个查询,因此您需要致电nextRowset以访问第二个查询的结果。

所以,像这样做:

// code 
$stmt->execute(); 
$stmt->nextRowset(); 
// code 

当您运行两个或多个查询,你会得到一个多行集结果。这意味着你得到这样的事情(仅表示,真的这样):既然你想要的第二组产生的结果从SELECT

Array(
    [0] => rowset1, 
    [1] => rowset2, 
    ... 
) 

- ,你可以消耗第一个致电nextRowset。这样,您就可以从“重要”集中获取结果。
(即使'消费'可能不是正确的词,它适合于理解的目的)

0

执行两个查询一个电话,当您使用mysqlnd只允许。即使那样,当使用预准备语句时,您必须将PDO::ATTR_EMULATE_PREPARES设置为1。您可以设置此使用:

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); 

或者,你可以使用$conn->exec($sql),其中工程不管。但是,它不会允许您将任何数据绑定到执行的SQL。

总而言之,不要用一次调用执行多个查询。

+0

我在setAttribute中的当前代码是'$ conn-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);',如何在包含先前属性的同时包含以前的信息?这会工作吗? :'$ conn-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION,PDO :: ATTR_EMULATE_PREPARES);'?和'1'我不确定它是否必须作为第二个参数或? – Webeng

+0

我试过以下内容:'$ conn-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION,PDO :: ATTR_EMULATE_PREPARES,1);'没有成功 – Webeng

+0

我尝试了'$ conn-> setAttribute(PDO :: ATTR_EMULATE_PREPARES ,1);'错误信息是否与这是问题一致?我更新的问题有我正在获取的错误消息。 – Webeng