2016-07-24 18 views
1

同じSQL文でUPDATEとSELECTを実行しようとしています。何らかの理由で、以下のコードが失敗しています。MySQLアップデートと1つのステートメントで選択

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

質問:私は間違っているかもしれないもの?私はこの問題で、おそらく私の鼻の下に小さな誤りがあることを知っている時間を過ごしてきました。 SQLSTATE [HY000]」メッセージと

キャッチされない例外 'PDOException':


編集:PHPコードを含むページをロードするとき

私はこのエラーメッセージを取得し ajaxCall.php:89スタックトレース:#0 ajaxCall.php(89): PDOStatement-> fetchAll(2)#1 {main}行89のajaxCall.phpでスローされました

私は上記のコードを含むPHPページを呼び出すためにajaxを使用しています。ブラウザからPHPページを読み込むと、上記のエラーメッセージが表示されます。

ライン89は以下のとおりです。あなたがmysqlndを使用した場合に、1回のコールで2つのクエリを実行する$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

+0

エラーが表示されますか?なぜ$ idをバインドしないのですか? – chris85

+0

@ chris85 $ idは$ _SESSIONから得られ、決してユーザーから取得されません。私は今、エラーをチェックします。 $ valueAのスペルが間違っていたのですが、それはコード内で問題ありませんでした。 – Webeng

+0

セッションを開始しましたか?これはコメントの新しいコードに照らしてですあなたはまた、なぜAJAXとしてタグ付けされましたか?どんな妥当性? –

答えて

2

2つのクエリを実行しているので、nextRowsetを呼び出して、2番目のクエリの結果にアクセスする必要があります。

そうでは、このようにそれを実行します。

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

2つの以上のクエリを実行すると、あなたはマルチ行セット結果を取得します。 、あなたはは最初の1を消費することができます - あなたは第二セットはSELECTから生じる-Theたいので

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

:それはあなたがこの(表現のみ、本当にないこの)ような何かを得ることを意味しますnextRowsetを呼び出してください。こうすることで、「重要」なセットから結果を取得することができます。
(「消費」はこれに適切な単語ではないかもしれませんが、理解の目的に合っています)

0

にのみ許可されます。それでも準備文を使用する場合は、PDO::ATTR_EMULATE_PREPARES1に設定する必要があります。

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

また、$conn->exec($sql)を使用することもできます。これは関係なく動作します。ただし、実行されたSQLにデータをバインドすることはできません。

すべての場合、1回の呼び出しで複数のクエリを実行しないでください。

+0

私の現在のコードは '$ conn-> setAttribute(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_EXCEPTION);、以前の属性を同時に含めることができますか?これは効果がありますか? : '$ conn-> setAttribute(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_EXCEPTION、PDO :: ATTR_EMULATE_PREPARES);'? '1'は2番目のパラメータでなければならないのかどうか、あるいは? – 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

関連する問題