• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQL UPDATE SETが失敗なのに1が返る)

MySQL UPDATE SETが失敗なのに1が返る

このQ&Aのポイント
  • MySQL5.0 PHP5 PEAR(DB)を使用している場合、UPDATE文の実行結果が失敗の場合でも1が返ってしまう問題が発生しています。
  • 該当データが存在しない場合、通常のUPDATE文では返り値として0が戻るはずですが、MySQL5.0 PHP5 PEAR(DB)では1が返ってしまいます。
  • このため、判定のためにif($res==0)としても正しく判定できず、困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>if($res==0)として判定にひっかっかってくれないのかが不明 っていうか、$resについて質問のなかでなにか定義されてないんですが・・・ たぶん、単に成功時にリソースの戻り値を返しているのであって updateされたかどうかなんて見ていないんじゃないですかね? 失敗したのではなく0件のアップデートが成功したという考え方です 逆に$res==0の判定できるというのは何かにかいてありましたか?

n-yuuki
質問者

お礼

ようやく解決しました。 UPDATEの返り値をどうこうするってのはダメそうなので、 ※ifで判定はできないので、 if($db->affectedRows==0){ } とすれば上手くいきました。 お手数お掛けしました。

n-yuuki
質問者

補足

度々恐れ入ります。 $sql = "UPDATE master SET xxx={$xxx}+1 WHERE id={$id} AND xxx={$xxx}"; $res = $db->query($sql); //$dbは、PEARのDBオブジェクトが入ってます。 if($res==0){ //ここにはUPDATEできなかった場合の処理 //rollback() }else{ //アップデートできた場合の処理。 //commit() } ※補足としては、フィールドxxxに通番値を格納していまして、 この値が、UPDATE前(事前にSELECTされた時)の値と、UPDATEする直前の値と比較して、 同時実行制御を狙っています。 それが、WHERE id={$id} AND xxx={$xxx}";  のxxxの比較と考えています。 ※{$xxx}は事前のSELECT時に通番を格納しています。 xxx={$xxx}ならば、UPDATEが成功し、 if($res==0)が未成立となって、つまり更新が行われていると判断して、 commit()しようと考えています。 ですが、そもそも、UPDATEの返り値をifで判定するのがおかしいのかと思いました。 ただ、このUPDATEの成功・不成功を元にする組み方は書籍を参考にしております。 もし、UPDATEの結果をifで判定してはダメなら、別の手段を考えようと思いますが、 なかなか上手い具合に思いつかなくて・・・。 度々の補足申し訳ございません。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

mysql_affected_rows()をつかってみては?

参考URL:
http://www.php.net/manual/ja/function.mysql-affected-rows.php
n-yuuki
質問者

補足

回答ありがとうございます。 早速mysql_affected_rows()を使って、 直近のUPDATEを調査しました。 すると、質問にあります、WHERE以下に該当しない場合のUPDATEは、 きちんと該当なしして0を返してくれました。 やはり、UPDATEは正確に作動しているようです。 となると、 なぜ、print_r()にて、UPDATEクエリの結果を出力したら1が返るのかと、 if($res==0)として判定にひっかっかってくれないのかが不明となります。 ※$resはUPDATEのクエリ結果がはいります。 ※$resにはUPDATEに該当しない場合(0を期待する場合)の判定です。 ん~~ 他に思い当たることはございませんでしょうか? お手数おかけします。

すると、全ての回答が全文表示されます。

関連するQ&A