Autor | Zpráva | ||
---|---|---|---|
PHP_Nemaster Profil |
#1 · Zasláno: 9. 6. 2009, 18:25:59 · Upravil/a: PHP_Nemaster
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 * |
#2 · Zasláno: 9. 6. 2009, 18:32:14
vse je to v jednom souboru nebo to tam includujes? Zkus pouzit globalni promenne...$_GLOBALS[...]
|
||
TomášK Profil |
#3 · Zasláno: 9. 6. 2009, 18:43:46
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 |
#4 · Zasláno: 9. 6. 2009, 18:44:16 · Upravil/a: imploder
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 |
#5 · Zasláno: 9. 6. 2009, 18:49:46
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 |
#6 · Zasláno: 9. 6. 2009, 19:05:07
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 * |
#7 · Zasláno: 9. 6. 2009, 19:07:04
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 * |
#8 · Zasláno: 9. 6. 2009, 19:09:34
ok, beru zpet :)
|
||
PHP_Nemaster Profil |
#9 · Zasláno: 9. 6. 2009, 19:11:23
„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 |
#10 · Zasláno: 9. 6. 2009, 19:15:32
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 |
#11 · Zasláno: 9. 6. 2009, 19:15:48
„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 |
#12 · Zasláno: 9. 6. 2009, 19:20:07
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 |
#13 · Zasláno: 9. 6. 2009, 19:22:30 · Upravil/a: TomášK
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 |
#14 · Zasláno: 9. 6. 2009, 19:28:32 · Upravil/a: PHP_Nemaster
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 |
#15 · Zasláno: 9. 6. 2009, 20:05:49
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 |
#16 · Zasláno: 9. 6. 2009, 20:33:07
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 |
#17 · Zasláno: 9. 6. 2009, 20:36:01
„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. |
||
Časová prodleva: 15 let
|
0