Autor Zpráva
Fastman
Profil
Zdravím,

Potřeboval bych poradit, jak udělám podmínku pro multiple. Uživatel si vybere několik věcí a odešle, jak udělám podmínku, že skutečně odeslal ty správné a že si nějakou neupravil.

Příklad:

Sekce ovoce:
Jahody
Meloun
Ananas

<select multiple name=\"ovoce[]\" class=\"form-control\">
        <option>Jahody</option>
        <option>Meloun</option>
        <option>Ananas</option>
     </select>

Uživatel by si mohl jednoduše editovat text a změnit si Jahody na Jablka a odeslat to. Jak ale ověřím, že odeslal správné (v mém příkladu ovoce)?

Děkuji všem za odpovědi.
Taps
Profil
Fastman:
Ve skriptu, který údaje zpracovává si vytvoř pole hodnot, a pak toto pole budeš porovnávat s hodnotami, které byly odeslány z formuláře.
Alphard
Profil
Rozšiřuji odpověď [#2] Taps.

Docela jednoduše, ale je třeba posunout se na trochu abstraktnější úroveň. Ten formulář si programátor nepíše sám, html není jeho starost. On si pouze definuje pole možností
$fruitsList = [
  'Jahody',
  'Meloun',
  'Ananas',
];
a tyhle možnosti předá funkci, která renderuje formulář: $form->addMultipleSelect('fruits', $fruitsList).

Protože $form zná (i po odeslání) povolené volby, může např. pomocí in_array() ověřit, jestli jsou z povoleného seznamu, tj. validovat formulář (např. i zkontrolovat povinné položky atd.) a vrátit výsledky.

Viz např. Nette\Forms, tam je to hezky automaticky vyřešené.
Fastman
Profil
Děkuji moc za odpovědi, tak jsem zkusil napsat do vykonávajícího skriptu tyto hodnoty:

$ovoce_overuji = array('Jahody', 'Meloun', 'Ananas');

if ($_POST['ovoce'] !== $ovoce_overuji){
    echo "Zvolené ovoce neexistuje!!";
}

Bohužel nefunguje. I když zvolím hodnotu Jahody nebo si pozměním hodnotu Jahody na Jablka, tak to stále píše "Zvolené ovoce neexistuje!!" a neověřuje si to hodnoty z array.
Trsak
Profil
$ovoce_overuji = array('Jahody', 'Meloun', 'Ananas');
 
if (!in_array($_POST['ovoce'], $ovoce_overuji)){
    echo "Zvolené ovoce neexistuje!!";
}
Fastman
Profil
Trsak:
Tak to bohužel nejde. Zkoušel jsem si vypsat samotnou hodnotu $_POST['ovoce'] a vypsalo se "Array". Když jsem zkusil:

foreach ($_POST['ovoce'] as $ovoce2){

  if (!in_array($ovoce2, $ovoce_overuji)){
     echo "$ovoce2" //Otestoval jsem si výpis hodnot - vypsali se.
     echo "Zvolené ovoce neexistuje!!";
   }

}
Tak se nic nezměnilo. Stále je to stejný.
Alphard
Profil
Fastman [#4], Trsak [#5]:
To in_array (které jsem sám nešťastně zmínil), by se muselo používat v cyklu (který by však určitě byl součástí každé komplexnější validace). V tomto nejjednodušším případě, kdy chcete jen porovnat 2 pole, by se muselo použít např. array_diff().

Fastman [#6]:
Tenhle kód už vypadá dobře (až na to, že kromě výpisu nic nedělá). Asi sem nedáváte přesně původní podobu, protože tahle by skončila syntaktickou chybou, ale nějak tak by to fungovat mělo.
Fastman
Profil
Po odeslání to zpracovává skript a porovná:

<?php
//Hodnoty které se budou ověřovat.
$ovoce_overuji = array('Jahody', 'Meloun', 'Ananas');

//Získám hodnoty z "ovoce" a přeložím jako $ovoce2
foreach ($_POST['ovoce'] as $ovoce2){
    
    //Podmínka, jestliže hodnota získaná z $ovoce2 není v array, tak vyhodí "Ovoce neexistuje".
    if (!in_array($ovoce2, $ovoce_overuji)){ 
    echo "Ovoce neexistuje";
    exit;
    }

}
?>

*Kód jsem poupravil, aby to bylo lépe pochopitelné, když někdo narazí na tento topic.
Alphard
Profil
Překlep v názvu $mapa_overuji. Kdybyste používal pořádné IDE, upozorní vás.
Fastman
Profil
Ajo, máte pravdu. Díky moc, už to funguje. Používám Notepad++.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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