2011-06-19 11 views
1

何らかの理由で挿入/更新チェックが挿入されることがあります。値userIDは値を持っているので、これで何が起きているのか分かりません。何か案は?PHP/SQLは挿入物のみを更新しません

$result = mysql_query("SELECT * FROM users where userID = $userID "); 
if (mysql_num_rows($result) > 0) { 
    mysql_query("UPDATE users SET firstName='$firstName', lastName='$lastName', 
      birthday='$birthday', update='$today', accessToken='$accessToken', emailOne='$emailOne' WHERE userID='$userId'"); 
} else { 
    mysql_query("INSERT INTO users (userID, firstName, lastName, birthday, updated, accessToken, emailOne) 
       VALUES ('$userId', '$firstName', '$lastName','$birthday', '$today', '$accessToken', '$emailOne')"); 
} 
+0

このロジックを代わりにルーチンに入れることを考えましたか?私はここでエラーが表示されませんが、頭痛の良いビットを少なくすることがあります。 – MoarCodePlz

+1

まず、基本的なデバッグが必要です。 '$ userID'には何が入っていますか? phpMyAdminまたは同様のツールでクエリを実行するとどうなりますか? –

+2

あなたがそれをしている間あなたの質問をエスケープするのはどうですか... – Endophage

答えて

4

あなたはINSERT ... ON DUPLICATE KEY UPDATEをやってオフにはるかに良いだろう。あなたのバージョンは競争条件の対象です。 SELECT *を実行してから更新/挿入クエリを実行しようとする間に、別のスクリプトがすでに同じID番号を挿入している場合、スクリプトが壊れてしまう可能性があります。これにより、1つのクエリでデータベースの負荷も軽減されます。

また、mysql_real_escape_string()でクエリ内のすべての変数を渡していない場合は、Little Bobby Tablesからアクセスしている可能性があります。

1

レコードを挿入する方法から、userIdフィールドはvarchar(または英数字)フィールドであるようです。だからあなたの質問は、それが数字としてそれを探しているので、それにマッチするデータを読むことは決してありません。あなたはとして再書き込み最初の行に持っている:

$result = mysql_query("SELECT * FROM users where userID = '$userID' ");

それがお役に立てば幸いです。

関連する問題