Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Niedziałająca funkcja zliczająca rekordy
Forum PHP.pl > Forum > Przedszkole
Matt23
Witam, stworzyłem taką oto funkcję

  1. <?
  2. function ile_rekordow($tabela, $pole, $wartosc, $pole2 = 0, $wartosc2 = 0, $inne = 0){ //pobiera nazwę tabeli, pole nr 1 do sprawdzenia, wartosc dla pola nr 1, pole nr 2, wartosc dla pola nr2, i parametr "inne"
  3. include("/../config.php");
  4. if($pole2 == 0 && $wartosc2 == 0 && $inne == 0){ //jeśli podane zostały tylko `tabela`, pole i 'wartosc' dla pola
  5.  
  6. $miejsce = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) FROM $tabela WHERE $pole = '$wartosc'"));
  7.  
  8. return $miejsce;
  9. }
  10. if($pole2 != 0 && $wartosc2 != 0 && $inne == 0){ //jeśli podane są wszystkie pola prócz "inne"
  11.  
  12. $miejsce = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) FROM $tabela WHERE $pole = '$wartosc' AND $pole2 = '$wartosc2'"));
  13.  
  14. return $miejsce;
  15.  
  16. }
  17. if($pole2 !=0 && $wartosc2 != 0 && $inne == 1){ //jeśli wszystkie pola, a inne ma wartość 1
  18.  
  19. $miejsce = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) FROM $tabela WHERE $pole = '$wartosc' AND $pole2 != '$wartosc2'")); //!= przy drugim sprawdzerniu
  20.  
  21. return $miejsce;
  22. }
  23. }
  24. ?>


Niestety funkcja nie działa. Próbuję ją wykorzystać między innymi w taki sposób:

  1. $ist_user_haslo = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo);
  2. $ist_user = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo, 1);
  3. if($ist_user[0] == 1) {
  4. $status="wrong_password";
  5. alert('Logowanie nieudane.<br> Sprawdź pisownię nicku oraz hasła.');
  6. logi($login, $status);
  7. }
  8.  
  9. if ($ist_user_haslo[0] == 0) {
  10.  
  11. $status="user_doesnt_exist";
  12. alert('Logowanie nieudane.<br> Nie ma takiego użytkownika.');
  13. logi($login, $status);
  14. }
  15. if($ist_user_haslo[0] == 1){
  16.  
  17. $status="logged";
  18. logi($login, $status);
  19.  


Proszę o wskazanie moich błędów.
SmokAnalog
Zobacz sobie co zwraca mysql_fetch_assoc. A tak swoją drogą, to Twoja funkcja woła o pomstę do nieba. Poczytaj o SQL Injection, a poza tym po co robisz cokolwiek po użyciu instrukcji return? Ona kończy działanie funkcji i Twoje mysql_close oraz exit nigdy nie zostaną wykonane. Zresztą sens wstawienia tam exit też jest dla mnie zagadką.
Matt23
Niektóre z elementów mojego kodu mogą być bez sensu, ponieważ cały czas jestem w jednym z początkowych stadiów poznawania tego języka.

Chciałbym jeszcze podpytać, czy

  1. if($ist_user[0] == 1)


jest poprawne, czy muszę dać indeks w '' czy musi to być pole z bazy?

Aha, Sql Injection raczej mi nie grozi, ponieważ wszystkie zmienne sa na sztywno wsadzone w kod. Przy czym, próbowałem już tego na innych moich skryptach i stety/niestety nie udawało mi się zhackować samego siebie.
SmokAnalog
Moim zdaniem jeśli funkcja nazywa się ile_rekordow(), to powinna zwracać finalną liczbę, a nie tablicę. W Twoim przypadku zamiast mysql_fetch_assoc zastanowiłbym się czy nie lepiej użyć mysql_result, która nie zwraca tablicy, ale wartość właściwą.

Co do SQL Injection, to w programowaniu chodzi też o to, żeby pisać kod z myślą o przyszłości. Twoja funkcja może się przydać w Twoich przyszłych projektach i lepiej, żeby była odporna na wszystko. Kiedyś możesz zapomnieć, że ona ma taką wadę i wtedy klops smile.gif

Fajnie, że się uczysz!
Matt23
Trochę popracowałem i mam coś takiego

  1. <?
  2. function ile_rekordow($tabela, $pole, $wartosc, $pole2 = 0, $wartosc2 = 0, $inne = 0){
  3. include("/../config.php");
  4. if($tabela != 0 && $pole != 0 && $wartosc != 0 && $pole2 == 0 && $wartosc2 == 0 && $inne == 0){
  5.  
  6. $miejsce = mysql_num_rows(mysql_query("SELECT * FROM $tabela WHERE $pole = '$wartosc'"));
  7.  
  8. return $miejsce;
  9. }
  10. if($tabela != 0 && $pole != 0 && $wartosc != 0 && $pole2 != 0 && $wartosc2 != 0 && $inne == 0){
  11.  
  12. $miejsce = mysql_num_rows(mysql_query("SELECT * FROM $tabela WHERE $pole = '$wartosc' AND $pole2 = '$wartosc2'"));
  13.  
  14. return $miejsce;
  15. }
  16. if($tabela != 0 && $pole != 0 && $wartosc != 0 && $pole2 !=0 && $wartosc2 != 0 && $inne == 1){
  17.  
  18. $miejsce = mysql_num_rows(mysql_query("SELECT * FROM $tabela WHERE $pole = '$wartosc' AND $pole2 != '$wartosc2'"));
  19.  
  20. return $miejsce;
  21. }
  22. }
  23. ?>


Rzecz jasna, nie działa wink.gif
Dlaczego?

Nie ważne co wpiszę w formularzu, zawsze zwraca że taki użytkownik nie istnieje.


  1. $ist_user_haslo = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo);
  2. $ist_user = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo, 1);
  3. if($ist_user == 1) {
  4. $status="wrong_password";
  5. alert('Logowanie nieudane.<br> Sprawdź pisownię nicku oraz hasła.');
  6. logi($login, $status);
  7. echo $ist_user;
  8. }
  9.  
  10. if ($ist_user_haslo == 0) {
  11.  
  12. $status="user_doesnt_exist";
  13. alert('Logowanie nieudane.<br> Nie ma takiego użytkownika.');
  14. logi($login, $status);
  15. echo $ist_user_haslo;
  16. }
  17. if($ist_user_haslo == 1){
  18.  
  19. $status="logged";
  20. logi($login, $status);
  21.  
  22. $_SESSION['nick'] = $login;
  23. $_SESSION['haslo'] = $haslo;
  24.  
  25. header("Location: panel.php");
  26. }


