Autor | Zpráva | ||
---|---|---|---|
VelkýBubák Profil |
<form action="<?php echo "$PHP_SELF"; ?>" method="post"> ... <input type="checkbox" name="titulky_Ano[]" value="49560"> ... </form> 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]."'"; $var[0]=''
Co dělám špatně? |
||
Keeehi Profil |
#2 · Zasláno: 22. 2. 2015, 10:21:48
Nevidím chybu. Co obrazí
var_dump($_POST); ?
|
||
Alphard Profil |
#3 · Zasláno: 22. 2. 2015, 10:24:19
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 |
#4 · Zasláno: 22. 2. 2015, 11:17:10
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" } 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 } ["titulky_Ano"]=> NULL |
||
mimochodec Profil |
#6 · Zasláno: 22. 2. 2015, 13:50:41
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 |
#7 · Zasláno: 22. 2. 2015, 13:58:13
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>"; 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> 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>"; 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 |
#9 · Zasláno: 22. 2. 2015, 14:17:36
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 |
#10 · Zasláno: 22. 2. 2015, 16:15:26
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" } } 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 |
#12 · Zasláno: 23. 2. 2015, 09:03:25
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 |
#13 · Zasláno: 25. 2. 2015, 12:29:46
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++;} } } |
||
Keeehi Profil |
#14 · Zasláno: 25. 2. 2015, 13:03:41
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); $_POST = sanitize($_POST); |
||
Časová prodleva: 10 let
|
0