[PHP / MySQL] 1e resultaat wordt overgeslagen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Topicstarter
Zo, na lang gezocht te hebben naar een mogelijke oorzaak kom ik toch hier terecht. Ik wilde wat gegevens ophalen uit een tabel, maar het eerste record wordt om een of andere rare reden pertinent overgeslagen.

De code:
PHP:
1
2
3
4
5
6
7
8
$query = 'SELECT `realname` FROM `meta`';
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$item = mysql_fetch_array($result);
    while($item = mysql_fetch_array($result))
        {
        echo $item[0];  
        echo '<br />';  
        }


Error reporting is al aangezet, maar zonder resultaat. Als ik dezelfde query invoer bij PHPMyAdmin komt er keurig -alles- uitrollen; maar eenmaal in PHP wordt consequent (ongeacht de tabel) het eerste record overgeslagen. Is er ergens iets dat ik even moet proberen te resetten?

Het rare is dat bij het weergeven van andere lijsten dit wel goed gaat. Ik heb al eens geprobeerd de tabel te optimaliseren en te repareren, maar dat leverde niks op.

Ik weet dat deze code basic is (en ik begrijp ook wat er gebeurt), maar ik snap niet waarom dat ik nu opeens zo'n vreemd resultaat terugkrijg.

teveel zooi, te weinig tijd


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Op regel 3 in het voorbeeld haal je de eerste rij op waarmee je niets doet. Je moet die gewoon weghalen en het werkt :)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 14:26

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
PHP:
1
2
3
4
5
while($item = mysql_fetch_array($result))
        {
        echo $item['realname'];    
        echo '<br />';    
        }
Zoiets werkt hier altijd prima :)

Edit: of wat T-MOB zegt, zal vast wel de oplossing zijn ;)

[ Voor 23% gewijzigd door We Are Borg op 30-05-2005 12:15 ]


Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Topicstarter
T-MOB schreef op maandag 30 mei 2005 @ 12:13:
Op regel 3 in het voorbeeld haal je de eerste rij op waarmee je niets doet. Je moet die gewoon weghalen en het werkt :)
Hm, deze regel heb ik als ik het goed herinner eigenlijk letterlijk zo uit een boek gehaald, maar inderdaad, je hebt gelijk - het werkt. Ik neem aan dat die de pointer al 1tje verder knalt zonder dat het nodig is. Bedankt!

(en help, wat voel ik me nou stom :D )
/me gaat rest van code ook nog even nakijken.

[ Voor 5% gewijzigd door Yoozer op 30-05-2005 12:16 ]

teveel zooi, te weinig tijd


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Yoozer schreef op maandag 30 mei 2005 @ 12:16:
[...]

Hm, deze regel heb ik als ik het goed herinner eigenlijk letterlijk zo uit een boek gehaald, maar inderdaad, je hebt gelijk - het werkt. Ik neem aan dat die de pointer al 1tje verder knalt zonder dat het nodig is. Bedankt!

(en help, wat voel ik me nou stom :D )
/me gaat rest van code ook nog even nakijken.
Ik ken eigenlijk alleen de constructie met een do-while waarbij je eerst een declaratie moet doen. Meestal zo:
PHP:
1
2
3
4
5
if ($items = mysql_fetch_assoc($result)) {
  do {
    //echo stuff enzo
  } while ($items = mysql_fetch_assoc($result));
}

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

T-MOB schreef op maandag 30 mei 2005 @ 12:21:
[...]


Ik ken eigenlijk alleen de constructie met een do-while waarbij je eerst een declaratie moet doen. Meestal zo:
PHP:
1
2
3
4
5
if ($items = mysql_fetch_assoc($result)) {
  do {
    //echo stuff enzo
  } while ($items = mysql_fetch_assoc($result));
}
Zolang je geen else hebt is dit overbodig lijkt mij.

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

questa schreef op maandag 30 mei 2005 @ 12:49:
[...]


Zolang je geen else hebt is dit overbodig lijkt mij.
nope, die is If statement is in dit geval wel nodig. Aangezien de do clause eerst word uitgevoerd en daarna pas de while. Als in dit geval $items leeg zou zijn dan krijg je waarschijnlijk allemaal errors in de do clause.

while() {

}

is handiger in gevallen zoals dit.

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Wat questa bedoelt is dat de constructie overbodig is als je geen else hebt. Dan kun je zoals je zelf aangeeft beter een while gebruiken. De do-while constructie vind je dan ook meestal met een else waarin wordt aangegeven dat er geen resultaten zijn. Met een while moet je op een andere manier het geval dat er geen rijen terugkomen afvangen...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

T-MOB schreef op maandag 30 mei 2005 @ 13:51:
[...]


Wat questa bedoelt is dat de constructie overbodig is als je geen else hebt. Dan kun je zoals je zelf aangeeft beter een while gebruiken. De do-while constructie vind je dan ook meestal met een else waarin wordt aangegeven dat er geen resultaten zijn. Met een while moet je op een andere manier het geval dat er geen rijen terugkomen afvangen...
Precies :)

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Yoozer schreef op maandag 30 mei 2005 @ 12:16:
[...]

Hm, deze regel heb ik als ik het goed herinner eigenlijk letterlijk zo uit een boek gehaald, maar inderdaad, je hebt gelijk - het werkt. Ik neem aan dat die de pointer al 1tje verder knalt zonder dat het nodig is. Bedankt!

(en help, wat voel ik me nou stom :D )
/me gaat rest van code ook nog even nakijken.
De mysql_fetch_* functies schoppen inderdaad de pointer een stapje verder nadat de gegevens zijn uitgelezen. Daarom zijn ze zo makkelijk ineen while() te gebruiken.

[ Voor 5% gewijzigd door frickY op 30-05-2005 15:07 ]

Pagina: 1