Autor Zpráva
VelkýBubák
Profil
<form action="<?php echo "$PHP_SELF"; ?>" method="post">
...
<input type="checkbox" name="titulky_Ano[]" value="49560">
...
</form>
Chtěl jsem použít takovýhle (titulky_Ano[]) zápis názvu, protože by mi to vyhovovalo a podle jiné diskuze tady, by to fungovat mělo.

Pochopil jsem to tak, že se odešlou pouze zaškrtnuté, ale když si dám na začátek scriptu
$var=$_POST["titulky_Ano"]; echo "\$var[0]='".$var[0]."'";
vypíše to i přez zaškrtnutí $var[0]=''
Co dělám špatně?
Keeehi
Profil
Nevidím chybu. Co obrazí var_dump($_POST);?
Alphard
Profil
Neověřujete přítomnost prvku v $_POST, PHP bohužel nemá problém s tím nechat se umlčet a vytvořit prázdnou $var i když $_POST["titulky_Ano"] vůbec neexistuje.
lionel messi
Profil
VelkýBubák:
Register_globals (na ne sa spolieha zápis $PHP_SELF) už patria definitívne histórii. Používajte $_SERVER["PHP_SELF"] a úplne najideálnejšie je atribút action v prípade, že o spracovanie formulára sa stará skript na rovnakej adrese ako formulár, úplne vynechať. Z hľadiska bezpečnosti taktiež nie je vhodné spoliehať sa na obsah $_SERVER["PHP_SELF"]. Bližšie informácie v diskusii k článku: Problémy pole $_REQUEST.
VelkýBubák
Profil
lionel messi:
Zajímavé, opravdu to funguje stejně, ať tam ten argument je, je prázdný, nebo vůbec není.

Alphard:
Všechny proměnné které tam mám, mimo této bez problémů tímto způsobem fungují, ale ano, mohu tam ten test přidat.

Keeehi:
Bez zaškrtnutých:
array(13) { ["portal"]=> string(5) "anime" ["vyraz"]=> string(9) "yakudzuke" ["zmena"]=> string(0) "" ["nast_nahr_txt"]=> string(5) "vyraz" ["nast_odkazy"]=> string(3) "Ano" ["nast_serie"]=> string(3) "Ano" ["nast_skupina"]=> string(3) "Ano" ["zmenit_mazat"]=> string(3) "Ano" ["adresa_titulky_overit"]=> string(8) "Ověřit" ["u_serie"]=> string(5) "10407" ["u_odkazu"]=> string(9) "ext|D|enh" ["u_skupiny"]=> string(3) "515" ["pocet"]=> string(3) "434" }
S osmi zaškrtnutými:
array(14) { ["portal"]=> string(5) "anime" ["vyraz"]=> string(9) "yakudzuke" ["zmena"]=> string(0) "" ["nast_nahr_txt"]=> string(5) "vyraz" ["nast_odkazy"]=> string(3) "Ano" ["nast_serie"]=> string(3) "Ano" ["nast_skupina"]=> string(3) "Ano" ["zmenit_mazat"]=> string(3) "Ano" ["adresa_titulky_overit"]=> string(8) "Ověřit" ["u_serie"]=> string(5) "10407" ["u_odkazu"]=> string(9) "ext|D|enh" ["u_skupiny"]=> string(3) "515" ["pocet"]=> string(3) "434" ["titulky_Ano"]=> NULL } 
rozdíl je
["titulky_Ano"]=> NULL
ale pořád netuším proč
mimochodec
Profil
VelkýBubák:
rozdíl je
["titulky_Ano"]=> NULL["titulky_Ano"]=> NULLale pořád netuším proč

Nejde náhodou o jediný checkbox v tom formuláři?

Zkusil bych přibližně toto:
 if ($_POST["titulky_Ano"]) {
  $pomocna = $_POST["titulky_Ano"];
} else {
  $pomocna = 0;
}
Keeehi
Profil
mimochodec:
To je nesmysl.

