Autor Zpráva
PHP_Nemaster
Profil
Dobrý den,
mám takový menší problém. Vytvořil jsem s pomocí cyklu while proměnnou, ale program vidí její hodnotu pouze ve while a dál už ne, i když bych ji potřeboval použít. Nevíte, jak udělat, aby se dala použít na celé stránce? Zde je část kódu ( celkem má asi 200 řádků ):
___________________________________________________________

// Vytvoří tu proměnnou a přidělí jí hodnotu z databáze

while ( $row = mysql_fetch_array ( $res ) ) { 
echo "Alliance:  ". $row['name'];
}




// Zde potřebuji zobrazit její hodnotu v textovém poli a právě to je ten problém. Pole zůstává prázdné, program hodnotu nevidí.
Alliance: <input type="text" name="alli" value="<?php echo $row['name']; ?>" readonly>


// Zde potřebuji vložit hodnotu do databáze, ukládá se prázdná... 
if ( isset ( $_POST['insert']) && $_POST['insert'] == "Insert") {

$q = "INSERT INTO alliance ( members, name ) VALUES ( '".$_POST['regm']."', '".$row['name']."' ) ;"; 


_____________________________________________________

Fungující program si můžete prohlédnout na adrese www.amaga.czweb.org/session.php a uvidíte tam to prázdné pole. ( je potřeba se registrovat na www.amaga.czweb.org/register.php - toho, že ten systém nefunguje tak úplně správně, si prosím nevšímejte. )

Předem děkuji za odpověd'.
fuckin
Profil *
vse je to v jednom souboru nebo to tam includujes? Zkus pouzit globalni promenne...$_GLOBALS[...]
TomášK
Profil
Proměnná $row je definovaná v hlavičce while cyklu, rozsah její platnosti je tedy omezen na ten jeden konkrétní while cyklus.
Co by v ní mělo zbýt potom? Poslední záznam, načtený záznam? Pokud ano, pak to lze vyřešit tím, že před while cyklus dáš
 $row = null;

Pokud víš, že ten while cyklus proběhne jen jednou, pak je chyba mít tam while cyklus.
imploder
Profil
fuckin
vse je to v jednom souboru nebo to tam includujes?
to by nemělo mít vliv.

Proběhl dotaz úspěšně a něco vrátil? Mysql_fetch_array vrací FALSE když už nezbývá žádný řádek k načtení.

TomášK
To jsem myslel, že je jen v C u deklarace proměnných (v PHP se nedeklarují), a to ještě jen v C99.
bohyn
Profil
TomášK
Proměnná $row je definovaná v hlavičce while cyklu, rozsah její platnosti je tedy omezen na ten jeden konkrétní while cyklus.
V PHP toto neplati. Krom funkci/metod se neda omezit omezit platnost promennych.
TomášK
Profil
imploder
V Ansi C musí být všechny proměnné deklarovat na začátku bloku a jejich rozsah je daný tím blokem. Tedy odpadá problém s tím, co se děje, když jsou deklarované v hlavičce cyklu - kompilátorem to neprojde. C99 umožňuje deklarovat proměnné i hlavičce for cyklu a proměnná je pak omezená jen na ten cyklus. V php jsem nevěděl jak to je, tak jsem to vyzkoušel:
$a = array(1,2,3,4,5);
while(list($i) = each($a))
        echo $i;


if( isset($i) ) {
    echo "i: $i";
} else {
    echo "i is not set";
}

vypíše "i is not set".
fuckin
Profil *
TomasK
Neplet sem formalni parametry ktere se deklaruji u funkci ci procedur. Po ukonceni whilu prece promenna s obsahem nezanikne...

Jak bylo psane vyse zkus $row=null;
fuckin
Profil *
ok, beru zpet :)
PHP_Nemaster
Profil
Proběhl dotaz úspěšně a něco vrátil? Mysql_fetch_array vrací FALSE když už nezbývá žádný řádek k načtení.

Ano. Ale já načítám pouze jeden řádek, kde má řádek hodnotu stejnou jako $_SESSION['username'], tzn. SELECT name FROM alliance WHERE members = '".$_SESSION['username']."' Proměnná $row['name'] má tedy určitou hodnotu, ale jak ji dostat i z toho cyklu? Pokusil jsem se udělat global $row['name'], ale to mi hlásí, že mi někde chybí uvozovky.
Alphard
Profil
PHP_Nemaster:
Ano. Ale já načítám pouze jeden řádek
Tak vůbec nepoužívejte cyklus, nebo ji v cyklu nakopírujte jinam, ať se v zápětí nepřepíše.

