ugrás a tartalomhoz

Php - A mindent elnyelő while ciklus

kriszrap · 2011. Már. 1. (K), 23.36
Sziasztok
  1. include "config.php";  
  2. $nick"".$_SESSION['nick'];  
  3. $result = mysql_query("SELECT * FROM emails where cimzett='$nick' ");  
  4. while($row = mysql_fetch_assoc($result))  
  5.     {  
  6. if($row['megnezte'] == "0" AND $row['cimzettdel'] =="0")  
  7.      {  
  8.      $eleres = '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />';  
  9.      }else{  
  10.      $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';  
  11.   }  
  12. }  
Ezzel az a baj hogy csak az utolsot olvassa sort olvassa be:( használok order by-t DESC-et
 
1

Miből?

Poetro · 2011. Már. 1. (K), 23.47
Ezt miből állapítottad meg?
  1. include "config.php";  
  2. $nick = mysql_real_escape_string($_SESSION['nick']);  
  3. $result = mysql_query("SELECT * FROM emails WHERE cimzett='$nick'");  
  4. while ($row = mysql_fetch_assoc($result)) {  
  5.   if ($row['megnezte'] == "0" && $row['cimzettdel'] == "0") {  
  6.     $eleres = '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />';  
  7.   } else {  
  8.     $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';  
  9.   }  
  10. }  
Kicsit formáztam helyetted a kódot. Mivel a ciklus minden egyes futtatásakor csak egy stringet módosítasz, honnan tudod, hogy csak egyszer fut le? Elvégre ha egyszer fut le, akkor is pont egy stringed lesz, és ha 1000-szer akkor is. Talán valami más műveletet is kellene végezni, mert így csak az utolsó futás eredményét látod.
2

Azért mert ugye küldök pl 3

kriszrap · 2011. Már. 2. (Sze), 00.22
Azért mert ugye küldök pl 3 üzenetet és az elsöt megnézem vagy is az utolsot mert a listázás order by DESC-et használok és ha meg néztem utánna meg változik a kép pedig nem kéne:(. Mert még van 2 olvasatlan:( és amig el nem olvasom azt a két üzit ne változzon meg:(

Talán valami más műveletet is kellene végezni, mert így csak az utolsó futás eredményét látod.

minek kéne még lefutnia , mert nem jövökrá while-t mindig igy használtam:(
3

Változó

Poetro · 2011. Már. 2. (Sze), 00.50
Képzeld el a következőt:
  1. <?php  
  2. $i = 3;  
  3. while ($i) {  
  4.   $k = 'haha '$i;  
  5.   $i--;  
  6. }  
  7. print $k;  
Mi lesz ekkor a kimenet?
haha 1
Miért? Mert $k-nak ez az utolsó értéke. Amikor $i értéke eléri a 0-t akkor már nem fut le még egyszer a while ciklus.
Mivel te az $eleres változót mindig felülírod, ezért csak az utolsó értéke fog jelentkezni a ciklus végén. Amennyiben hozzá akarod fűzni az előzőhöz akkor használni kellene a string összefűzés operátort, vagy más típusú változót kellene használni.
Például:
  1. include "config.php";    
  2. $nick = mysql_real_escape_string($_SESSION['nick']);    
  3. $result = mysql_query("SELECT * FROM emails WHERE cimzett='$nick'");    
  4. while ($row = mysql_fetch_assoc($result)) {    
  5.   if ($row['megnezte'] == "0" && $row['cimzettdel'] == "0") {    
  6.     $eleres .= '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />';    
  7.   } else {    
  8.     $eleres .= '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';    
  9.   }    
  10. }    
Miért változna meg az üzeneted, amikor nem is csinálsz adatbázis módosítást?
4

Használj PDO-t, akkor talán

inf · 2011. Már. 2. (Sze), 02.48
Használj PDO-t, akkor talán nem fog annyira gánynak tűnni. A $elerest állandóan felülírod a ciklusban, így ne csodálkozz, ha mindig csak az utolsó sor marad.
  1. $a='0';  
  2. echo $a//0  
  3. $a='1';  
  4. echo $a//1  
  5. $a.='2';  
  6. echo $a//12  
Ha nem fűzöd össze a sztringet a .= operatorral, hanem csak a új értéket adsz a változónak, akkor nyilván mindig az utolsó érték lesz benne.
De akár úgy is írhatnám az előző példát, hogy
  1. $a='0';  
  2. echo $a//0  
  3. $a='1';  
  4. echo $a//1  
  5. $a=$a.'2';  
  6. echo $a//12  
ha így érthetőbb.

Ha csak egy sort akarsz megnézni, akkor order by meg limit kell az sql-be.

Szerintem egyelőre rajtad kívül senki nem érti, hogy mit kéne csinálnia a kódodnak.
5

A lényeg, hogy mindig

pinguka · 2011. Már. 2. (Sze), 13.09
A lényeg, hogy mindig felülírtad az $eleres változót ezáltal csak az utolsót kapod meg.
Hozzá kell fűzni > ".="
6

akkor el magyarázom

kriszrap · 2011. Már. 2. (Sze), 21.17
Na van nekem egy email listázó:
  1. if($row['megnezte'] =='0')  
  2.    {  
  3.    print '&nbsp;új';  
  4.    }else{  
  5.    print  '&nbsp;&nbsp;&nbsp;&nbsp;';  
  6. }   
  7.   
  8. echo $uzenet. '<input type="checkbox" name="kijeloles[]" value="'.$row['id'].'"  class="largerCheckbox"><a class="b" href="profil.php?id='.$id['id'].'">'.$row['kitol'].'<br></a>';  
ezzel kilistázom és ahol megnezte= "0" új szöveget iraratok elé.

és ha megnézi akkor ezt küldöm fel az adatbázisnak.
  1. mysql_query("UPDATE emails SET megnezte='1'  WHERE id='$olvas'");  
  1. include "config.php";  
  2. $nick"".$_SESSION['nick'];  
  3. $result = mysql_query("SELECT * FROM emails where cimzett='$nick' ");// kiválasztom az üzeneteket  
  4.   
  5. while($row = mysql_fetch_assoc($result))  
  6.   {  
  7. if($row['megnezte'] == "0" AND $row['cimzettdel'] =="0"//ha a felhasználó nem nézte meg és nem törölte akkor ezt a képet jeleniti.  
  8.      {  
  9.      $eleres = '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />';   
  10.      }else{  
  11.      $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';  
  12.   }  
  13. }  
  14.  if(mysql_num_rows($result) =="0"){  
  15.        {  
  16.      $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';  
  17.  }  
  18. }  
igy érthetö??
és az a baj ha elsöt meg nézem akkor vissza változika kép normálra:(
hát probálkozom de nem jön sajan össze:(
7

Amúgy elolvasod néha amiket

inf · 2011. Már. 2. (Sze), 22.32
Amúgy elolvasod néha amiket írunk? :D
8

hát igen és probálom

kriszrap · 2011. Már. 2. (Sze), 22.52
hát igen és probálom fejtegetni:D csak leirtam teljeseni hogy mi van:D
.= nél az a baj hogy a hány új üzenetet annyi kép:(
9

A ciklusok arra valók, hogy

inf · 2011. Már. 2. (Sze), 23.36
A ciklusok arra valók, hogy végigmenj velük több elemen. Ha csak arról van szó, hogy meg akarod nézni, hogy van e olvasatlan üzenet, akkor ne a ciklusba tegyed a kiírást, hanem máshová. A ciklust csak arra használd, hogy végigmész az elemeken, ellenőrzöd őket, aztán amint találsz egy olyan üzenetet, ami olvasatlan, akkor kilépsz a ciklusból.

pl:
  1. $emails=array(  
  2.     array('megnezte' => 0, 'tartalom' => 'első mail'),  
  3.     array('megnezte' => 1, 'tartalom' => 'második mail'),  
  4.     array('megnezte' => 0, 'tartalom' => 'harmadik mail'),  
  5.     array('megnezte' => 1, 'tartalom' => 'negyedik mail')   
  6. );  
  7.   
  8. $van_uj_uzenet=false;  
  9. foreach ($emails as $email)  
  10. {  
  11.     if ($email['megnezte']==1)  
  12.     {  
  13.         $van_uj_uzenet=true;  
  14.         break//kilép a ciklusból  
  15.     }  
  16. }  
  17. echo($van_uj_uzenet?'Új üzi!','Semmi új.'); //Új üzi!  
Mint látod itt van egy logikai rész, ami kinyeri az adatból, hogy van e új üzenet, és van egy megjelenítési rész, ami kiírja, hogy van új üzenet. Ez a logikának az elválasztása a megjelenítéstől. Ezt gyakorold sokat, rád fér.


Ezt az ellenőrzést egyébként meg lehet oldani sql-el is, teljesen felesleges hozzá lekérni a teljes listát, és php-vel végigmenni rajta.
  1. SELECT  
  2.     COUNT(*) AS van_e_uj_uzi  
  3. FROM  
  4.     emails  
  5. WHERE  
  6.     cimzett='$nick'  
  7. AND  
  8.     megnezte='0'  
  9. LIMIT  
  10.     1  
Egyébként te diszlexiás vagy?
10

igen mert??:D

kriszrap · 2011. Már. 3. (Cs), 00.10
igen mert??:D
11

Látszik :D

inf · 2011. Már. 3. (Cs), 00.18
Látszik :D
12

na sikerült össze hoznom:D

kriszrap · 2011. Már. 3. (Cs), 00.49
na sikerült össze hoznom:D