Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]nauka php+mysql
Forum PHP.pl > Forum > Przedszkole
chemiqs
hej
mam taki kod:


Kod
<?php
CONNECT TO DATABASE...
$prefix="gazeta_";

$tab_wyd=mysql_query("SELECT * FROM ".$prefix."wydania WHERE id=(SELECT max(id) FROM ".$prefix."wydania) AND data_zamkniecia<=DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')");
if(mysql_num_rows($tab_wyd) > 0)
{
    echo "<table cellpadding=\"2\" border=1>";
       while($r = mysql_fetch_assoc($tab_wyd)) {
          echo "<tr>";
          echo "<td>".$wyd=$r['id']."</td>";
          echo "<td>".$r['numer']."</td>";
          echo "</tr>";
    }
    echo "</table>";
}
//do tego momentu wszystko dziala ok - elegancko sie wyswietla


$wynik_blad = mysql_query("SELECT * FROM ".$prefix."ogloszenia WHERE id_wydania='".$tab_wyd[0]["id"]."' AND liczba_pozostalych_emisji>0") or die('Blad zapytania');
$wynik_ok = mysql_query("SELECT * FROM ".$prefix."ogloszenia WHERE id_wydania='".$wyd."' AND liczba_pozostalych_emisji>0") or die('Blad zapytania');

// zamykamy połączenie
mysql_close($connection);
?>


i teraz tak, w zapytaniu $wynik_blad wykorzystując $tab_wyd[0]["id"] nie otrzymuje zadnych rekordów.
w zapytaniu $wynik_ok wykorzystujac $wyd wszystko jest poprawnie. Możecie mi wyłożyć jak krowie na miedzy dlaczego tak jest? Bo nie bardzo czaje. Od razu mowie ze to moje poczatki z php.

z góry dzieki
!*!
Stosuj tagi na forum, aby kolorować składnie.
var_dump() i sprawdź co Ci zwraca $tab_wyd; (obstawiam 2 select)
Poza tym, zapomnij o mysql_ do łączenia się z bazą i bierz się od razu za PDO skoro się uczysz, bo to przyszłość.
http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO

I nabierzesz dobrych praktyk.
wNogachSpisz
Naukę SQLa możesz łatwo odłożyć stosująć biblitekę Active Records http://codeigniter.com/user_guide/database...ive_record.html
Patrz na mnie, nie znam SQLa a radze sobie świetnie smile.gif
mmmmmmm
  1. <?php
  2. CONNECT TO DATABASE...
  3. $prefix="gazeta_";
  4.  
  5. $tab_wyd=mysql_query("SELECT * FROM ".$prefix."wydania WHERE id=(SELECT max(id) FROM ".$prefix."wydania) AND data_zamkniecia<=DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')");
  6. if(mysql_num_rows($tab_wyd) > 0)
  7. {
  8. echo "<table cellpadding=\"2\" border=1>";
  9. while($r = mysql_fetch_assoc($tab_wyd)) {
  10. echo "<tr>";
  11. echo "<td>".$wyd=$r['id']."</td>";
  12. echo "<td>".$r['numer']."</td>";
  13. echo "</tr>";
  14. }
  15. echo "</table>";
  16. }
  17. //do tego momentu wszystko dziala ok - elegancko sie wyswietla
  18.  
  19.  
  20. $wynik_blad = mysql_query("SELECT * FROM ".$prefix."ogloszenia WHERE id_wydania='".$tab_wyd[0]["id"]."' AND liczba_pozostalych_emisji>0") or die('Blad zapytania');
  21. $wynik_ok = mysql_query("SELECT * FROM ".$prefix."ogloszenia WHERE id_wydania='".$wyd."' AND liczba_pozostalych_emisji>0") or die('Blad zapytania');
  22.  
  23. // zamykamy połączenie
  24. mysql_close($connection);
  25. ?>

1. Prawdopodobnie zapytanie w linii 5 jest błędne. Jeśli działa prawidłowo, to przypadek.
2. a to w linii 11 to co to jest questionmark.gif "$wyd=$r['id']" - WTF? (Może to konstrukcja dozwolona przez PHP)
3. w linii 20 nie możesz zrobić tak: $tab_wyd[0]["id"], bo $tab_wyd nie jest tablicą, tylko resource.
4. w ogóle wykonywanie zapytań z * to złoooo... A jeśli dodatkowo tych zmiennych później nie wykorzystujemy, to już zupełna kicha...
chemiqs
1) działa prawidłowo smile.gif
2) nie mam bladego pojecia czy ta konstrukcja jest dozwolona przez php ale działa. po prostu chce wyciagnac dane z $tab_wyd[0]["id"]

