ugrás a tartalomhoz

Php - A mindent elnyelő while ciklus

kriszrap · 2011. Már. 1. (K), 23.36
Sziasztok

include "config.php";
$nick= "".$_SESSION['nick'];
$result = mysql_query("SELECT * FROM emails where cimzett='$nick' ");
while($row = mysql_fetch_assoc($result))
    {
if($row['megnezte'] == "0" AND $row['cimzettdel'] =="0")
     {
     $eleres = '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />';
     }else{
     $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';
  }
}
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?
include "config.php";
$nick = mysql_real_escape_string($_SESSION['nick']);
$result = mysql_query("SELECT * FROM emails WHERE cimzett='$nick'");
while ($row = mysql_fetch_assoc($result)) {
  if ($row['megnezte'] == "0" && $row['cimzettdel'] == "0") {
    $eleres = '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />';
  } else {
    $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';
  }
}
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:
<?php
$i = 3;
while ($i) {
  $k = 'haha '. $i;
  $i--;
}
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:
include "config.php";  
$nick = mysql_real_escape_string($_SESSION['nick']);  
$result = mysql_query("SELECT * FROM emails WHERE cimzett='$nick'");  
while ($row = mysql_fetch_assoc($result)) {  
  if ($row['megnezte'] == "0" && $row['cimzettdel'] == "0") {  
    $eleres .= '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />';  
  } else {  
    $eleres .= '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';  
  }  
}  
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.

$a='0';
echo $a; //0
$a='1';
echo $a; //1
$a.='2';
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

$a='0';
echo $a; //0
$a='1';
echo $a; //1
$a=$a.'2';
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ó:


if($row['megnezte'] =='0')
   {
   print '&nbsp;új';
   }else{
   print  '&nbsp;&nbsp;&nbsp;&nbsp;';
} 

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.

mysql_query("UPDATE emails SET megnezte='1'  WHERE id='$olvas'");

include "config.php";
$nick= "".$_SESSION['nick'];
$result = mysql_query("SELECT * FROM emails where cimzett='$nick' ");// kiválasztom az üzeneteket

while($row = mysql_fetch_assoc($result))
  {
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.
     {
     $eleres = '<img border="0"  src="/ikon/new_message.png" title="Olvasatlan Üzeneted van!!!" alt="Sorry!!" />'; 
     }else{
     $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';
  }
}
 if(mysql_num_rows($result) =="0"){
       {
     $eleres = '<img border="0"  src="/ikon/message.png" title="Üzenet" alt="Sorry!!" />';
 }
}
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:

$emails=array(
	array('megnezte' => 0, 'tartalom' => 'első mail'),
	array('megnezte' => 1, 'tartalom' => 'második mail'),
	array('megnezte' => 0, 'tartalom' => 'harmadik mail'),
	array('megnezte' => 1, 'tartalom' => 'negyedik mail')	
);

$van_uj_uzenet=false;
foreach ($emails as $email)
{
	if ($email['megnezte']==1)
	{
		$van_uj_uzenet=true;
		break; //kilép a ciklusból
	}
}
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.

SELECT
	COUNT(*) AS van_e_uj_uzi
FROM
	emails
WHERE
	cimzett='$nick'
AND
	megnezte='0'
LIMIT
	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