Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL I PHP] Problem z fetch_assoc
Forum PHP.pl > Forum > Bazy danych > MySQL
elwierka
Witajcie

Właśnie próbuję napisać aplikację do składania zamówień przez internet i mam problem z odczytywaniem wyników zapytań z bazy danych mysql :shout: . Pobieram dane z bazy i zwracam jako obiekt.
(fragment kodu)
  1. $lacz = con_to_db(); //funkcja ustanawiająca połączenie z bazą
  2. $zapytanie = "select * from klienci where login = '".$login."'";
  3. $wynik = $lacz->query($zapytanie);
  4.  
  5. if (!$wynik) {
  6. throw new Exception('Błąd.');
  7. }
  8.  
  9. $ilosc = $wynik->num_rows;
  10.  
  11. if($ilosc > 0) {
  12. while($rzad = $wynik->fetch_assoc()) {
  13. echo $rzad['adres']."<br />;
  14. echo $rzad['nip']."<br />;
  15. }
  16. } else {
  17. echo "Komunikat o błędzie";
  18. }

Niestety, jak odczytuję wyniki za pomocą fetch_assoc(), skrypt podczas wykonywania się, resetuje połączenie..."Połaczenie zostało przerwane podczas negocjacji" - pojawia się komunikat w tym stylu.

Nie ma jednak żadnego problemu, jeśli zamiast fetch_assoc() użyję fetch_row i odczytuję wyniki jako $rzad[0], $rzad[1] itd.....

Tak samo jest, jeśli chcę odczytać dane o wszystkich osobach, zawarte w tabeli klienci (nie dane konkretnej osoby).

Od kilku dni nie mogę sobie poradzić z tym problemem...a muszę dalej pisać aplikację...Czy ktoś z Was wie o co może chodzić? Dlaczego tak się dzieje?

Z góry dzięki za odp.
Mchl
Tak na pierwszy rzut oka brakuje cudzysłowów tutaj:

Kod
echo $rzad['adres']."<br />";
echo $rzad['nip']."<br />";


Rozumiem, że $lacz to obiekt MySQLi?
elwierka
wiem wiem smile.gif zauważyłam, pisałam tu kod "z palca" i zapomniałam, że nie ma automatycznego zamykania cudzysłowów winksmiley.jpg - i już nie chciałam edytować postu... ale w skrypcie jest zamknięty smile.gif

tak, $ lacz to obiekt mysqli....połączenie z bazą wydaje się być w porządku, wstawiać dane do bazy mogę bez problemów, tak samo nie ma problemu np przy logowaniu się do systemu
Mchl
No to pokaż prawdziwy kod tongue.gif

co się dzieje jak użyjesz
Kod
$rzad = $wynik->fetch_array(MYSQLI_ASSOC);
elwierka
Tak więc, przedstawiam kod. Funkcje tworz_nagl_html(), menu(), tworz_stopke() mają jedynie za zadanie wyświetlić te elementy na stronie.

  1. require_once('funkcje_aplikacji.php');
  2. tworz_nagl_html('Dane klienta');
  3. sprawdz_zalogowanie_uzyt();
  4.  
  5. $lacz = con_to_db(); //funkcja ustanawiająca połączenie z bazą
  6. $zapytanie = "select * from klienci where login = '".$_SESSION['user_ok']."'";
  7. $wynik = $lacz->query($zapytanie);
  8.  
  9. if (!$wynik) {
  10. throw new Exception('Błąd.');
  11. }
  12.  
  13. $ilosc = $wynik->num_rows;
  14.  
  15. if($ilosc > 0) {
  16. while($rzad = $wynik->fetch_assoc()) {
  17. //odczytywanie danych z kolumn tabeli, np.
  18. echo $rzad['adres']."<br />";
  19. echo $rzad['nip']."<br />";
  20. }
  21. } else {
  22. echo "Komunikat o błędzie";
  23. }
  24.  
  25. menu();
  26. tworz_stopke();
  27.  


