2

ユーザー アカウントのフォームの一部で、MySQL に保存されている各 $tag をカンマで区切った興味 ($tags) を人々に尋ねます。

各 $tag には ID が与えられ、別のテーブルがユーザーの一意の ID と $tag ID をリンクします。

これはすべてうまく機能します-絶対に理想的ですが、タグを何千回も複製したくありません。たとえば、多くの人が興味として「ジム」と入力します。一意の ID を持つ新しい 'gym' $tag を追加し続けるのは無駄に思えますが、一度 $tag として入力されると、その $tag ID は、たまたま 'ジム'。それは理にかなっていますか?

私の現在のコードは以下 (サニタイズされた $_POST からの $tags) であり、2 つのテーブルに挿入されています。

1.tag_id には $tag のタグ フィールドがあり、それぞれが一意の ID を生成します。2.tag_relation は、ユーザー ID と生成されたタグ ID を一致させます。

$tags = strtoupper($tags);$tags= preg_split('/\,/', $tags);
foreach ($tags as $ind) 

{
$sql = "INSERT INTO tag_id (tag) VALUES('$ind')";
$result=mysql_query($sql);
}

foreach ($tags as $ids) 
{
$sql = "SELECT * FROM tag_id WHERE tag = '$ids'";
$result=mysql_query($sql);
$idinfo=mysql_fetch_assoc($result);
$id=$idinfo['t_id'];

$sql = "INSERT INTO tag_relation (user_id, tag_id) VALUES ('$user_id', '$id')";
$result=mysql_query($sql);
}

だから私の質問は、tag_id テーブルの $tags を複製しないように上記を変更できますが、そのテーブルの既存の $tags を tag_relation のユーザー ID と一致させることはできますか?

4

1 に答える 1

1

UNIQUE列にインデックスを作成する必要がありtag ます。その後、 を使用INSERT IGNOREして新しいタグを挿入できますが、テーブルに既に存在する場合は重複キーの警告を抑制できます。

CREATE UNIQUE INDEX idx_tag_unique ON tag_id (tag);

タグを挿入する場合:

INSERT IGNORE INTO tag_id (tag) VALUES ('$ind');

もちろん、そうする前に、重複するタグ値の既存のテーブルを削除する必要があります。ただし、値がすでに存在する場合はLAST_INSERT_ID()使用できません。INSERT IGNOREしたがって、確実に取得するにtag_idは、現在行っているようにクエリを続行する必要があります。

ところで、タグ値が$tagsユーザー入力に由来する場合は、SQL インジェクションに対して既にエスケープされていると想定しています。mysql_real_escape_string()そうでない場合は、必ずループ内で呼び出してください。mysql_*()また、パラメーター化されたクエリをサポートする MySQLi や PDO などの関数よりも新しい API への移行を検討してください。

于 2012-10-25T20:39:00.640 に答える