VelkýBubák:
To je opravdu divné chování. Kód co jsi sem dal by se měl chovat přesně podle očekávání. Ukaž celý kód protože problém bude pravděpodobně někde jinde.
VelkýBubák
Profil
mimochodec:
Ne, není to jediný checkbox ve formuláři, další jsou všechny vypsané s hodnotou ANO

Už vážně nevím kde hledat.
vlastně, úplně přesně tam tuhle část formuláře načítám do proměnné, jakože
$htm.= "<TD style='text-align:center'>$overit[id_dil] <input type=\"checkbox\" name=\"titulky_Ano[]\" value=\"$overit[id_titulky]\"></TD>";
v cyklu, protože počet vykonaných cyklů vypisuji před touto částí formuláře a pak tedy vypisuji
echo "<input type=\"text\" name=\"pocet\" size=\"5\" value=\"$i\" /><br>\n".$htm;

jediný co mě napadá zda, nemůže být problém v tom

zkusil jsem to změnit tak, že to vypisuji krz echo, místo $htm= , ale beze změny
echo "<TD style='text-align:center'>$overit[id_dil] <input type=\"checkbox\" name=\"titulky_Ano[]\" value=\"$overit[id_titulky]\"></TD>";

po přepisu na
<TD style='text-align:center'><?php echo $overit[id_dil]; ?> <input type="checkbox" name="titulky_Ano[]" value="<?php echo $overit[id_titulky]; ?>"></TD>
také beze změny

Keeehi:
Ten kód bez bez toho rádku funguje, a když titulky_Ano[] zaměním za titulky_Ano$i tak to i v původním kódu funguje,
      $htm.= "<TD style='text-align:center'>$overit[id_dil] <input type=\"checkbox\" name=\"titulky_Ano$i\" value=\"$overit[id_titulky]\"></TD>";
jen se to nenačítá do pole
array(18) { ["portal"]=> string(5) "anime" ["vyraz"]=> string(9) "yakudzuke" ["zmena"]=> string(0) "" ["nast_nahr_txt"]=> string(5) "vyraz" ["nast_odkazy"]=> string(3) "Ano" ["nast_serie"]=> string(3) "Ano" ["nast_skupina"]=> string(3) "Ano" ["adresa_titulky_overit"]=> string(8) "Ověřit" ["u_serie"]=> string(5) "10407" ["u_odkazu"]=> string(9) "ext|D|enh" ["u_skupiny"]=> string(3) "515" ["pocet"]=> string(3) "434" ["titulky_Ano1"]=> string(5) "52921" ["titulky_Ano2"]=> string(5) "50290" ["titulky_Ano3"]=> string(5) "49560" ["titulky_Ano4"]=> string(5) "49561" ["titulky_Ano5"]=> string(5) "49562" ["titulky_Ano6"]=> string(5) "49563" } 
mimochodec
Profil
Keeehi:
To je nesmysl.

Potom jsem asi špatně pochopil otázku. Přesně tak, jak jsem to napsal, mi to funguje. $pomocna má podle (ne)zatržení buď hodnotu 0 nebo jednopoložkový array o hodnotě toho checkboxu.
Keeehi
Profil
mimochodec:
Jenže jemu se tam evidentně při zatržení nepřenáší ta hodnota.