wykorzystywane funkcje:

  1. function con_to_db() {
  2. @ $db = new mysqli('localhost','user','pass','nazwa_db');
  3. if (!$db) {
  4. throw new Exception('Połączenie z serwerem bazy danych nie powiodło się');
  5. } else {
  6. return $db;
  7. }
  8. }
  9.  
  10. function sprawdz_zalogowanie_uzyt() {
  11. //funkcja sprawdza, czy użytkownik jest zalogowany, jeśli nie to informuje o tym
  12. if (isset($_SESSION['user_ok'])) {
  13. echo "Zalogowano jako ".$_SESSION['user_ok'].".<br />";
  14. } else {
  15. // nie jest zalogowany
  16. tworz_nagl_html('Nie zostałeś zalogowany do systemu:');
  17. echo 'Brak zalogowania.<br />';
  18. tworz_HTML_URL('logow_do_sys.php', 'Logowanie');
  19. tworz_stopke();
  20. }


Nie mam w tym momencie możliwości spr
  1. $rzad = $wynik->fetch_array(MYSQLI_ASSOC);


sprawdzę po południu i dam znać co się dzieje.

No niestety dzieje się to samo, czyli resetuje się połączenie...

"Przerwane połączenie
Połączenie z serwerem zostało zresetowane podczas wczytywania strony.
Połączenie sieciowe zostało przerwane podczas negocjacji. Spróbuj ponownie."

Mchl
Masz ustawione wyświetlanie błędów?
elwierka
display_errors = On
Mchl
a poziom raportowania?

Kod
error_reporting(E_ALL);
gdzieś na początku
elwierka
error_reporting = E_ALL & ~E_NOTICE

display_startup_errors = Off

log_errors = Off

extension=php_mysqli.dll
Mchl
okok, wszystko jak trzeba... winksmiley.jpg

Tylko dlaczego nie działa? Nie widzę nic :/

Co mówi var_dump($wynik) ?
elwierka
odpowiada:

  1. object(mysqli_result)#2 (0) { }


W katalogu serwera /log znalazlam plik error i po próbie wywołania tego nieszczęsnego skryptu pojawiła się taka linijka informacji:

  1. [Tue Apr 20 20:56:28 2010] [notice] Parent: child process exited with status 3221225477 -- Restarting.
  2. httpd.exe: Could not reliably determine the server's fully qualified domain name, using 192.168.1.18 for ServerName
  3. [Tue Apr 20 20:56:30 2010] [notice] Apache/2.2.11 (Win32) PHP/5.2.13 configured -- resuming normal operations
  4. [Tue Apr 20 20:56:30 2010] [notice] Server built: Dec 10 2008 00:10:06
  5. [Tue Apr 20 20:56:30 2010] [notice] Parent: Created child process 1668
  6. httpd.exe: Could not reliably determine the server's fully qualified domain name, using 192.168.1.18 for ServerName
  7. httpd.exe: Could not reliably determine the server's fully qualified domain name, using 192.168.1.18 for ServerName
  8. [Tue Apr 20 20:56:30 2010] [notice] Child 1668: Child process is running
  9. [Tue Apr 20 20:56:30 2010] [notice] Child 1668: Acquired the start mutex.
  10. [Tue Apr 20 20:56:30 2010] [notice] Child 1668: Starting 64 worker threads.
  11. [Tue Apr 20 20:56:31 2010] [notice] Child 1668: Starting thread to listen on port 80.
  12. [Tue Apr 20 20:56:31 2010] [notice] Parent: child process exited with status 3221225477 -- Restarting.
  13. httpd.exe: Could not reliably determine the server's fully qualified domain name, using 192.168.1.18 for ServerName
  14. [Tue Apr 20 20:56:32 2010] [notice] Apache/2.2.11 (Win32) PHP/5.2.13 configured -- resuming normal operations
  15. [Tue Apr 20 20:56:32 2010] [notice] Server built: Dec 10 2008 00:10:06
  16. [Tue Apr 20 20:56:32 2010] [notice] Parent: Created child process 2512
  17. httpd.exe: Could not reliably determine the server's fully qualified domain name, using 192.168.1.18 for ServerName
  18. httpd.exe: Could not reliably determine the server's fully qualified domain name, using 192.168.1.18 for ServerName
  19. [Tue Apr 20 20:56:32 2010] [notice] Child 2512: Child process is running
  20. [Tue Apr 20 20:56:32 2010] [notice] Child 2512: Acquired the start mutex.
  21. [Tue Apr 20 20:56:32 2010] [notice] Child 2512: Starting 64 worker threads.
  22. [Tue Apr 20 20:56:32 2010] [notice] Child 2512: Starting thread to listen on port 80.




Nie wiem, może jakieś ustawienia serwera muszę zmienić? Może w php.ini....nie wiem co się dzieje ale taki głupi błąd blokuje mnie z pisaniem już od dwóch dni wstydnis.gif

A jeszcze w pliku serwera /log/access jest taki zapis:

  1. 127.0.0.1 - - [20/Apr/2010:21:21:57 +0200] "GET /wsh/wsh/produkty.php HTTP/1.1" 200 1339
  2. 127.0.0.1 - - [20/Apr/2010:21:21:57 +0200] "GET /wsh/wsh/includes/css/style.css HTTP/1.1" 304 -
  3. 127.0.0.1 - - [20/Apr/2010:21:22:04 +0200] "GET /wsh/wsh/produkty.php HTTP/1.1" 200 176


treść tego skrypciku zapisałam dla testów w pliku produkty.php
Mchl
Jeśli apacz się wywraca przy czymś takim, to jedyne co mi przychodzi do głowy, to jakaś trefna instalacja PHP albo Apache...
W kodzie nie widzę nic niepoprawnego.
elwierka
nooo superrr....krok do przodu biggrin.gif sprawdziłam no i nie przekopiowałam plików .dll z katalogu php do katalogu Windows i windows/windows32 no i pliku php.ini do windows ..... serwer się teraz nie resetuje, ale jeszcze nie wyświetla wynikow....

  1. if($num>0){
  2. while($rzad = $wynik->fetch_assoc()){
  3. echo $rzad['nip']."<br />";
  4. echo $rzad['adres']."<br />";
  5. echo $rzad['login']."<br />";
  6. echo $rzad['nazwa_pelna']."<br />";
  7. }
  8. }


przy wyświetlaniu wyników, mam tylko <br />....będę grzebać dalej...może o czymś jeszcze zapomniałam...
Mchl
Włącz sobie raportowanie na poziomie E_ALL (a nie E_ALL & ~E_NOTICE). Wyświetlą Ci się wtedy informacje o nie zdefiniowanych zmiennych itp. Możliwe że masz na przykład pomyłki w nazwach pól tabeli (małe/duże litery)
elwierka
kurcze ... wielkie dzięki smile.gif wiedziałam, że to musi być jakiś "błąd w sztuce"...hehe

Po 1.
Brak skopiowanych plików .dll z php do kat. windows i windows/windows32
Brak skopiowanego pliku php.ini do kat. windows

Po 2.
Rzeczywiście, odwoływałam się do pól nie z tej tabeli .. nazwę zmieniłam, wszystko już super śmiga biggrin.gif

Dzięki serdeczne

Temat można uznać za zamknięty 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.