如何将表单中复选框的值保存到单个MySQL字段中?

时间:2010-01-23 10:51:33

标签: php sql mysql html

我有一个表格,我有很多音乐流派。艺术家可以在很多类型下演唱。我把这些类型放在复选框中。现在我需要将复选框的值存储到单个字段中。

有些人可以帮我解决一些代码片段,因为我是php编程的新手吗?

5 个答案:

答案 0 :(得分:4)

一般来说,你不应该这样做。您的数据库不会是normalized,这样就很难在类型字段上构建查询。

如果您有一个名为artists的表和一个名为genres的表,那将是一个更好的主意。然后,您将在另一个表artists_genres中定义艺术家和流派之间的关系,该表只包含artist_idgenre_id。你仍然可以为同一位艺术家提供多种类型。

例如,考虑下面定义的表结构:

 TABLE artists
 -------------

 artist_id          name             surname
 1                  Alicia           Keys
 2                  Mariah           Carey
 ...


 TABLE genres
 ------------

 genre_id           name
 1                  R&B
 2                  pop
 3                  hip hop
 4                  dance
 ...


 TABLE artists_genres
 --------------------

 artist_id          genre_id
 1                  1
 1                  2
 1                  3
 2                  1
 2                  2 
 2                  4
 ...

在这种情况下,您可以构建简单的查询,例如:

SELECT 
    artists.name, artists.surname
FROM
    artists
INNER JOIN
    artists_genres ON (artists_genres.artist_id = artists.artist_id)
INNER JOIN
    genres ON (genres.genre_id = artists_genres.genre_id)
WHERE
    genre.name = 'pop';

如果您的艺术家的类型存储在artists表中的单个字段中,则很难实现上述目标。除了困难之外,它可能会很慢而且效率低下,特别是如果你有很多记录的话。

答案 1 :(得分:2)

为什么要在单个字段中存储多个值 - 这会使搜索/检索不必要地痛苦。

使用每个流派的字段,或者更好地使用'genres'表和'artist_genres'查找表。

答案 2 :(得分:1)

您可以使用serialize / unserialize,但不应将序列化数据保存到数据库中。

您将无法使用数据库功能(搜索,订购等),即

答案 3 :(得分:1)

您可以序列化数据,例如:

<input type="checkbox" name="genre[]" value="Genre1"/>
<input type="checkbox" name="genre[]" value="Genre2"/>
<input type="checkbox" name="genre[]" value="Genre3"/>

PHP:

// Don't forget to escape the POST-values
$genre = serialize($_POST['genre']);
$query = "INSERT INTO database (genre) VALUES ('" . $genre . "')";
if(mysql_query($query)){
   // Success
}

您可以通过以下方式获取数据:

$genres = unserialize($serializedGenre);

答案 4 :(得分:0)

MySQL有一个SET数据类型,可以很好地将一组复选框存储在一个列中。