Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Tablice a pobieranie danych z bazy MySQL
Szprajcik
post 6.03.2010, 23:44:42
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


Witam, raczkuję w PHP, więc szukam pomocy i tłumaczenia tutaj winksmiley.jpg
Proszę raczej unikać zbyt fachowego nazewnictwa, bo po prostu mogę nie zrozumieć tongue.gif


Ostatnimi czasy męczę się, żeby pobrać wyniki z bazy MySQL (3 pola, id, nick, mail) i sprawdzić, czy nie ma gdzieś pozycji o nicku np. "Nick".
Po pobraniu całej tabeli (* from tabela) zatrzymuję się, bo nie wiem jak to ogarnąć.

Która tablica jest najlepsza, na tego typu dane? fetch_array, row czy assoc? Jak właściwie działa asocjacyjna? (proszę na chłopski rozum, i wujek google i wiki posiada raczej trudne nazewnictwo i nie podają struktury budowy).

Z tym rodzi się kolejny problem. Jeśli już pobiorę tablicę z bazy, jak przejrzeć kolejne wyniki, lecąc od ID 1, do ID (np.) 20?
Z tego, co tłumaczył mi mój nauczyciel, wybrać pole można przez nazwa_tabeli[0], [1], lub [2], w moim przypadku, bo assoc podobno zwraca tablicę numeryczną. Jak w takim przypadku pobrać z pola nazwa_tabeli[0] wynik dla nicka o ID 2?

Dziękuję z góry za pomoc.
Proszę mnie tutaj nie karcić, bo to zniechęca tongue.gif
Go to the top of the page
+Quote Post
d3f3nd3r
post 6.03.2010, 23:54:32
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 6
Dołączył: 9.08.2008

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


Ale nie wyciąga się wszystkiego z bazy a potem za pomocą php "okraja" do tego co potrzebne czy wyciąga potrzebne dane.
Jak tworzysz pytanie to odpytujesz o to co chcesz np id nick czy jak ci potrzebne wszystko to * ale dajesz jakieś ograniczenie poprzez WHERE np nick=`janek` (czy też bardziej rozbudowane). W zależności od tego co ci jest potrzebne tak konstruujesz pytanie.
Go to the top of the page
+Quote Post
MateuszS
post 6.03.2010, 23:56:02
Post #3





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


  1. $zapytanie = mysql_query("SELECT * FROM `tabela`") or die(mysql_error()); //pobieramy wszystkie rekordy z tabeli, w przypadku bledu pobierania pokaze sie stosowny komunikat
  2.  
  3. while($wynik = mysql_fetch_assoc($zapytanie)) { //tworzymy tablice z rekordami po czym "przelatujemy" przez wszystkie po kolei
  4. echo $wynik["id"]." / ".$wynik["nick"]." / ".$wynik["mail"]; //wyswietlamy
  5. }
  6.  
  7. $wynik = mysql_fetch_assoc($zapytanie); // pobierze tylko jeden rekord z bazy
  8.  
  9.  
  10. // mozna tez inaczej
  11.  
  12. while($wynik = mysql_fetch_row($zapytanie)) { //tu mamy nieco inna funkcje
  13. echo $wynik[0]." / ".$wynik[1]." / ".$wynik[2]; //da ten sam efekt
  14. }
  15.  
  16.  
  17. //sprawdzanie czy jest taki nick
  18. $nick = "Mateusz";
  19. $zapytanie = mysql_query("SELECT * FROM `tabela` WHERE `nick`='".$nick."'") or die(mysql_error()); //podobnie mozemy postapic z ID -> WHERE `id`=20
  20. if(mysql_num_rows($zapytanie) != 0) {
  21. echo "jest taki nick w bazie";
  22. } else {
  23. echo "nie ma takiego nicku w bazie;
  24. }
  25.  


milej analizy



--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Szprajcik
post 7.03.2010, 00:01:13
Post #4





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


Aaa, rozumiem.
Czyli nie przelatuję całej bazy z góry na dół, tylko przy pomocy WHERE sprawdzam, czy jest taka opcja?
Jeśli już wyciągnę dane, czy użytkownik "nick" istnieje, to jak wyciągnąć resztę jego danych, id, mail?

Jak wyszukam z WHERE, to wyciągnie mi wszystkie pola?


@MateuszScirka, dzięki wielkie, schemacik naprawdę się przyda.
A mógłbyś mi mniej więcej wytłumaczyć, zobrazować, działanie poszczególnych fetchów?
Go to the top of the page
+Quote Post
d3f3nd3r
post 7.03.2010, 00:13:38
Post #5





