Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php+mysql] Pytanie o wyciągnięcie danych z zapytania przed while
Forum PHP.pl > Forum > Przedszkole
tryme
Witam Serdecznie,

Chciałem Was zapytać czy istnieje możliwość aby w poniższym kodzie

  1. <?php
  2. $result = $db->query('SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_s
    etting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.po
    ster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edit
    ed, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM '
    .$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id LEFT JOIN '.$db->prefix.'online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id='.$id.' ORDER BY p.id LIMIT '.$start_from.','.$pun_user['disp_posts'], true) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
  3.  
  4. while ($cur_post = $db->fetch_assoc($result))
  5. {
  6. ...
  7. ?>

wstawić tuż przed pętlą while kod wyciągający pierwszą wiadomość
  1. <?php
  2. $cur_post['message'];
  3. ?>

tak aby potem pętla while zaczęła czytać dane od tej pierwszej wiadomości a nie od drugiej?

Dziękuję za pomoc.
Grzyw
Możesz to zrobić na przykład tak:

  1. <?php
  2. $result = $db->query('......');
  3.  
  4. $first = true;
  5.  
  6. while ($cur_post = $db->fetch_assoc($result))
  7. {
  8. if ($first) 
  9.  {
  10.  $currentMsg= $cur_post['message'];
  11.  $first=false;
  12.  continue;
  13.  }
  14.  $mgs[] = $cur_post['message'];
  15. }
  16. ?>
nowotny
A w jakim celu...?

W pętli robisz sobie ifa i dodajesz zmienną liczącą iteracje pętli...

  1. <?php
  2. $i=0;
  3. while ($cur_post = $db->fetch_assoc($result))
  4. {
  5. if($i==0){...}
  6. else {...}
  7. $i++;
  8. ...
  9. ?>
tryme
Dokładnie to chcę wyciągnąć dane z pierwszego posta aby wrzucić je jako meta description strony.

Nie mogę zrobić ifa ponieważ tuż przed pętlą while wczytywany jest header w który to właśnie muszę umieścić description.

Musi to mniej więcej wyglądać tak:

  1. <?php
  2. $result = $db->query('......');
  3.  
  4. // miejsce na magiczny kod który wyciągnie mi dane z pierwszego posta (message)
  5.  
  6. require 'header.php';
  7.  
  8. while ($cur_post = $db->fetch_assoc($result))
  9. {
  10. ....
  11. ?>
nospor
oj... pomysl troche. skoro kod w petli wyciaga kolejne rekordy, to wywal go poza petle a dostaniesz pierwszy:
  1. <?php
  2. $result = $db->query('......');
  3.  
  4. // miejsce na magiczny kod który wyciągnie mi dane z pierwszego posta (message)
  5. $cur_post = $db->fetch_assoc($result);//twoj pierwszy rekord
  6.  
  7. require 'header.php';
  8.  
  9. //a tu poleci od drugiego
  10. while ($cur_post = $db->fetch_assoc($result))
  11. {
  12. ....
  13. }
  14. //jak chcesz by ta petla poleciala od pierwszego, to while musisz przeniesc na dol
     (patrz manual rozne skladnie while)
  15. ?>
nowotny
To sobie zrób tak:
  1. <?php
  2. $i=0;
  3. while ($cur_post = $db->fetch_assoc($result))
  4. {
  5. if($i==0){
  6. ...
  7. require 'header.php';}
  8. else {...}
  9. $i++;
  10. ...
  11. ?>

Albo podobnie...


Cytat(nospor @ 26.02.2008, 11:48:51 ) *
//jak chcesz by ta petla poleciala od pierwszego, to while musisz przeniesc na dol
(patrz manual rozne skladnie while)

To i tak nic nie da bo pierwszy mysql_fetch_assoc przesunie wskaźnik na drugi wiersz wyników...
tryme
Problem rozwiązany.

Bardzo dziękuję wszystkim za pomoc. W szczególności użytkownikowi nospor, który podał rozwiązanie którego długo szukałem smile.gif
nospor
Cytat
To i tak nic nie da bo pierwszy mysql_fetch_assoc przesunie wskaźnik na drugi wiersz wyników...
a wlasnie ze da. Sadzilem ze akurat Ciebie nie bede musial odsylac do manuala, ale jednak trzeba:
http://pl2.php.net/manual/pl/control-structures.do.while.php
milej lektury i zastanowienia sie jeszcze raz nad podanym przezemnie rozwiazaniem smile.gif
nowotny
Cytat(nospor @ 26.02.2008, 12:02:34 ) *
a wlasnie ze da.

Ok, da jeśli w pierwszej iteracji do..while odwołamy się do zmiennej $cur_post wywołanej przed pętlą... jednak ja odwołuję się do twojego zdania:
Cytat
//jak chcesz by ta petla poleciala od pierwszego, to while musisz przeniesc na dol

które jest nieprawdą, bo nawet jeśli while przeniesiemy na dół to tak czy siak zacznie odczytywanie od drugiego wiersza wyniku ponieważ pierwsze użycie fetch_assoc przesunie wskaźnik na drugi wiersz i tego nie przeskoczysz...
nospor
ech czlowieku malej wiary winksmiley.jpg
Nie wiem, moze nie jasno sie wyrazilem, ale chodzilo mi o taki kod:
  1. <?php
  2. $cur_post = $db->fetch_assoc($result);//twoj pierwszy rekord
  3.  
  4. require 'header.php';
  5.  
  6. do
  7. {
  8. // a tu robimy cos z $cur_post
  9. } while ($cur_post = $db->fetch_assoc($result));
  10. ?>

I dziala jak mowilem: while na dole, rekordy od pierwszego.
nowotny
Wiem że działa... w ogóle nie o to chodzi...

Chodzi o to że w swojej wypowiedzi imputowałeś że fakt przeniesienia while na dół powoduje jakieś automagiczne rozpoczęcie pobierania wyników od pierwszego wiersza mimo wcześniejszego użycia fetch_assoc co, jak oboje wiemy, nie jest prawdą... smile.gif
nospor
w przykladzie co ci podalem w poprzednim poscie jest najprawdziwsza prawda.

A ty w tej chwili czepiasz sie slowek, choc nawet nie wiem czemu. Powiedzialem ze danie while na dole spowoduje w tym przykladzdie iteracje od pierwszego rekordu i tak jest. A to ze db->fetch_assoc($result) w tym while bedzie pobierac rekordy od drugiego to zupelnie inna bajka. Skonczmy wiec juz ten "dziwny spor".
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.