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]."')");
?>

并且用户只选择选项“狗”,或“狗”和“猫”,或“猫”和“狗”等。基本上是三者的任意组合。

我是否必须对查询进行硬编码以接受所有可能的选项,然后指定一个 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 个列,我认为你不能使用第二个选项和 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 之前对其进行过滤。

第二个选项是SET数据类型列。数据类型允许您拥有可能的选项的SET任意组合,同时使数据库更加了解数据。有 64 个成员的限制SET。该SET选项是最小的选项,但列上的过滤不是最佳的。更改可能的值也有点困难。

第三个选项是将值标准化为单独的表。您将拥有 users 表和 pets 表。pets 表将包含用户 ID、宠物列和表的唯一 ID。然后,您只需为用户选择的每个条目在 pets 表中插入一行。这使您可以为每个用户拥有尽可能多的条目,并允许您轻松过滤数据。这通常是最好的方法。将可能的宠物值标准化到第三个表中可能也是一个好主意。该表将具有宠物 ID、宠物名称以及您可能想要的任何其他内容。然后,第二个表将充当用户和宠物之间的桥梁,具有用户 ID、宠物 ID 和表的唯一 ID。

于 2013-02-12T19:22:46.890 回答