Autor Zpráva
kopi
Profil
Zdravím,
potřeboval bych od Vás poradit. V cyklu vypisuji checkboxy:
<input type='checkbox' class='flat-red' name='auto[".$row['id_auto']."]' value='1' checked>

Checkboxy potom zpracovávám:

$auta = array();
if(isset($_POST['auto'])) //jsou data pro 'auta' v postu
{ 
   
    $auta = array_keys($_POST['auto']); // do pole $auta uloz id auta, které byly zašktnuté
    
}

if(!empty($auta)) 
{
    foreach($auta as $autoId) 
    {
    
    //update tabulky
    $update = mysqli_query($conn,"UPDATE tabulka SET `sloupec`=$ValueCheckboxu WHERE id_auto=$autoId"); 
    
    }
}
            

Tohle celé mi funguje dobře až na jednu věc. Z pole checkboxů získávám $autoId a potřeboval bych získat i $ValueCheckboxu.

děkuji za každou radu
Tomášeek
Profil
kopi:
Proč tak složitě?

if (!empty($_POST['auto'])) {
    foreach ($_POST['auto'] as $key => $val) {
        // $key - klic auta
        // $val - hodnota ve value
    }
}
kopi
Profil
Tomášeek:
ale když si to takhle vypíšu, tak dostanu 0 => 1286, 1 => 1287.

Já bych potřeboval, aby $key bylo 1286 (id auta) a $val = 1 nebo 0, což je buď zaškrtnuto nebo ne.
Tomášeek
Profil
kopi:
Tak to nefunguje. Nezaškrtnuté checkboxy se neodesílají, vždy máš k dispozici jen ty odeslané. Pokud potřebuješ i neodeslané, musíš si je dopočítat, jsou to všechny - zaškrtnuté.
kopi
Profil
u každého checkboxu mám i <input type="hidden" name='auto[".$row['id_auto']."]' value='0'>.
Takže i nezaškrtnutý checkbox by se měl odeslat s hodnotou 0? Ale i kdyby to tak nebylo, tak stejně to není tak jak potřebuju.
V name checkboxu mám uložené ID, takže ve $val je uloženo to ID, ale value z checkboxu uložené není nikde.
Keeehi
Profil
kopi:
u každého checkboxu mám ...
Bohužel to jsme nemohli vědět, jehož vědecké koule jsou zrovna na renovaci po náročné zimní sezóně.
Zkus nám to sem prosím napsat vše, hezky a pořádně ať to z tebe nemusíme tahat po kouscích. Pak ti určitě budeme schopni poradit nějaké hezké elegantní řešení.
kopi
Profil
výpis checkboxů:
<input type='hidden' name='auto[".$row['id_auto']."]' value='0' />
<input type='checkbox' name='auto[".$row['id_auto']."]' value='1' checked>

zpracování checkboxů:
$auta = array();
if(isset($_POST['auto'])) //jsou data pro 'auta' v postu
{ 
   
    $auta = array_keys($_POST['auto']); // do pole $auta uloz id auta, které byly odeslané
    
}
 
if(!empty($auta)) 
{
    foreach($auta as $autoId) 
    {
    
      //update tabulky
      $update = mysqli_query($conn,"UPDATE tabulka SET `sloupec`=$ValueCheckboxu WHERE id_auto=$autoId"); 
    
    }
}

Takhle to mám teď. A prostě neumím přijít na to, jak do proměnné $ValueCheckboxu dostat hodnotu value z inputu. Pokud je zaškrtnutý value = 1, pokud není zaškrtnutý, odešle se value = 0.
Tomášeek
Profil
kopi:
Takže i nezaškrtnutý checkbox by se měl odeslat s hodnotou 0?
Checkbox se neodesílá, odesílá se nulový hidden.

Celkově se vyjadřuješ jak tatar. Dumpni si $_POST['auta'], ať víš, s jakými daty (a klíči) se pracuje. Pak už je to jen základní práce s poli, vysvětlená v druhé kapitole každé PHP knihy.
kopi
Profil
já se to jen učím, není to nic, co by měl někdo používat. a právě si zkouším pracovat s poli. Kdybych všechno uměl, tak bych se tu takhle blbě neptal. Jinak díky za pomoc.
Keeehi
Profil
<input type='hidden' name='auto[".$row['id_auto']."]' value='0' />
<input type='checkbox' name='auto[".$row['id_auto']."]' value='1' checked>
Tedy tahle konstrukce není vůbec standardní. Dva tvé inputy se jmenují stejně, tudíž je jasné, že není možné odeslat hodnotu obou z nich. Mám takový pocit že pak bude záležet na pořadí a ten poslední to vyhraje. Když se ale checkbox nezaškrtne, tak se neposílá, takže projde hodnota toho hidden inputu. Vůbec netuším, zda je to takto někde definované tudíž zda se na to dá spolehnout u všech prohlížečů. Také pak velmi záleží na pořadí a já osobně bych se na to ale raději nespoléhal. Pokud to ale v nějakém standradu definované je, tak by to byl celkem zajímavý způsob jak zajistit odeslání checkboxu i když není zaškrtnutý.

Nicméně pokud ti na konci z toho vznikne pole ["1286" => "0", "1287" => 1] pak pro update tabulky ti stačí opravdu to, co ti psal Tomášeek v [#2].
if(isset($_POST['auto'])) {
    foreach($_POST['auto'] as $autoId => $autoValue) {
      $update = mysqli_query($conn,"UPDATE tabulka SET `sloupec`=$autoValue WHERE id_auto=$autoId"); 
    }
}
Máš ty hodnoty ve dvou proměnných a stačí je dát na vhodné místo v tom dotazu.

No a na závěr se hodí zmínit, že tento styl lepení SQL dotazu z uživatelských dat obsahuje zranitelnost typu SQL injection. Což je v ukázkách pro jednoduchost ignorováno ovšem ty by sis to měl opravit.
Kajman
Profil
Prohlížeče nemají problém se vstupy, co se stejně jmenují. Odeslají je všechny. To, že tam je hodnota jen jedna udělá až php. Některé jiné jazyky např. dělají pole při více stejných názvech i bez použití hranatých závorek v jejich názvu.

Osobně bych si seskládal jeden update na všechna odeslaná auta. Něco jako
UPDATE tabulka 
SET    `sloupec` = CASE WHEN id_auto IN (seznam, zatrhnutych, cisel, oddelenych, carkou) THEN 1 ELSE 0 END
WHERE  id_auto IN (seznam, vsech, cisel, oddelenych, carkou)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0