0

ユーザーが選択できるオプションの数が正確にわからない場合に、選択したアイテムをデータベースに挿入する方法について知りたいです。

次のコードがあるとします。

<select name="foo[]" multiple="multiple">
     <option value="dog">Dog</option>
     <option value="cat">Cat</option>
     <option value="fish">Fish</option>
</select>

<?php

$pets = $_POST['foo'];

$query = mysql_query("INSERT INTO `pets` (`pet1`, `pet2`, `pet3`) VALUES ('".$pets[0]."', '".$pets[1]."',  '".$pets[2]."')");
?>

そして、ユーザーはオプション「dog」、または「dog」と「cat」、または「cat」と「dog」などのみを選択します。基本的に、3つの任意の組み合わせ。

可能なすべてのオプションを受け入れるようにクエリをハードコーディングしてから、「」などのWHERE句を指定する必要がありますWHERE $pets != ''か?

助けていただければ幸いです。

4

2 に答える 2

1

まず第一に、非推奨であるため、 mysql_*関数を使用しないでください

それらを複数の行に挿入する必要がある場合は、このようなループを使用するだけです。

foreach($pets as $pet)
{
      Insert to db each single pet in different row 
}

それらを同じ行に挿入したい場合は、

$toInsert = implode(',',$pets);

あなたがn個の列を持っているなら、私はあなたが2番目のオプションとペットの数のためのimplode関数を使うことができないと思います

$petsColumns = array(); 

for($i = 1; $i <= count($pets); $i++) 
     $petsColumns[] = "pet".$i ; 

$petsColumnsString = implode(',',$petsColumns); 

そしてそれらをクエリに連結します

希望があれば、これはあなたがやろうとしていることの助けになるでしょう

于 2013-02-12T19:28:25.710 に答える
0

この状況にはいくつかのオプションがあります。

まず、データをシリアル化された文字列として保存できます。これは、PHP側のデータのみを使用する必要がある場合は問題ありません。主な欠点は、MySQLがデータを実際に理解しないため、PHPに到達する前にデータをフィルタリングできないことです。

2番目のオプションはSETデータ型列です。データ型を使用するSETと、データベースがデータをより認識できるようにしながら、可能なオプションを任意に組み合わせることができます。には64人のメンバーの制限がありSETます。このSETオプションは最小のオプションですが、列のフィルタリングは最適ではありません。可能な値を変更することも少し難しいです。

3番目のオプションは、値を別のテーブルに正規化することです。ユーザーテーブルとペットテーブルがあります。petsテーブルには、ユーザーID、pet列、およびテーブルの一意のIDが含まれます。次に、ユーザーが選択したエントリごとに、petsテーブルに行を挿入します。これにより、ユーザーごとにできるだけ多くのエントリを作成でき、データを簡単にフィルタリングできます。これは通常、最善の方法です。可能なペットの値を3番目のテーブルに正規化することもおそらく良い考えです。そのテーブルには、ペットID、ペット名、およびその他の必要なものがすべて含まれます。2番目のテーブルは、ユーザーとペットの間のブリッジとして機能し、ユーザーID、ペットID、およびテーブルの一意のIDを持ちます。

于 2013-02-12T19:22:46.890 に答える