1

以前、SQL + PHP の学習パスを進めているときに、多対多のリレーションシップ データベースでフェッチ クエリを実行する方法を尋ねたところ、次のかなり複雑な状況に遭遇しました。

次のテーブルを含むデータベースがあります。

Songs       Link        Tags
=======     =====       =========
Sid          Sid        Tid
Songname     Tid        Tagname

以下をチェックする一連のクエリを (HTML フォームを使用して PHP で) 作成するにはどうすればよいですか。

いくつかのタグを付けて新しい曲を入力します。Songs テーブルに Song を追加すると (かなり簡単です)、Sid が自動的にインクリメントされます。
タグも保存する必要がありますが、二重にする必要はありません。入力されたタグがまだタグ テーブルにないかどうかを確認する方法をどのように作成しますか? 追加しない場合は追加し、既に存在する場合はスキップします。
その上、リンク テーブルにも (自動的かつ正確に) 情報を入力する必要があります。新しい Sid は、タグ テーブルから新しく追加された/古いタグにリンクする必要があります。

この複雑な一連のクエリが可能かどうかさえわかりませんが、これを手作業で行うと急速に制御不能になるため、自動化された方法が適していると考えました。

これまでのところ、テストするコードの次の部分があります (コードは、私が何をしようとしているのかを説明するためだけであるため、この時点では明らかにあまり機能しません)。

<?php

if(isset($_POST['song']) && isset($_POST['tags'])){
$song = $_POST['song'];
$temptag = $_POST['tags'];

$tags = explode(",", $temptag);

$connection = mysql_connect("servername","db","password");
if (!$connection)
  {
  die('Could not connect: ' . mysql_error());
  }

  $query = "INSERT INTO Songs VALUES ('','$song')"; #add song
  mysql_query($query);

  # now for the tags...
  mysql_close($connection);
  echo "Song added";
}
else{
?>

<form action="add.php" method="post">
<input type="text" name="song" /> <br/>
<input type="text" name="tags" value="tag1,tag2,tag3" /> <br/>
<input type="submit" value="add song" />
</form>
<?php
}
?>

前もって感謝します。

4

1 に答える 1

2

曲を挿入した後にこれを追加します

$song_id = mysql_insert_id();
$tags = explode("," , $_POST['tags']);
foreach($tags as $tag) {
    // check if the tag already exists
    $res = mysql_query("SELECT * FROM `Tags` WHERE `Tagname` = '".$tag."' LIMIT 1");
    if(mysql_num_rows($res) == 0) {
        // if it doesn't exist, we add it
        mysql_query("INSERT INTO `Tags` VALUES ('' '".$tag."')");
        // get the last id inserted
        $tag_id = mysql_insert_id();
    } else {
         // if found, get it's id
         $tag = mysql_fetch_assoc($res);
         $tag_id = $tag[0]['id'];
    }
    // linkage
    mysql_query("INSERT INTO `Link` VALUES ('".$song_id."', '".$tag_id."')");
}
于 2012-06-08T13:24:33.277 に答える