1

コンマ区切りのタグのリストを受け入れる HTML フォームがあります。これは、stackoverflow のものと同じように機能します。各ユーザーに属するタグのリストを含む MySQL テーブルもあります。ユーザーは自分のプロファイルでタグを更新できるので、リストに存在しなくなったタグを MySQL テーブルから自動的に削除したいと考えています。

たとえば、ユーザーは Web フォームで次のように入力します。

trance, house, electronica, dubstep, club

ただし、MySQLテーブルにはこれがあります

userid    tag
1         trance
1         house
1         electronica
1         dubstep
1         garage

MySQL からガレージ タグを削除し、代わりに「club」を追加したいと考えています。

上記の例ではこれらのタグが順番に表示されていますが、常にそうであるとは限らないことにも注意してください。たとえば、両方で配列のインデックス位置に依存することはできません。

foreach を使用してカンマ区切りのリストをループし、delete ステートメントを生成して、すべてのタグを最初から再挿入することもできると思いますが、おそらくこれを行うためのより良い方法があると思います。

ご指導ありがとうございました。

デイブ

4

2 に答える 2

0

(適切にエスケープして引用符を付けた後) コンマ区切りのリストを NOT IN()句に配置しDELETE、次のようなステートメントで使用するだけです。順番は関係ありません。

DELETE FROM tags WHERE userid = 1 AND tag NOT IN ('trance', 'house', 'electronica', 'dubstep', 'club');

コンマ区切りの値をエスケープして引用符で囲む方法は、使用しているデータベース API によって異なります。これは、PDO、MySQLi、または古い (そして間もなく非推奨になる)mysql_*()関数です。

タグを 1 つの列に CSV リストとして保存するのではなく、行ごとに 1 つのタグを保存することで正しいことを行ったことに注意してください。

于 2012-06-16T13:31:06.430 に答える
0

仮定

  • インタレスト名には noc カンマを使用できますが、
  • テーブルに UNIQUE INDEX(userid,tag) があります

のようなことをする

$s="trance, house, electronica, dubstep, club";
$userid=1;

$s=explode(',',$s);
$i=0;
foreach($s as $ss) {
  $ss=trim($ss);
  //Escape the string according to your DB framework
  //e.g. $ss=mysql_escape_string($ss);
  $s[$i++]=$ss;
}

$ss=implode("','",$s);
$sql="DELETE FROM tablename WHERE userid=$userid AND tag NOT IN('$ss')";
//Run $sql accodring to your DB framework

if (sizeof($s)>0) {
  $i=0;
  foreach($s as $ss) $s[$i++]="'$userid','$ss'";
  $ss=implode('),(',$s);
  $sql="INSERT IGNORE INTO tablename VALUES ($ss)";
  //Run $sql accodring to your DB framework
}
于 2012-06-16T13:41:28.510 に答える