VelkýBubák:
No možnosti jsou 2. Buď si to v PHP předtím někde přepisujete (méně pravděpodobné) a nebo to neodesílá prohlížeč. V takovém případě by se hodila živá ukázka. Normální formulář by měl fungovat. Nepoužíváte u něj nějaký javascript, který by jeho chování mohl modifikovat?
VelkýBubák
Profil
Keeehi:
Ne žádný javascript ve stránce nepoužívám a ani nenačítám.
Ale díky živé ukázce (trochu osekané, aby nic neměnila v DB a umístěné jinde než v administrátorské části serveru, aby se k ní kdokoliv dostal), jsem zas dál, díky. Živá ukázka funguje dle původních očekávání.
array(11) { ["portal"]=> string(5) "anime" ["vyraz"]=> string(9) "yakudzuke" ["zmena"]=> string(0) "" ["nast_nahr_txt"]=> string(5) "vyraz" ["nast_serie"]=> string(3) "Ano" ["nast_skupina"]=> string(3) "Ano" ["adresa_titulky_overit"]=> string(8) "Ověřit" ["u_serie"]=> string(5) "10407" ["u_skupiny"]=> string(3) "515" ["pocet"]=> string(3) "434" ["titulky_Ano"]=> array(6) { [0]=> string(5) "52921" [1]=> string(5) "50290" [2]=> string(5) "49560" [3]=> string(5) "49561" [4]=> string(5) "49562" [5]=> string(5) "42000" } } 
Což znamená, že toto chování opravdu musí být někde nastavené, protože souvisí s místem umístění. Vím s určitostí, že tam nikde není stejná proměnná. Jakým jiným způsobem, by tedy šlo takové chování nastavit? Jde nastavit třeba v .htaccess, aby to pole nefungovalo?

V configu (který načítám) jsem narazil na toto, může to být příčina?
if (isset($_POST)) {
    reset($_POST);
    while (list($k, $v) = each($_POST)) {
        $_POST[$k] = str_replace("''", "'", $v);
        $_POST[$k] = trim($_POST[$k]);
    }
}
Keeehi
Profil
Samozřejmě že za to může tento kód. Je to ten trim který jako první parametr chce string a vy mu tam cpete pole. Na takový případ pak vrací null.

Dále pak k tomu kódu
1. Dá se to zapsat mnohem hezčeji.
2. Jsem toho názoru, že pole POST a GET by měly být read-only. Jelikož to tak v PHP není, tak se k tomu tak chovat. Takže uvedený kód bych prostě smazal a bylo by hotovo.
VelkýBubák
Profil
Keeehi:
...také možnost, bohužel jsem zjistil, že bych si tím rozhodil většinu scriptů na serveru, což opravdu nechci,
bohudík to lze celkem snadno obejít, a utvořit to pole až po průchodu krz $_POST
if(($_POST[pocet_i]) > 0) 
 {
 for($qwe=1,$asd=1;$qwe<=$_POST[pocet_i];$qwe++) 
   {
   if(isset($_POST["titulky_Ano$qwe"])) {$titulky[$asd]=$_POST["titulky_Ano$qwe"]; $asd++;}
   }
 }
 
kde $_POST[pocet_i] je počet všech možných položek a názvy jsou titulky_Ano1 až onen počet
Keeehi
Profil
VelkýBubák:
také možnost, bohužel jsem zjistil, že bych si tím rozhodil většinu scriptů na serveru, což opravdu nechci,
Ovšem správný přístup. Je to prasárna a neměla by tam co dělat. To že po odstranění by byly nutné opravy je možné, ale to je prostě daň za to, že to nebylo dělané pořádně už od začátku.

A ta úprava je opravdu příšerná. Když už tak existuje funkce is_array(). Takže stačí do té původní přidat podmínku s touto funkcí a pokud bude splněná, tak trim neprovádět. Ovšem to co získáváš je velmi nekonzistentní pole, kde na nějaké prvky je trim aplikovaný a na jiné ne. Takže když už, tak pořádně:
function sanititíze($array) {
    if(!is_array($array)) {
        throw new Exception("Parameter of sanititíze function is not an array.");
    }
    
    foreach ($array as $key => $value) {
        if(is_array($value)) {
            $array[$key] = sanitize($value);
        } else {
            $array[$key] = trim(str_replace("''", "'", $value));
        }
    }
    
    return $array;
}

A použítí pak nejlépe takto:
$sanitizedPost = sanitize($_POST);
A nebo tedy takto, ale fakt se mi to neíbí.
$_POST = sanitize($_POST);

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: