NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Uložení checkbox do databaze

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
michal Čepelák:31.10.2017 10:47

Zdravím,
potřeboval bych poradit mám tři checkboxi

<input type="checkbox" name="prirazeni" value="1" >Základní desky<br/>
                   <input type="checkbox" name="prirazeni" value="2" >Synot<br/>
                   <input type="checkbox" name="prirazeni" value="3" >Ostatní hardware<br/>

a potřeboval bych aby při označení třeba všech třech aby se mi v databazi v jendom sloupci s názvem checkbox se mi uložili všechny tři hodnoty 1,2,3 jedna se mi tam uloží ale ty další už ne

Db::connect();
        $sqls = Db::query('INSERT INTO typ (checkbox) VALUES (?)', $_POST['checkbox']);

Děkuji za rady

 
Odpovědět
31.10.2017 10:47
Avatar
Petr Langer
Člen
Avatar
Odpovídá na michal Čepelák
Petr Langer:31.10.2017 12:09

Udělej to tak že jeden checkbox bude mít hodnotu 4, druhej 2 a třetí 1 a do DB ukládej součet těch tří hodnot, podle toho který checkbox je zaškrtnutý

 
Nahoru Odpovědět
31.10.2017 12:09
Avatar
ConflictBoy
Člen
Avatar
ConflictBoy:31.10.2017 12:12

Jasně, protože máš stejný atribut name :)
Takže:

<input type="checkbox" name="prirazeni[]" value="1" >Základní desky<br/>
<input type="checkbox" name="prirazeni[]" value="2" >Synot<br/>
<input type="checkbox" name="prirazeni[]" value="3" >Ostatní hardware<br/>

A PHP kód bude třeba něco takovýho:

$sqls = Db::query('INSERT INTO typ (checkbox) VALUES (' . implode(',', $_POST['prirazeni']) . ')';

Pro budoucí studium si doporučuji pak ještě něco přečíst o SQL injection :)

Nahoru Odpovědět
31.10.2017 12:12
I'm programmer, I have no life :)
Avatar
Odpovídá na ConflictBoy
michal Čepelák:1.11.2017 11:10

ještě se zeptám mužu mít v databazi nastaveno int nebo tam musí být varchar? pokud chci vložit více záznamu vedle sebe pouze čísla
děkuji

 
Nahoru Odpovědět
1.11.2017 11:10
Avatar
ConflictBoy
Člen
Avatar
Odpovídá na michal Čepelák
ConflictBoy:1.11.2017 11:55

Varchar :) Int by bylo jen pro samostatnou číselnou hodnotu, pokud je to ale oddělené čárkou, ukládáš tam vlastně text.

Nahoru Odpovědět
1.11.2017 11:55
I'm programmer, I have no life :)
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na michal Čepelák
Petr Čech:1.11.2017 12:33

Ono není moc dobré ukládat víc záznamů do jedné buňky. Lepší je buď udělat extra tabulku, co bude skladovat 1:N relaci. To je tady ale docela overkill upřímně, takže ideální by bylo řešení od Petr Langer
Pokud přiřadíš hodnotám mocniny dvojky (nebo klidně trojky, pokud chceš dělat v trojkové soustavě :D ) a uložíš jejich součet. Pokud se budeš chtít dotázat, jestli měl ten checkbox zaškrtnutou hodnotu, zeptáš se:

if( intval($saved_value) &  IS_VALUE == IS_VALUE )
//nejsem si jist, jestli tam musí být to intval()

Samozřejmě si budeš muset definovat konstanty asi jako

const CHECK_MOTHERBOARDS=0;
const CHECK_SYNOT = 1;
const CHECK_OTHER_HW = 2;

nebo to můžeš načítat z DB, je to celkem jedno.

Jak to funguje: http://www.alanzucconi.com/…e-operators/ to je tedy pro C#, ale princip je stejný
To se dá dělat i v MySQL: https://dev.mysql.com/…nctions.html

Editováno 1.11.2017 12:34
Nahoru Odpovědět
1.11.2017 12:33
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:1.11.2017 12:40

Ještě proč je to lepší než řešení s ukládáním listu, tedy implode() a varchar:

  • Zabírá to méně místa. To je ale skoro zanedbatelné.
  • Pokud máme správně navrženou databázovou strukturu a důsledně používáme věci jako indexy a foreign keys, nemůže se nikdy stát, že budeme mít uložená data, co porušují integritu, např. nemáme odkazy na neexistující klíče. Pokud ale budeme takovou hodnotu ukládat jako seznam, může se stát, že nám třeba v polovině spadne skript, nevytvoří se korektně string, co tam máme uložit a problém je na světě. Pokud budeme mít ten sloupeček třeba jako UNSIGNED INT, vždy tam bude validní hodnota. A to i v případě, že tam dostaneme něco, co tam nepatří, potom to prostě bude 0. Proto je dobré také hodnotě 0 dávat význam None a pod.
Nahoru Odpovědět
1.11.2017 12:40
the cake is a lie
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.