ok - zgadzam sie ze $tab_wyd to nie tablica. to powiedz mi jak mam sie odwołać do $tab_wyd aby wyciagnać warość z zapytania które w polu ID ma jakąś wartość - no i chce tą wartość poznać.

dzieki

mmmmmmm
  1. <?php
  2. CONNECT TO DATABASE...
  3. $prefix="gazeta_";
  4.  
  5.  
  6. $tab_wyd=mysql_query("SELECT * FROM ".$prefix."wydania WHERE data_zamkniecia<=NOW() ORDER BY id DESC LIMIT 1");
  7. if(mysql_num_rows($tab_wyd) > 0)
  8. {
  9. echo "<table cellpadding=\"2\" border=1>";
  10. while($r = mysql_fetch_assoc($tab_wyd)) {
  11. echo "<tr>";
  12. echo "<td>".$wyd=$r['id']."</td>";
  13. echo "<td>".$r['numer']."</td>";
  14. echo "</tr>";
  15.  
  16. $wynik = mysql_query("SELECT * FROM ".$prefix."ogloszenia WHERE id_wydania=".$r['id']." AND liczba_pozostalych_emisji>0") or die('Blad zapytania');
  17. // tu coś z tym zrób
  18.  
  19. }
  20. echo "</table>";
  21. }
  22. //do tego momentu wszystko dziala ok - elegancko sie wyswietla
  23.  
  24.  
  25. // zamykamy połączenie
  26. mysql_close($connection);
  27. ?>
chemiqs
  1. $wynik = mysql_query("SELECT * FROM ".$prefix."ogloszenia WHERE id_wydania=".$r['id']." AND liczba_pozostalych_emisji>0") or die('Blad zapytania');


właśnie o to chodzi że jak dam w zapytaniu $r['id'] to mysql_num_rows($wynik)=0 i nie zwróci mi żadnych danych.
A jak wezmę to dziwne przypisanie w pierwszym select - czyli $wyd=$r['id'] - i odwołam sie do $wyd to wszystko działa.
I nie bardzo mój mały móżdziek może ogarnąć dlaczego tak jest. Wreszczie $r jest tablicą czy nie?
erix
var_dump nie łaska sprawdzić?

Poza tym, Twój kod jest podatny na SQL Injection.
chemiqs
smile.gif

  1. var_dump ($r['id']);


odp: NULL
erix
A nie wpadłeś na to, żeby całą tablicę tak podejrzeć...?

Myślenie nie boli.
chemiqs
pewnie ze nie boli smile.gif - próbuję tylko ogarnąć dlaczego to nie działa.
  1. $tab_wyd=mysql_query("SELECT * FROM ".$prefix."wydania WHERE id=(SELECT max(id) FROM ".$prefix."wydania)");
  2. if(mysql_num_rows($tab_wyd) > 0)
  3. {
  4. echo "<table cellpadding=\"2\" border=1>";
  5. while($r = mysql_fetch_assoc($tab_wyd)) {
  6. echo "<tr>";
  7. echo "<td>".$wyd=$r['id']."</td>";
  8. echo ($r['id']);
  9. echo "</tr>";
  10. }
  11. echo "</table>";
  12. }
  13. echo ("<br />==========================================<br />");
  14. echo ($r['id']);

Pierwsze echo ($r['id']); wyrzuca ładnie wartość,
Drugie echo ($r['id']); które się znajduje już poza while już nie zwraca nic.

Wiem że mam ogromne braki w wiedzy smile.gif i dlatego pytam.
Tajgeer
Tablica $r będzie zwracać wartości tylko wewnątrz pętli.
mmmmmmm
W linii 5. masz napisane:
  1. while($r = mysql_fetch_assoc($tab_wyd))

co w tłumaczeniu na język polski znaczy:
DOPÓKI WARTOŚĆ $r POBRANA W WYNIKU DZIAŁANIA FUNKCJI mysql_fetch_assoc Z PARAMETREM $tab_wyd NIE JEST Nullem, TO...
Dlatego OSTATNIE wykonanie tej funkcji powoduje, że zmienna $r jest Nullem.
chemiqs
smile.gif wszystko sie zgadza moi drodzy. jak najbardziej.
Ale dalej nasuwa mi sie pytanie - jak wewnatrz klejnych linii kodu danego skryptu odwołać się do tej wartości która oczywiście jest dostępna tylko wewnątrz WHILE. czyż nie tak jak to zrobiłem
  1. echo "<td>".$wyd=$r['id']."</td>";