Więc wykonuje sie o dziwo drugi if{}. Niestety echo $ist_nick nie zwraca nic.
Czy zapytania do bazy są poprawnie skonfigurowane?
SmokAnalog
Jesteś pewien, że prawidłowo łączysz się z bazą? Możesz na próbę zrobić jakieś zapytanie i w razie problemów wywalić błąd:
  1. mysql_query('SELECT * FROM `admins`') or die(mysql_error());


Taka luźna myśl, może prościej byłoby, gdyby funkcja przyjmowała tylko dwa argumenty: nazwę tabeli i tablicę pól? Czyli wywoływałbyś ją np. tak:
  1. $ile = ile_rekordow('admins', array('nick' => 'janek', 'haslo' => 'abc123'));
Matt23
Łączenie z bazą działa na pewno, ponieważ dzieje się to w zaincludowanym config.php.

zapytania w funkcji zmieniłem na

  1. $miejsce = mysql_query("SELECT * FROM $tabela WHERE $pole = '$wartosc' AND $pole2 = '$wartosc2'");


a w sprawdzeniu na min.

  1. if(mysql_num_rows($ist_user_haslo) == 1)


W wywoływaniu skryptu dostaję

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in C:\WebServ\httpd\admin\login.php on line 38

nie wiem dlaczego
Turson
W poście #6 jest podpowiedź jak wyświetlić błędy w zapytaniach
Matt23
@up

Dopisałem do zapytań w funkcji, ale nie pokazuje mi żadnych errorów w wyniku w pliku login.php (który wykonuje te funkcje)

cały czas jest ten warning z poprzedniego posta
Turson
Pokaż cały kod jak teraz wygląda
Matt23
  1. <?
  2. function ile_rekordow($tabela, $pole, $wartosc, $pole2 = 0, $wartosc2 = 0, $inne = 0){
  3. include("/../config.php");
  4. if($tabela != 0 && $pole != 0 && $wartosc != 0 && $pole2 == 0 && $wartosc2 == 0 && $inne == 0){
  5.  
  6. $miejsce = mysql_query("SELECT * FROM $tabela WHERE $pole = '$wartosc'") or die(mysql_error());
  7.  
  8. return $miejsce;
  9. }
  10. if($tabela != 0 && $pole != 0 && $wartosc != 0 && $pole2 != 0 && $wartosc2 != 0 && $inne == 0){
  11.  
  12. $miejsce = mysql_query("SELECT * FROM $tabela WHERE $pole = '$wartosc' AND $pole2 = '$wartosc2'") or die(mysql_error());
  13.  
  14. return $miejsce;
  15. }
  16. if($tabela != 0 && $pole != 0 && $wartosc != 0 && $pole2 !=0 && $wartosc2 != 0 && $inne != 0){
  17.  
  18. $miejsce = mysql_query("SELECT * FROM $tabela WHERE $pole = '$wartosc' AND $pole2 != '$wartosc2'") or die(mysql_error());
  19.  
  20. return $miejsce;
  21. }
  22. }
  23. ?>


