Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]nauka php+mysql, pomocy
chemiqs
post 20.08.2012, 12:28:43
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
!*!
post 20.08.2012, 12:33:42
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował !*! 20.08.2012, 12:39:22


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
wNogachSpisz
post 20.08.2012, 13:56:24
Post #3





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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
Go to the top of the page
+Quote Post
mmmmmmm
post 20.08.2012, 17:40:11
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  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...
Go to the top of the page
+Quote Post
chemiqs
post 23.08.2012, 10:40:45
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
mmmmmmm
post 23.08.2012, 11:21:17
Post #6





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  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. ?>
Go to the top of the page
+Quote Post
chemiqs
post 23.08.2012, 11:46:41
Post #7





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


  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?
Go to the top of the page
+Quote Post
erix
post 23.08.2012, 11:51:57
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




var_dump nie łaska sprawdzić?

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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
chemiqs
post 23.08.2012, 11:59:44
Post #9





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


smile.gif

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


odp: NULL
Go to the top of the page
+Quote Post
erix
post 23.08.2012, 12:37:42
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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

Myślenie nie boli.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
chemiqs
post 23.08.2012, 15:42:20
Post #11





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


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.

Ten post edytował chemiqs 23.08.2012, 15:42:41
Go to the top of the page
+Quote Post
Tajgeer
post 23.08.2012, 15:45:46
Post #12





Grupa: Zarejestrowani
Postów: 290
Pomógł: 48
Dołączył: 11.05.2008
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Tablica $r będzie zwracać wartości tylko wewnątrz pętli.
Go to the top of the page
+Quote Post
mmmmmmm
post 23.08.2012, 18:54:43
Post #13





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
chemiqs
post 23.08.2012, 20:00:09
Post #14





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
abort
post 23.08.2012, 20:14:07
Post #15





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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']"?
Go to the top of the page
+Quote Post
mmmmmmm
post 23.08.2012, 20:29:14
Post #16





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
abort
post 23.08.2012, 20:50:08
Post #17





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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. "



Ten post edytował abort 23.08.2012, 21:02:14
Go to the top of the page
+Quote Post
chemiqs
post 24.08.2012, 11:40:11
Post #18





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
abort
post 24.08.2012, 11:48:12
Post #19





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
chemiqs
post 27.08.2012, 09:13:23
Post #20





Grupa: Zarejestrowani
Postów: 110
Pomógł: 2
Dołączył: 2.06.2012

Ostrzeżenie: (0%)
-----


dzieki za konstruktywną dyskusję.
cuś tam załapałem smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 3.08.2025 - 07:18