Grupa: Zarejestrowani
Postów: 77
Pomógł: 6
Dołączył: 9.08.2008

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


nie sprawdzasz czy jest taki nick a potem odpytujesz ponownie tylko od razy odpytujesz o to co chcesz bo jak nie ma tego czego będziesz szykał przy odpowiednim zapytaniu będziesz o tym wiedział a jak jest to co szukasz to już ci wyciągnie (im mniej zapytań tym lepiej chyba to się zwie optymalizacja)
Go to the top of the page
+Quote Post
MateuszS
post 7.03.2010, 00:14:18
Post #6





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


(mysql_fetch_assoc)
1 fetch w while zapisuje wiersz (rekord) wyniku w tablicy asocjacyjnej, ale że jest w while, to zapisze jeden -> wyswietla, potem zapisuje kolejny -> wyswietla i tak dalej, aż wyświetli wszystkie (bo dałem echo-wyświetlanie)
2 fetch ten samotny, nie w pętli while zapisuje tylko jeden wiersz (rekord) do tabeli asocjacyjnej,
(odwołanie poprzez wpisanie nazwy pola miedzy te fajne nawiasy prostokątne np. $wynik["id"]

(mysql_fetch_row)
3 fetch zapisuje rekord do tablicy wyliczeniowej i działa podobnie jak mysql_fetch_assoc tyle że odwołujemy się do pól tabeli za pomocą $wynik[0] (u ciebie to id), $wynik[2], $wynik[3] itd..

Natomiast funkcja mysql_num_rows służy do policzenia ilości rekordów pobranych przez zapytanie,

Przy pomocy WHERE precyzujesz o jaki wynik Ci chodzi, co chcesz pobrać z bazy, jeżeli chcesz pobrać np. wyniki w których `pole`=1 (załóżmy że jest takich 3) to piszemy ...WHERE `pole`=1 i potem zapisujemy do tabicy.
Przeważnie jeżeli jest nieokreślona ilość rekordów (2, 5, 4444, 666) to korzystamy do wyświetlania i innych operacji z while, jeżeli natomiast wiesz, że będzie tylko jeden rekord, to nie musisz korzystać z while tylko od razu zapisać do tablicy...

Myślę że napisałem baaardzo prosto i zrozumiale, w razie wątpliwości powpisuj nazwy funkcji w Googlach lub zajrzyj do manuala. Pozdro


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Szprajcik
post 7.03.2010, 00:22:28
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


Bardzo jasno, dziękuję uprzejmie tongue.gif.

Ostatnie pytanie.
Nauczyciel mówił mi, że możliwe jest użycie opcji jak w C, albo Pascalu, nie pamiętam, jeśli chodzi o tablice dwuwymiarowe - nazwa_tablicy[0][0]. Da się tak zrobić w PHP?
Go to the top of the page
+Quote Post
MateuszS
post 7.03.2010, 00:32:13
Post #8





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


Pewnie że się da, nawet więcej.

Dużo o tym na GOOGLE

Ten post edytował MateuszScirka 7.03.2010, 00:33:14


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Szprajcik
post 7.03.2010, 00:53:43
Post #9





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


Ok, poczytam, dziękuję bardzo za pomoc.

Jednak Was jeszcze pomęczę ^^`

  1.  
  2. //przy $_POST['nick'] = "nick1" echo nie zwraca nic, tylko - -
  3. $n = $_POST['nick'];
  4. $nick_query = mysql_query("SELECT * FROM `tabela` WHERE `nick`='".$n."'");
  5. $nick = mysql_fetch_assoc($nick_query);
  6.  
  7. echo "$nick[0] - $nick[1] - $nick[2]";
  8.  



Zawartość tabeli:
id - nick - mail
1 - nick1 - nick1@
2 - nick2 - nick1@
3 - nick3 - nick1@
4 - nick4 - nick1@


///edit
Problem rozwiązała zmiana z assoc na row, dlaczego?

Ten post edytował Szprajcik 7.03.2010, 00:59:49
Go to the top of the page
+Quote Post
Kużdo
post 7.03.2010, 00:59:05
Post #10





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Sprawdź sobie to:
Plik zapisz jako test.php:
  1. <?php
  2. require_once 'config.php'; //Plik z danymi bazy i connect
  3. $nick = $_POST['nick']; // Pobiera nick wyslany przez formularz
  4. $wynik = mysql_query("SELECT * FROM tabela WHERE nick = '$nick'"); //Odpytujemy baze o konkretny nick
  5. ?>
  6. <html><head><title>Wyciaganie danych z bazy</title></head>
  7. <body>
  8. <form method="post" action="test.php">
  9. Wpisz nick:<input type="text" name="nick"><br />
  10. <input type="submit"></form>
  11. <?php
  12. while($row = mysql_fetch_row($wynik)){
  13. echo '$wynik[0]= '.$row[0].' | $wynik[1]= '.$row[1].' | $wynik[2]= '.$row[2].'<br />';
  14. } ?>
  15. </html>


Ten post edytował kuzdo 7.03.2010, 01:00:42
Go to the top of the page
+Quote Post
Szprajcik
post 7.03.2010, 01:00:48
Post #11





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


kuzdo, problem rozwiązał się przy zamianie assoc na row. Dlaczego?
Go to the top of the page
+Quote Post
Kużdo
post 7.03.2010, 01:03:09
Post #12





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Bo assoc to tablica asocjacyjna, gdzie komórki mają nazwy, a nie identyfikator.
W assoc byłoby:
  1. '$wynik['id']= '.$row['id'].' | $wynik['nick']= '.$row['nick'].' | $wynik['mail']= '.$row['mail'].'<br />';


Ten post edytował kuzdo 7.03.2010, 01:03:19
Go to the top of the page
+Quote Post
Szprajcik
post 7.03.2010, 01:15:16
Post #13





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


  1. $dodawanie = ('INSERT INTO `gsmfilmp_bukiet`.`bukiet` (`id` ,`nick` ,`mail`) VALUES ( NULL , '".$n."', '".$m."')');


Cytat
Parse error: syntax error, unexpected '"' in /home/gsmfilmp/public_html/inne/fd/bukiet/bukiet.php


Nie wiem do dzisiaj jak wygląda sprawa ' i " w takich poleceniach ^^`
Go to the top of the page
+Quote Post
Kużdo
post 7.03.2010, 01:25:43
Post #14





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Jeżeli cały ciąg dajesz w " " to w środku musisz dać albo ' ' albo \" \". I na odwrót...
Nazwy kolumn w tabeli bez ' ', a same nazwy tabeli możesz też pisać bez ' '. Czyli tak:
  1. $dodawanie = ("INSERT INTO gsmfilmp_bukiet.bukiet (id, nick, mail) VALUES (NULL, '$n', '$m')");

lub
  1. $dodawanie = ("INSERT INTO gsmfilmp_bukiet.bukiet (id, nick, mail) VALUES (NULL, '".$n."', '".$m."')");


Drugi sposób jest o tyle lepszy, że php nie musi zamieniać zmiennych $n i $m na ich wartości i wklejać do całego polecenia, tylko łączy fragmenty poleceń kropkami... Ale ja częściej stosuję pierwszy sposób, bo jest bardziej czytelny (dopatrywanie się jakie tam są cudzysłowy wpisane obok siebie jest masakryczne...) chyba, że konkretny przypadek będzie lepiej załatwić tym drugim sposobem ;P

Ten post edytował kuzdo 7.03.2010, 01:36:26
Go to the top of the page
+Quote Post
Szprajcik
post 7.03.2010, 01:29:30
Post #15





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


O, super, działa ładnie.
Wtedy dodawało mi do bazy zmienne $n i $m ^^`
Go to the top of the page
+Quote Post
Kużdo
post 7.03.2010, 01:36:35
Post #16





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


BTW. czy id jest auto_increment? Jeśli tak, to możesz pominąć z zapytania i będzie samo się zwiększało... Chyba, że to coś innego...

Dodatkowo odpowiadając na Twoje pytanie "Która tablica jest najlepsza, na tego typu dane? fetch_array, row czy assoc?"
To zależy... Jeżeli chcesz mieć wszystko czytelnie rozpisane, to możesz stosować fetch_assoc, ale wtedy musisz wszystkie zmienne podpisywać nazwami kolumn z bazy... $zmienna['id'], $zmienna['nick'], $zmienna['mail']
Jeżeli nie chcesz bawić się w konkretne nazwy, to możesz korzystać z fetch_row, wtedy zmienne są numerowane $zmienna[0], $zmienna[1], $zmienna[2]
A tablica fetch_array to połączenie tych dwóch... Możesz korzystać albo z nazw, albo z numerków np. $zmienna[0], $zmienna['nick'], $zmienna[2]

Teraz już powinieneś wiedzieć co to jest tablica asocjacyjna...
Go to the top of the page
+Quote Post
Szprajcik
post 7.03.2010, 01:41:21
Post #17





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 21.02.2010

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


tak, mam auto_increment winksmiley.jpg

Dziękuję Ci uprzejmie. Teraz rozumiem i na razie sobie radzę winksmiley.jpg
Jakbym miał jakieś problemy lub czegoś nie wiedział, napiszę.

edit biggrin.gif

  1. $dodaj_query = ("UPDATE `gsmfilmp_bukiet`.`bukiet` SET `wys` = "'.$dodaj.'" WHERE `bukiet`.`id` ='".$nick_dodaj[0]."' LIMIT 1");


Znów sprawa " i ', przekleństwo!

Cytat
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING


Ten post edytował Szprajcik 7.03.2010, 01:43:43
Go to the top of the page
+Quote Post
Walian
post 7.03.2010, 01:54:07
Post #18





Grupa: Zarejestrowani
Postów: 124
Pomógł: 1
Dołączył: 13.07.2009

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


  1. $dodaj_query = ("UPDATE `gsmfilmp_bukiet`.`bukiet` SET `wys` = '".$dodaj."' WHERE `bukiet`.`id` = '".$nick_dodaj[0]."' LIMIT 1");


Polecam Ci do tego jakiś notatnik kolorujący składnię - łatwiej zauważyć, gdzie masz błąd.

Ten post edytował Walian 7.03.2010, 01:54:51
Go to the top of the page
+Quote Post
Kużdo
post 7.03.2010, 11:59:02
Post #19





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Polecam Notepad++ bardzo ładnie koloruje składnię i ma wiele przydatnych funkcji, w tym pisanie w kilku liniach na raz, czy edycja kilku plików na raz...

Co do Twojego problemu... Zaczynając pisać zapytanie zaczynasz od czegoś takiego:
  1. $q = ("");

Wpisując kolejne polecenia wychodzi np. takie coś:
  1. $q = ("SELECT `nick` FROM `users` WHERE `id` = ... ");

Jak widzisz całe zapytanie jest objęte cudzysłowami " ", więc jeśli wystąpi w środku zapytania cudzysłów to kończy się jedna część zapytania. W tym przykładzie wszystkie zmienne umieszczane są w apostrofach, więc i zmienna w WHERE też powinna być umieszczona w apostrofach, czyli:
  1. $q = ("SELECT `nick` FROM `users` WHERE `id` = ``");

Umieszczając tam jakąś zmienną, możesz wpisać ją bezpośrednio, ponieważ zmienne w cudzysłowach "$zmienna" są zastępowane przez ich wartości. A całe zapytanie SQL jest umieszczone właśnie w cudzysłowach... Możesz także umieścić zmienną osobno łącząc ją z resztą zapytania, wtedy stosujesz kropkę... Więc są dwie możliwości:
Bezpośrednio:
  1. $q = ("SELECT `nick` FROM `users` WHERE `id` = `$zmienna`");

Z operatorem łączenia (.):
  1. $q = ("SELECT `nick` FROM `users` WHERE `id` = `".$zmienna."`");

Jak widzisz, w przypadku dodawania zmiennej przez kropkę, musisz zakończyć pierwszy ciąg, ale żeby $zmienna była dodana w apostrofach, musisz jeden umieścić przed zakończeniem ciągu, czyli piszesz `id` = `" (najpierw apostrof, żeby $zmienna była umieszczona w apostrofach, później cudzysłów, żeby zamknąć ciąg który zaczyna się od "SELECT), później wstawiasz zmienną przez operator łączenia czyli `id` = `".$zmienna i na koniec musisz dopisać jeszcze jeden ciąg, żeby zapytanie było kompletne. W tym drugim ciągu musi znaleźć się tylko apostrof który otacza zmienną chyba, że chcesz więcej parametrów to dopisujesz coś jeszcze... Czyli: `id` = `".$zmienna."`" Jak widzisz na końcu jest kropka, cudzysłów, apostrof i jeszcze raz cudzysłów. Kropka dodaje to co jest za nią do tego co jest przed nią, pierwszy cudzysłów otwiera ciąg, apostrof będzie interpretowany dosłownie, więc to on zostanie wklejony do całego zapytania i drugi cudzysłów zamykający ciąg. Całość otaczasz nawiasami a na końcu dajesz średnik:
  1. $q = ("SELECT `nick` FROM `users` WHERe `id` = `".$zmienna."`");
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: 26.04.2025 - 03:26