Plik login.php

  1. /////////////////
  2. ///reszta kodu
  3. /////////////////
  4.  
  5.  
  6. $ist_user_haslo = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo);
  7. $ist_user = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo, 1);
  8. if (mysql_num_rows($ist_user_haslo) == 0) {
  9.  
  10. $status="user_doesnt_exist";
  11. alert('Logowanie nieudane.<br> Nie ma takiego użytkownika.');
  12. logi($login, $status);
  13. }
  14.  
  15. if(mysql_num_rows($ist_user) == 1) {
  16. $status="wrong_password";
  17. alert('Logowanie nieudane.<br> Sprawdź pisownię nicku oraz hasła.');
  18. logi($login, $status);
  19. }
  20.  
  21. if(mysql_num_rows($ist_user_haslo) == 1){
  22.  
  23. $status="logged";
  24. logi($login, $status);
  25.  
  26. header("Location: panel.php");
  27. }
Turson
Na linii 7 dodaj jeszcze
  1. var_dump($ist_user);
bo moze byc ze zaden warunek nie pasuje
Matt23
@up

dodałem to między 7 a 8 linią i po wprowadzeniu wszystkich kombinacji danych (user istenieje, hasło nie itp)

cały czas var dump daje NULL
jest error

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in C:\WebServ\httpd\admin\login.php on line 99

czyli w pierwszym IF{} cos mu nie pasuje (linia 8 w poprzednim poscie) aczkolwiek wyświetla alerta zapisanego w tym IFie



Turson
Jeżeli var_dump daje null, to znaczy że żaden warunek w funkcji nie został spełniony
SmokAnalog
Zauważ, że przekazujesz liczbę do mysql_num_rows.
Matt23
@SmokAnalog,

więc chyba porównując czy przekazana liczba == 1 nie popełniam błędu?

Rozumiem, że zapytania w funkcji są do poprawy, tak?
SmokAnalog
Miałem na myśli ten fragment:
Cytat(Matt23 @ 24.07.2014, 15:05:28 ) *
  1. $ist_user_haslo = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo);
  2. $ist_user = ile_rekordow('admins', 'nick', $login, 'haslo', $haslo, 1);
  3. if (mysql_num_rows($ist_user_haslo) == 0) {


Zmienna $ist_user_haslo zawiera liczbę zwróconą przez ile_rekordow(), a Ty podajesz ją jako parametr mysql_num_rows. To nie ma sensu smile.gif
Matt23
Usunąłem mysql_num_rows i nadal nic nie idzie, vardump null.

Skrypt ładnie działał, nawet jak liczbę brałem do tablicy (a właściwie "programista" tego systemu logowania tak robił), lecz odkąd zacząłem poznawać funkcje zachciało mi się kombinować. :|
SmokAnalog
Musisz się nauczyć debugować kod. Wstaw na przykład do każdego ifa w funkcji die('Coś'), żeby zobaczyć która instrukcja się wywołała. Twoja funkcja jest generalnie kiepsko napisana na ten moment, jest mało czytelna i mało elastyczna. Moim skromnym zdaniem jest też zbędna, bo co za problem wywołać mysql_num_rows? No ale uczysz się, to warto na takim przykładzie.
Matt23
Skoro twierdzisz, że to bezsensu, to chyba sobie daruje. Wprawdzie takich sprawdzeń mam w kodzie więcej, ale szkoda mi na to czasu.

Dziękuję wszystkim za próbę pomocy.
Bodzimier
Cytat(SmokAnalog @ 24.07.2014, 15:55:44 ) *
Musisz się nauczyć debugować kod.


Złote słowa. Im wcześniej się nauczysz debugować, tym mniej stracisz włosów na głowie wink.gif

W zależności jakiego systemu używasz i jakiego IDE:

INSTALACJA
http://xdebug.org/docs/install
http://xdebug.org/wizard.php - tutaj masz okienko gdzie możesz wklepać ustawienia PHP i czarodziej podpowie Ci, którą wersje masz ściągnąć.

KONFIGURACJA
http://wiki.netbeans.org/HowToConfigureXDe...onfigure_XDebug
http://www.jetbrains.com/phpstorm/webhelp/...ing-xdebug.html
http://confluence.jetbrains.com/display/Ph...tallation+Guide

JAK DEBUGOWAĆ
https://netbeans.org/kb/docs/php/debugging.html
http://ahoj.io/debugging-php-in-netbeans-using-xdebug

http://www.youtube.com/watch?v=4Vx8TnNdQ6M //Using xDebug in NetBeans


Jest cała masa informacji jak zainstalować/skonfigurować/używać.

Złota recepta: google.com, a tam piszesz "xdebug <nazwa twojego OS> <nazwa twojego IDE>"

Na youtube'ie też pełno tego smile.gif

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