0

使用時にユーザーをデータベースに追加するPHPファイルをチェックインする方法はありますか?IE

ジョンは私のプログラムを使用しており、エラーが発生したときに情報を取得してデータベースに送信します。このプログラムには、名前、電子メール、およびコンピューターのOSが含まれています。

これですべてですが、johnがプログラムを再開すると、行の別の重複コピーがデータベースに送信されます。これは役に立たず、役に立たない情報でいっぱいになります。

現在使用されているコード:

$connect = mysql_connect('host','user','pass') or die("Error");
mysql_select_db('DB') or die("Error");
$Name    = $_GET['name'];
$Email   = $_GET['email'];
$OS      = $_GET['os'];
$add     ="INSERT INTO UserDB(Name, Email, OS, ) VALUES ('$Name', '$Email', '$OS')";
mysql_query($add,$connect);
mysql_close($connect);
4

3 に答える 3

4

データベースに一意性制約または適切な主キーが必要です。次に、コードが重複する行を挿入しようとすると、データベースでエラーが発生し、それを処理できます。古い行を新しい行に置き換えたい場合は、アップサートが必要になる場合があります。

主キーの選択に関する良い記事があります。

于 2013-01-04T13:24:00.043 に答える
0

多数の追加ロジックを作成せずに、データベースに一意のキーの関連付けを作成できます。メールアドレスは一意であるため、次のように行うことができます。

このSQLを実行する

これにより、一意のキーが追加され、電子メールアドレスへの複数の挿入が禁止されます。

ALTER TABLE `UserDB` ADD UNIQUE(`Email`);

PHPコードクエリを変更する

挿入が行われなかった場合は、このクエリを使用して更新します。

if(mysql_insert_id() < 1) {
    $add = sprintf(
            "UPDATE `UserDB` SET `Name`='%s', `Email`='%s', `OS`='%s' WHERE `Email`='%s'",
            $Name,
            $Email,
            $OS,
            $Email
    );
}

SQLインジェクションに対して非常に脆弱なmysqliまたはPDOに切り替えてください!!

于 2013-01-04T13:27:54.407 に答える
-1

データベース内の行の正確なコピーを作成することはできません。常に一意のIDが必要です。これは多くの場合、新しい行ごとに自動的にインクリメントされる数値です。それがテーブルに当てはまる場合は、現在のユーザーが新規か既存かをデータベースに問い合わせるだけです。何かのようなもの:

$query = "SELECT id FROM UserDB WHERE Name='$name' AND Email = '$email'";
$result = mysql_query($query);
if(mysql_num_rows($result) == 0)
//Add user
else
//Update user? Or something else
于 2013-01-04T13:24:38.297 に答える