0

私は mysql_affected_rows() を使用して、新しいレコードを入力する必要があるか、既存のレコードを更新する必要があるかを確認していますが、問題は、ユーザーが挿入を実行する既存のレコードとまったく同じデータを入力しようとした場合です。

$result = mysql_query("update Data set Score='$score',Comment='$_POST[Comments]' where Date='$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]' AND User='$_POST[UserID]';");
$last = mysql_affected_rows();

if ($last==0) {

    $result1 = mysql_query("INSERT INTO Data (User,Date,Score,Comment) VALUES ('$_POST[UserID]','$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]','$score','$_POST[Comments]')");

冗長なエントリを回避するにはどうすればよいですか

4

3 に答える 3

0

FOUND_ROWS()の代わりに を使用して、影響を受ける行の数を取得できますmysql_affected_rows()。後者は、変更されていない行もカウントします。

$result = mysql_query("update Data set Score='$score',Comment='$_POST[Comments]' where Date='$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]' AND User='$_POST[UserID]';");
$last = mysql_query("SELECT ROW_COUNT();");
$last = mysql_fetch_array($last);
...

参照: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

于 2011-09-05T02:14:33.943 に答える
0
  1. 出力を解析できmysql_info()ます(ただし、ソリューション自体は競合状態の問題の影響を受けます)
  2. ON DUPLICATE KEY UPDATE構文を使用して、一意のキーUser + Dateを作成し、単一のクエリで終了することができます。

    INSERT INTO `Data` (User,Date,Score,Comment)
    ('$_POST[UserID]','$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]','$score','$_POST[Comments]')
    ON DUPLICATE KEY UPDATE Score='$score',Comment='$_POST[Comments]'
    
于 2011-09-05T02:07:14.130 に答える
0

いくつかの解決策:

  1. 別のクエリを追加してデータが存在するかどうかを確認し、何らかのアクション (更新/削除) を実行するか、何も実行しないかを決定します。
  2. タイプ「TIMESTAMP」の「変更された」列を追加し、更新時に作成します-CURRENT_TIMESTAMP

私は最初のオプションで行きます。

ところで、挿入または不正な形式のクエリ文字列を防ぐために、投稿データ (mysql_real_escape_string) をエスケープする必要があります。

于 2011-09-05T02:07:19.947 に答える