fuckin:
Neplet sem formalni parametry ktere se deklaruji u funkci ci procedur. Po ukonceni whilu prece promenna s obsahem nezanikne
Pravda

TomášK:
Ten příklad je zavádějící, viz:
$m = 1; $a = 6;
while($m < $a)
  {
    $i = $m;
    echo var_dump($i)."<br>";
    $m++;
  }

echo var_dump($i);

nebo bližší vaší ukázce:
$m = 1; $a = 6;
while($m < $a)
  {
    $i = $m;
    echo $i."<br>";
    $m++;
  }

if( isset($i) ) {
    echo "i: $i";
} else {
    echo "i is not set";
}
AM_
Profil
Ano. Ale já načítám pouze jeden řádek
Proměnná $row['name'] má tedy určitou hodnotu, ale jak ji dostat i z toho cyklu

nabízí se otázka: když načítáš jeden řádek, co to proboha dělá v cyklu?
vezmi si, co ten while udělá:

-přidělí $row další výsledek z DB a pokud tento výraz odpovídá true (tedy nevrátí false), projde se cyklem.
-znovu se pokusí $row přidělit výsledek, ovšem už žádný není, takže do $row uloží false. Podmínka while se vyhodnotí jako nepravdivá a cyklus skončí. A v $row ti samozřejmě zůstane poslední načtená záležitost, tedy false (=žádný další výsledek).
PHP_Nemaster
Profil
AM_: Aha. A jak se dá ještě načíst něco z databáze, když ne cyklem? Prostě mysql_fetch_array ?
TomášK
Profil
fuckin
neber zpět, zpět beru já, máš pravdu :)
Spletl jsem se v tom, že jsem myslel, že isset vrací true, pokud je proměnná deklarována. Dle dokumentace ale isset vrací true, pokud je deklarována a není null. Cyklus skončí ve chvíli, kdy je proměnná $i null a isset vrátí false. Tím padá celá moje teorie o tom, že se to chová stejně jako v C.

To samé se ale děje v případě původního dotazu - while cyklus skončí právě tehdy, když se do proměnné $row dostane null (obecněji false, ale zde tam bude null). Poslední, co ten cyklus udělá je, že to tam dosadí a vyhodnotí, že už nemá pokračovat.

Zkus to takhle:
$row = mysql_fetch_array ( $res );
echo "Alliance:  ". $row['name'];


Edit: začal jsem psát po odpovědi fuckina, než jsem to dopsal, objevilo se tu asi 5 reakcí, takže už zřejmě přicházím s křížkem po funuse
PHP_Nemaster
Profil
Edit: začal jsem psát po odpovědi fuckina, než jsem to dopsal, objevilo se tu asi 5 reakcí, takže už zřejmě přicházím s křížkem po funuse

TomášSK: Ne. :) Moc děkuji, funguje to.
AM_
Profil
TomášK
while cyklus skončí právě tehdy, když se do proměnné $row dostane null (obecněji false, ale zde tam bude null)
ne. bude tam false. leda mysqli_result::fetch_array vrací null, tahle změna konvence mě jednou taky trochu potrápila :) ale je to jedno, obojí se na boolean přetypuje jako false takže cyklus končí.

PHP_Nemaster
AM_: Aha. A jak se dá ještě načíst něco z databáze, když ne cyklem? Prostě mysql_fetch_array ?
ano, jak píše TomášK. ale měl bys ještě ošetřit, jestli se vůbec nějaký výsledek dostavi, tedy:
if (mysql_num_rows($res) > 0){
  $row = mysql_fetch_array ( $res );
  echo "Alliance:  ". $row['name'];
} else {
  echo "Alliance:  ???";
}
TomášK
Profil
AM_
Máš pravdu - opět jsem zkoušel analogii s jiným jazykem a opět jsem narazil, zkusím příště ověřit než něco plácnu. :) Každopádně návratová hodnota false mi přijde divná pro tuhle funkci.
AM_
Profil
Každopádně návratová hodnota false mi přijde divná pro tuhle funkci.
mno to PHP vývojářům asi přišla taky, když to v mysqli změnili :) zřejmě se drželi toho, že FALSE se vrací při neúspěchu, což svým způsobem čtení z již dočteného mysql výsledku je, ale NULL je zde logičtější - konec datového toku.

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