IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nefunkční checkbox

Aktivity
Avatar
Jan Štrobl
Člen
Avatar
Jan Štrobl:12.5.2017 9:17

Zdravím, mám formulář, který mi zapisuje data do databáze. Součástí formuláře jsou i checkboxy a ty jediné dělají problémy.

<legend>Oblíbené pečivo?</legend>
<input type="checkbox" name="pecivo" value="Rohlíky">Rohlík<br />
<input type="checkbox" name="pecivo" value="Chléb">Chléb <b />
<input type="checkbox" name="pecivo" value="Houska">Houska <br />
<input type="text" name="pecivo" placeholder="jiné">

Když zaškrtnu jakýkoliv checkbox tak se do databáze nic nezapíše. Ovšem když něco napíšu do "jiné", tak se to zapíše.

PHP

if ($_POST)
                {
                        Db::query('
                                INSERT INTO obchod (pecivo, ovoce, zelenina, maso)
                                VALUES (?, ?, ?, ?)
                          ',  $_POST['pecivo'], $_POST['ovoce'], $_POST['zelenina'], $_POST['maso'] );

                        echo('<p>Dotazník byl úspěšný.</p>');
                };

 ?>

Zkoušel jsem i

.. name="pecivo[]"

ale bez výsledku. Prosím o radu co zase kazím. Díky předem.

Editováno 12.5.2017 9:19
 
Odpovědět
12.5.2017 9:17
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Jan Štrobl
Honza Bittner:12.5.2017 10:00

Pokud chceš mít z PHP možnost načítat více možností z jedné skupiny inputů, dělá se to přes [] takto

<input type="checkbox" name="skupina[]" value="value1" />Možnost 1<br />
<input type="checkbox" name="skupina[]" value="value2" />Možnost 2<br />
<input type="checkbox" name="skupina[]" value="value3" />Možnost 3<br />

V PHP se ti pak do $_POST['skupina'] uloží pole teď hodnot, může to například takto vypsat:

<?php
if (isset($_POST['skupina'])) {
    $optionArray = $_POST['skupina'];
    for ($i=0; $i<count($optionArray); $i++) {
        echo $optionArray[$i]."<br />";
    }
}
?>

Pokud chceš vždy jen jednu možnost z výběru, jak chápu podle tvého SQL dotazu, tak použij type="radio".

Nahoru Odpovědět
12.5.2017 10:00
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Honza Bittner
Jan Štrobl:12.5.2017 10:24

Když použiji [] tak se mi do databáze zapíše "Array".
Zároveň mi to hodilo hlášku "Notice: Array to string conversion in /home/users/.­../Db.php on line 61.
Musí tam dělat bordel ten textový input.

Ne, zde chci mít možnost volby více věcí (rohlík,houska).

 
Nahoru Odpovědět
12.5.2017 10:24
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Jan Štrobl
Honza Bittner:12.5.2017 10:43

No, chová se to přesně tak, jak jsem popsal, že se to má chovat...

Tvoje $_POST['pecivo'] je pole, to znamená, že ho nemůžeš uložit jako text. Pokud chceš pospojovat položky pole, čímž mimochodem nedodržíš atomicitu databáze, použij třeba PHP funkci join(),

echo join(",", $_POST['pecivo']);

Možná by bylo rozumné si něco o databázích a PHP naučit, ať nevaříš ze zakalené vody. :-)

Editováno 12.5.2017 10:43
Nahoru Odpovědět
12.5.2017 10:43
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na Jan Štrobl
Mario Brunmayr:12.5.2017 13:20

Kdyby ti řešení s join nefungovalo tak já ve svoji aplikaci tento problém řešim tímto způsobem.

$pecivo = implode(" ",$_POST['pecivo']);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
12.5.2017 13:20
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Mario Brunmayr
Jan Štrobl:12.5.2017 13:52

Tohle pomohlo, je to funkční ovšem na začátku dokumentu je hláška
Notice: Undefined index: pecivo in /home/users/..
Warning: implode(): Invalid arguments passed in /home/users/...

Ale formulář se zobrazí, a když jej vyplním a odešlu tak chybovka zmizí.

 
Nahoru Odpovědět
12.5.2017 13:52
Avatar
Odpovídá na Jan Štrobl
Mario Brunmayr:12.5.2017 14:04

Notice: Undefined index: pecivo in /home/users/.. toto je jen upozornění že jsi předem nedefinoval pečivo. Osobně jsem smysl toho varování nikdy nepochopil a vyřešíš ho tak že kod bude vypadat takto.

$pecivo = "";
$pecivo = implode(" ",$_POST['pecivo']);

Druhá hláška ti řiká něco ve smyslu že pecivo není definován jako array. Skus tam vložit toto.

$pecivo = array();
$pecivo = "";
$pecivo = implode(" ",$_POST['pecivo']);

Trochu si pohraj s prvním a druhým řádkem a měl by jsi to zprovoznit bez chyb ale jsem amatér, takže nic nezaručuju :-) .

 
Nahoru Odpovědět
12.5.2017 14:04
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Mario Brunmayr
Jan Štrobl:12.5.2017 14:06

ZKusím to první, při nejhorším vypnu na hostingu vyhazování erorů :D
To druhé jsem vyřešil takto

$pecivo = implode(', ', (array)$_POST["pecivo"]);
 
Nahoru Odpovědět
12.5.2017 14:06
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Mario Brunmayr
Honza Bittner:12.5.2017 15:42

Ta hláška se dá správně vyřešit pomocí isset, jak jsem psal někde nahoře v ukázkovém použití, ne?

Nahoru Odpovědět
12.5.2017 15:42
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Mario Brunmayr
Honza Bittner:12.5.2017 15:44

Trochu nechápu to tvé "Kdyby ti řešení s join nefungovalo", jelikož join() a implode() je to samé (aliasy). http://stackoverflow.com/…4016/3281252

Nahoru Odpovědět
12.5.2017 15:44
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na Honza Bittner
Mario Brunmayr:12.5.2017 16:58

Negoogloval jsem činost join() jen jsem viděl dotaz na problém, který jsem taky řešil. Promiň za sebrané řešení :-( .

 
Nahoru Odpovědět
12.5.2017 16:58
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Mario Brunmayr
Honza Bittner:12.5.2017 18:01

V pohodě. Řešení mi je jedno, kdybych chtěl řešení tak si to přepnu sám a nikomu si nestěžuji.

Jen jsem konstatoval, že to je to samé. ;)

Nahoru Odpovědět
12.5.2017 18:01
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
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 12 zpráv z 12.