3

バックエンドでphp-MySQLを使用するプロジェクトに取り組んでいます。閲覧するさまざまな記事があり、さまざまなカテゴリユーザーログインシステムに分類されています。
最近、ユーザーがウォッチリスト/ダッシュボードに記事を追加できるウォッチリスト機能を追加しました。次のテーブルがあります。

記事テーブル
article-id(int) Primary-Unique
cat(varchar)
name(varchar)
subCat(varchar)
description(varchar)
date added

users table
username(varchar) Primary-Unique
lname
fname Joined
-date

. ウォッチリストテーブル
article-id(int)
ユーザー名(varchar)
date_watch

ご覧のとおり、ウォッチリストテーブル
には一意のキーがありません(username + article-id)を一意のペアにしたいすべてのユーザー名に対して複数の article-id が存在し、その逆も同様なので、 行を挿入および削除
したいだけです。重複エントリを防ぐ方法を更新する必要はありませんか? 今までphpで行数をチェックしていました

"SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}"

で、もし

mysql_num_rows() >1(not allowed to insert) 

これは正常に動作しますが、誤って INSERT コマンドが実行された場合、エントリが重複
してしまいます。それを防ぐ方法は?
私はphpmyadminを使用しています

4

3 に答える 3

8

テーブルに一意のキーを追加するだけです。

ALTER TABLE `watchlist`
ADD UNIQUE INDEX `watchlist_unique` (`article-id`, `username`);

また、あなたが持っているものの機能を見て、上記の代わりにこれを使用して、それを主キーとして設定することを選択することもできます:

ALTER TABLE `watchlist`
ADD PRIMARY KEY (`article-id`, `username`);

どちらも、重複するエントリの挿入を防ぎます。

さらに、この場合に挿入したい場合は、INSERT IGNORE と ON DUPLICATE KEY を調べてみるとよいでしょう。両方の詳細については、「INSERT IGNORE」と「INSERT ... ON DUPLICATE KEY UPDATE」を参照してください。

于 2013-08-23T05:28:58.227 に答える
1

のようにしてみてください

$sql =  "SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}";
if(mysql_num_rows($sql) >=1) {
     //Prevent Insert 
} else {
     //Put your Insert query
}

または単に次IGNOREのように使用します

INSERT IGNORE INTO watchlist
    (article-id, username)
VALUES
    ({article-id}, {username}),

列をUNIQUE制約として使用していることを確認してください。そうでない場合は、次のように変更してください

ALTER TABLE `watchlist`
ADD UNIQUE INDEX `watchlist_unique`
(`username`,`article-id`);

を超えないレコードの確認atleastが必要です。11

また、プレフィックス で名前が付けられたすべての関数を提供する拡張機能全体が現時点で公式に非推奨であり、将来的に削除されるためmysql_*、ステートメントを避けるようにしてください。ext/mysql PHPmysql_*PHP v5.5.0

より適切に使用できる他の 2 つのMySQL拡張機能があります:MySQLiPDO_MySQLで、どちらも の代わりに使用できますext/mysql

于 2013-08-23T05:23:28.023 に答える
0

ユーザー名と記事 ID に一意のインデックスを作成できます。

ALTER TABLE watchlist ADD UNIQUE INDEX my_idx ( username, article-id);

その後、重複挿入は許可されません。

INSERT INTO ... ON DUPLICATE KEYまた、指定されたユーザー名と記事 ID のペアでエントリ内の特定のフィールドを更新するために、構文を使用して重複挿入を適切に処理することもできます。

于 2013-08-23T05:30:28.487 に答える