Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Niedziałająca funkcja zliczająca rekordy
Matt23
post
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
SmokAnalog
post
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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ą.
Go to the top of the page
+Quote Post
Matt23
post
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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.

Ten post edytował Matt23 23.07.2014, 21:33:39
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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 (IMG:style_emoticons/default/smile.gif)

Fajnie, że się uczysz!
Go to the top of the page
+Quote Post
Matt23
post
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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 (IMG:style_emoticons/default/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?
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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'));
Go to the top of the page
+Quote Post
Matt23
post
Post #7





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


Łą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
Go to the top of the page
+Quote Post
Turson
post
Post #8





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


W poście #6 jest podpowiedź jak wyświetlić błędy w zapytaniach
Go to the top of the page
+Quote Post
Matt23
post
Post #9





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


@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
Go to the top of the page
+Quote Post
Turson
post
Post #10





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Pokaż cały kod jak teraz wygląda
Go to the top of the page
+Quote Post
Matt23
post
Post #11





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


  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. }
Go to the top of the page
+Quote Post
Turson
post
Post #12





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Na linii 7 dodaj jeszcze
  1. var_dump($ist_user);
bo moze byc ze zaden warunek nie pasuje
Go to the top of the page
+Quote Post
Matt23
post
Post #13





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


@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



Go to the top of the page
+Quote Post
Turson
post
Post #14





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jeżeli var_dump daje null, to znaczy że żaden warunek w funkcji nie został spełniony
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #15





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Zauważ, że przekazujesz liczbę do mysql_num_rows.
Go to the top of the page
+Quote Post
Matt23
post
Post #16





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


@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?
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #17





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Matt23
post
Post #18





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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ć. :|
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #19





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
Matt23
post
Post #20





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 16:06