Autor Zpráva
PetrX
Profil *
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
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 *
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
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 *
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
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 *
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 *
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
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
Rozdíl tedy je, že i u stringu lze k jednotlivým znakům (přesněji bytům) přistupovat jako k poli, takže tím [2] přistupuješ ke třetímu znaku (indexuje se od nuly, což je první znak).
Je to jasnější? :)
PetrX
Profil *
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
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 *
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
Direktivu register_globals lze vypnout v .htaccessu přidáním:
php_flag register_globals off
Od PHP 5.3 je deprecated a není doporučené spoléhat na ni.

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:

0