dポイントプレゼントキャンペーン実施中!

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

いつもお世話になります。

MySQL5.0 PHP5 PEAR(DB)にて開発中です。

"UPDATE master SET xxx={$xxx}+1 WHERE id={$id} AND xxx={$xxx}"

上記クエリを実行し、
WHERE以下に該当しないない場合は、該当データー無しとして別の処理を行う予定です。

該当すればそのままUPDATEでいいのですが、
ここで該当無しとなれば、通常UPDATEの場合は返り値として0が戻るはずなのでが、
どうしても1が戻ってしまいます。
その為、if($res==0) として判定できず困っております。
※もちろん、該当無しのUPDATEの場合は、テーブル内のデーターは変更されていません。

どなたか回答をお寄せ下さい。
宜しくお願いします。

A 回答 (2件)

>if($res==0)として判定にひっかっかってくれないのかが不明



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

逆に$res==0の判定できるというのは何かにかいてありましたか?

この回答への補足

度々恐れ入ります。

$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で判定してはダメなら、別の手段を考えようと思いますが、
なかなか上手い具合に思いつかなくて・・・。

度々の補足申し訳ございません。

補足日時:2010/10/15 14:55
    • good
    • 0
この回答へのお礼

ようやく解決しました。

UPDATEの返り値をどうこうするってのはダメそうなので、
※ifで判定はできないので、

if($db->affectedRows==0){

}

とすれば上手くいきました。
お手数お掛けしました。

お礼日時:2010/10/16 03:47

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



参考URL:http://www.php.net/manual/ja/function.mysql-affe …

この回答への補足

回答ありがとうございます。

早速mysql_affected_rows()を使って、
直近のUPDATEを調査しました。

すると、質問にあります、WHERE以下に該当しない場合のUPDATEは、
きちんと該当なしして0を返してくれました。
やはり、UPDATEは正確に作動しているようです。

となると、
なぜ、print_r()にて、UPDATEクエリの結果を出力したら1が返るのかと、
if($res==0)として判定にひっかっかってくれないのかが不明となります。
※$resはUPDATEのクエリ結果がはいります。
※$resにはUPDATEに該当しない場合(0を期待する場合)の判定です。

ん~~
他に思い当たることはございませんでしょうか?
お手数おかけします。

補足日時:2010/10/15 13:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!