proszę o sugestie.
abort
Nie, nie tak.
  1. echo "<td>".$wyd."</td>"; // albo tak
  2. echo "<td>".$r['id']."</td>"; // albo tak

Jedna z dwóch linii. Bo niby co miałoby robić "echo $wyd=$r['id']"?
mmmmmmm
echo $wyd=$r['id'] w każdym NORMALNYM języku programowania powinno zwrócić WYNIK działania, czyli podstawienia. Jeśli zmienna $wyd nie jest read-only, to powinno wrócić True. Bo udało się podstawić smile.gif
abort
Odnośnie tego, co powinno zwrócić, to najlepiej sięgnąć do dokumentacji: http://www.php.net/manual/pl/language.expressions.php (akapit od "PHP rozwija...".

Natomiast co do Twojego oryginalnego pytania odnośnie $r['id'], to już Ci wytłumaczono, ja spróbuję inaczej:
1. budujesz zapytanie do SQL, mające na celu wyciągnąć jakies dane z bazy.
2. robisz pętlę while ($r=mysql_query(...))
3. w pętli obrabiasz wiersz ($r) właśnie pobrany.

Pytanie podstawowe, które powinieneś sobie zadać, to: jaką wartość ma $r po wyjściu z pętli? Otóż, czytając uważnie manual (w linku powyżej) widzimy, że wyrażenie w punkcie 2 można na ludzki język wyrazić: Dopóki istnieje coś w bazie, zrób to co jest w pętli while.

Przyjrzyjmy się temu, co mówi manual n/t instrukcji while: http://www.php.net/manual/pl/control-structures.while.php
Cytat
The meaning of a while statement is simple. It tells PHP to execute the nested statement(s) repeatedly, as long as the while expression evaluates to TRUE.

Mam podejrzenie (graniczące z pewnością), że zmienna $r po wyjściu z pętli ma wartość logicznego FALSE. Bo tylko w takim przypadku następuje wyjście z pętli while (!).
Wobec tego poza pętlą Twoje $r['id'] to coś na kształt FALSE['id'] (co jest konstrukcją bezsensowną). I przypisywanie tej wartości do zmiennej $wyd też jest lekko bez sensu smile.gif

Wypisz sobie poza pętlą:
  1. echo '<pre>';
  2. print_r ($r);
  3. echo '<hr>';
  4. var_dump ($r);
  5. echo '</pre>';


Wtedy wszystko stanie się jasne.

EDIT:
Aha, a skąd $r nagle zamiast z tablicy robi się zmienną logiczną? Bo taką wartość zwróciła mysql_fetch_assoc. Z manuala (http://www.php.net/mysql_fetch_assoc): "Zwraca tablicę zawierającą pobrany wiersz, lub FALSE jeżeli nie ma więcej wierszy w wynik. "

chemiqs
chyba sie nie rozumiemy - najprawodpodobniej ja mieszam smile.gif
Ale jak poza pętlą WHILE odwoływać sie do wartości zapisanej w tablicy $r['id'].

jestem świadomy tego że przebieg pętli będzie tylko raz i SELECT zwróci 1 wartość.

Chciałbym mieć tą wartość zapisaną w jakiejś zmiennej i później robić ponownie SELECTY w innych już tabelach.

Czy to jest zrozumiałe - bo nie wiem czy dobrze tłumaczę.
Zauważcie że ucze się dopiero i sorrki że tak dopytuję.
abort
Nie ma czegoś takiego, jak zawartość zmiennej $r POZA PĘTLĄ. Pisałem już, że mysql_fetch_assoc zwraca poszczególny wiersz z bazy, a jak wierszy już nie ma, to zwraca FALSE (co zresztą jest sygnałem dla while(), by zakończyć działanie). Dlatego poza while() $r nie istnieje. KROPKA.

Poza tym, $r['id'] to ZAWARTOŚĆ POLA W BAZIE DANYCH dla konkretnego wiersza w talicy. Jeśli Ty robisz sobie teraz "SELECT *" z bazy i dostajesz np. 20 wierszy z bazy, to wewnątrz while() odwołanie się do $r['id'] będzie zwracało zawartość tego pola dla danego wiersza. Ale, poza bazą pozostaje pytanie: do KTÓREGO WIERSZA z tych 20 odczytanych chcesz się odwoływać? Skąd ten biedny komputer ma to wiedzieć?

Jeśli chcesz sobie jakieś wartości zachować, dopisz je do tablicy, dodając w pętli np. $tablica[$index] = $r. Jak sobie poukładasz wartości $index, to już Twoja bajka.
chemiqs
dzieki za konstruktywną dyskusję.
cuś tam załapałem smile.gif
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.