Autor | Zpráva | ||
---|---|---|---|
PetrX Profil * |
#1 · Zasláno: 8. 4. 2010, 10:49:43
Zdravím,
potřeboval bych poradit s jednou záhadou. Ukládám data do pole z POSTu a při jistém označení pole se ukládá pouze první znak. Příklad je zde: // Fungujcí konstrukce: $tretinyU[$m] = trim(strip_tags($_POST["tretiny$m"])); // Nefungující konstrukce $tretiny2[$m] = trim(strip_tags($_POST["tretiny$m"])); Vstup dat je ověřen že je správně. V proměnné tretiny$m je např, toto 1:1, 2:1, 0:2 a při špatné konstrukci to ukládá pouze první znak tj. 1. Pokud nevidíte rozdíl tak je to to U vs. 2 před hranatou závorkou v jméně pole. Prosím neřešte konstrukci je trochu kostrbatá, ale je to z dřívějších dob kdy jsem byl rád, že něco dokážu naprogramovat a teď není už čas to celé předělávat ;-). Můžete někdo poradit čím to je, že to takhle funguje? Jen pro úplnost dodávám, že skript běží na wz.cz |
||
nightfish Profil |
#2 · Zasláno: 8. 4. 2010, 10:56:56
vypiš si pravé strany přiřazení přes echo
vypiš si obsahy polí $tretinyU a $tretiny2 před přiřazením a po něm pomocí var_dump() |
||
PetrX Profil * |
#3 · Zasláno: 8. 4. 2010, 11:13:04
Už to tam vidím. Pokud je proměnná $tretiny2 tak se to neukládá do pole. Je někde přesný popis jak může a nemůže vypadat pojmenování proměnné s polem? NA PHP.net hledám, ale nějak nenacházím
|
||
nightfish Profil |
#4 · Zasláno: 8. 4. 2010, 11:56:19
PetrX:
z hlediska jazyka není rozdíl mezi proměnnými $tretinyU a $tretiny2, oba názvy jsou stejně platné ve [#2] jsem ti na druhém řádku psal, aby sis vypsal ty proměnné přes var_dump(), pravděpodobně v těch výpisech narazíš na něco, co ten rozdíl v chování vysvětlí |
||
PetrX Profil * |
#5 · Zasláno: 8. 4. 2010, 12:48:24
Právě, že jsem použil var_dump() a jediné na co jsem přišel je, že u $tretiny2 se to chová jako proměnná a u $tretinyU se to chová jako pole. Nicméně mi to neřeklo nic o tom proč tomu tak je.
|
||
nightfish Profil |
#6 · Zasláno: 8. 4. 2010, 12:53:59
PetrX:
„že u $tretiny2 se to chová jako proměnná a u $tretinyU se to chová jako pole“ následující kód by to mohl osvětlit <?php $tretinyU = array(); $tretiny2 = 'abc'; $tretinyU[2] = "neco"; $tretiny2[2] = "neco"; var_dump($tretinyU); echo "<br>"; var_dump($tretiny2); |
||
PetrX Profil * |
#7 · Zasláno: 8. 4. 2010, 13:54:21
Tak stále nevím kde je přesně problém. Toto je výsledek kódu:
array(1) { [2]=> string(4) "neco" } string(3) "abn" Chtěl jsi tím nastínit, že mám někde definovanou proměnou $tretiny2 a v ní již nějaký obsah? Pokud ano tak není nikde jinde definována. |
||
PetrX Profil * |
#8 · Zasláno: 8. 4. 2010, 13:57:34
Nejde mi ani tak o řešení, to jsem už našel, ale spíše o vyřešení této záhady.
|
||
Majkl578 Profil |
#9 · Zasláno: 8. 4. 2010, 14:12:06
PetrX:
„Tak stále nevím kde je přesně problém.“ Použiju kód, který uvedl nightfish. $tretinyU = array(); //prázné pole $tretiny2 = 'abc'; //řetězec $tretinyU[2] = "neco"; //přidání hodnoty do pole $tretiny2[2] = "neco"; //nahrazení písmena c, tohle je mimochodem nesmysl (který funguje bez varování), nelze nahradit jeden znak více znaky var_dump($tretinyU); //vypsání pole echo "<br>"; var_dump($tretiny2); //vypsání řetězce Je to jasnější? :) |
||
PetrX Profil * |
#10 · Zasláno: 8. 4. 2010, 14:26:57
To už chápu, ale nevím jak se mi do proměnné $tretiny2 může dostat string když je definován jako pole. Opravdu jsem kontroloval celý kód a tato proměnná je definována jako pole. tudíž nevím jak PHP přiřadí string namísto array.
... for ($m = 1; $m <= $pocet; $m++) { if ($_POST["dvojice_$m"] != "" && $_POST["score1_$m"] != "" && $_POST["score2_$m"] != "" && $_POST["tretiny$m"] != "") { $dvojice[$m] = trim(strip_tags($_POST["dvojice_$m"])); $score[$m][0] = trim(strip_tags($_POST["score1_$m"])); $score[$m][1] = trim(strip_tags($_POST["score2_$m"])); $tretinyU[$m] = trim(strip_tags($_POST["tretiny$m"])); } else $chyba = '<p class="center"><span class="cerveny"><strong>Nebyly zadány vąechny potřebné údaje!!!</strong></span></p>'; } ... |
||
Majkl578 Profil |
#11 · Zasláno: 8. 4. 2010, 14:32:41
Doporučil bych předělání scriptu, aby přijatá data z html byla ve tvaru pole.
Tedy například místo $_POST["dvojice_$m"] by bylo $_POST['dvojice'][$m] . Implementace je jednoduchá, v html bude name jako dvojice[1] místo dvojice_1 .
V [#10] proměnnou $tretiny2 nikde nevidím.
|
||
PetrX Profil * |
#12 · Zasláno: 8. 4. 2010, 14:44:08
Příklad jsem zaslal již upravený, ale samozřejmě se jedná o proměnnou $tretinyU[$m] na řádku 9.
Nicméně již jsem zjistil příčinu. Vysvětlením principů od Majkl578 jsem si uvědomil a ověřil, že na wz.cz mají register_globals nastaveny na ON -> proměnná $tretiny2 již existuje! a to díky globálním proměnným. Takže se automaticky nastavila na string a pole se už nevytváří jak popsal Majkl578. Již na začátku jsem napsal, že to je skript z mých začátků a tak je to nevhodně napsané. Nicméně děkuji za rady a typy jak jej upravit. |
||
Majkl578 Profil |
#13 · Zasláno: 8. 4. 2010, 14:52:44 · Upravil/a: Majkl578
Direktivu register_globals lze vypnout v .htaccessu přidáním:
php_flag register_globals off |
||
Časová prodleva: 15 let
|
0