2011-10-26 12 views
2

MySQLの更新ステートメントが成功したかどうかのチェックに問題があります。私はユーザーの電子メールを更新したいと思います。しかし、彼らはトークンで自分自身を認可する必要があります。私はすでにmysql_affected_rows buを使用していました。ユーザが以前にデータベースにあったのと同じ電子メールを送信した場合、影響を受ける行は1ではなく0になります。 新しい電子メールがあっても、前と同じですか?PHPとMySQL更新された行を確認してください

UPDATE users SET email = '".$email."' WHERE token = '".$token."' 
+1

はhttp://stackoverflow.comで説明/ questions/1188232/weird-behaviour-with-mysql-affected-rows-in-php – jprofitt

+0

私はあなたがここで達成しようとしていることを理解していません。人々が同じ電子メールを2回も選択できないようにしたいのですか? –

+2

@Truth:私の推測では、OPが* success *メッセージを返したいのは、トークンが一致した場合、クエリによって実際の変更*が行われたかどうかです。 – grossvogel

答えて

1

This user contributionmysql_info()呼び出しからを一致行の数を抽出するハック方法を示しています。しかしは実際にはハッキーです。 (EDIT:another versionはまだハックより一般的ですが、どのmysql_infoため、ユーザノートにあります)

私はどうなるのかは、別のクエリを使用している:
"select count(token) as matches from users where token = $token"

+0

私はオプションを知っていますが、1つのクエリを実行する方法があるかどうかを調べていました。 – user1013338

+0

@ user1013338:ここに記載されている2つの方法以外に方法はありません。ストアドプロシージャやmysqli_multi_query()を使用して、データベースへの単一の呼び出しで情報を収集することができます。 – grossvogel

-1

mysql_affected_rowsを使用できます。それがここに文書化されている:exapmleについてはhttp://php.net/manual/en/function.mysql-affected-rows.php

を:

mysql_query("UPDATE users SET email = '".$email."' WHERE token = '".$token."'"); 
echo "Rows with that token: ".mysql_affected_rows(); 
+0

OPはトークンが一致するが、提供される電子メールが新しいものではない場合に関係します。この場合(OPは* success *とみなされます)、mysql_affected_rows()は0を返します。 – grossvogel

+0

あなたは間違っていると思います。彼は尋ねる: "新しい電子メールが以前と同じであっても、そのトークンを持つ行がユーザーに存在するかどうかを確認する方法はありますか?"彼は、「新しいものが以前と同じであっても」と言います。 mysql_affected_rows()が0を返した場合、ユーザはそのトークンを持ちません。彼が求めているのとは全く反対です。 – gustavotkg

+0

リンク先のマニュアルページに次のように書かれています: "UPDATEを使用すると、MySQLは新しい値が古い値と同じ列を更新しません。これはmysql_affected_rows()が実際に一致する行数文字通りクエリの影響を受けた行の数。 mysql_affected_rows()が0を返すという理由だけで、そのトークンを持つ行がないことを意味するわけではありません。クエリによって行が変更*されていないことのみ。 – grossvogel

-1

if(mysql_affected_rows() == 1) //成功

+0

OPはトークンが一致するが、提供された電子メールが新しいものではない場合に関係します。この場合(OPは* success *とみなされます)、mysql_affected_rows()は0を返します。 – grossvogel

0

代わりにmysql_affected_rowsに依存するのではなく、代わりにするmysql_query関数の戻り値に依存することは可能でしょうか? mysql_affected_rows用PHPマニュアル

例えば

if (mysql_query ("UPDATE `users` 
SET `email` = '".$email."' 
WHERE `token` = '".$token."';")) { // success 
} else { // fail 
} 
+0

一致する行がなければ、クエリは成功します。構文エラー、不明なテーブル名や列名、キー違反などがある場合にのみ失敗します。 – grossvogel

+0

本当ですが、OPが達成しようとしていることは完全にはっきりしていません。 問題がある場合は、UPDATEクエリの前にSELECTクエリを実行し、mysql_num_rowsを使用して行数を取得し、一致する行の正確な画像を取得する必要があると思います。 – DaveL

関連する問題