Nasıl tek bir MySQL alana bir biçimde onay kutularını değerlerini kaydedebilirim?

5 Cevap php

Ben birçok müzik türü var bir form var. Bir sanatçı birçok türler altında şarkı edilebilir. Ben onay kutularını türleri koyduk. Şimdi ben tek bir alanda için onay kutularını değerlerini saklamak gerekir.

I php programlamaya yeni olduğum gibi bazı tek bazı kod parçası ile bana yardımcı olabilir misiniz?

5 Cevap

Genel olarak bu şekilde yapmamalıyız. Sizin veritabanı normalized olmaz, ve o zor tarz alanında sorguları oluşturmak için yapmak istiyorum.

Bu artists adında bir tablo olurdu daha iyi bir fikir olabilir, ve adında bir tablo genres. Olur Sonra sadece bir artist_id tutan hangi tablo, artists_genres başka bir tabloda sanatçı ve türler arasındaki ilişkiyi tanımlamak ve bir genre_id olur. Hala aynı sanatçının birden fazla türler olması mümkün olacaktır.

Aşağıda tanımlandığı gibi Örneğin, tablo yapısını göz önünde bulundurun:

 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
 ...

Bu durumda, gibi basit sorguları oluşturmak mümkün olacaktır:

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';

Yukarıdaki sanatçıların türler artists tablodaki tek bir alanda depolanan durumunda elde etmek oldukça zor olacaktır. Ayrı zorluk, muhtemelen birçok kayıtları sahip olacak, özellikle, yavaş ve verimsiz olacaktır.

Neden tek bir alanda birden fazla değer saklamanıza istiyorum - Bu arama / alma gereksiz yere acı yapacaktır.

Türe başına bir alan kullanmak, ya da daha iyisi bir 'türün kendine masa ve' artist_genres 'arama tablosunu kullanmak ya.

Sen serialize / unserialize kullanabilirsiniz, ancak bir veritabanına tefrika verileri kaydetmek gerekir.

Sen yani (vb, sipariş, arama) üzerinde veritabanı fonksiyonları kullanmak mümkün olmayacaktır

Örneğin, verileri serialize olabilir:

<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
}

Sen ile verileri geri alabilirsiniz:

$genres = unserialize($serializedGenre);

MySQL tek bir sütun onay kutularını bir dizi depolamak için iyi bir aday olacağını bir SET veri türü vardır.