Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]Zmienna PHP w zapytaniu SQL
EthanLyonall
post 8.09.2016, 15:43:38
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 17.08.2016

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


Witam, mam następujący kod:

DatabaseManager.class.php
  1. <?php
  2. class DatabaseManager
  3. {
  4. static public function getConnection()
  5. {
  6. $conn = @new mysqli(DB_SERVER, DB_USERNAME, DB_PW, DB_DB);
  7.  
  8. if(mysqli_connect_errno())
  9. {
  10. echo "Błąd połączenia z bazą danych! Skontaktuj się z administratorem!";
  11. exit();
  12. }
  13. else
  14. return $conn;
  15. }
  16.  
  17. static public function selectBySQL($SQL)
  18. {
  19. $conn = self::getConnection();
  20. $SQL = $conn->real_escape_string($SQL);
  21. $result = $conn->query($SQL);
  22.  
  23. if(!$result)
  24. {
  25. echo "Błąd zapytania! Skontaktuj się z administratorem!";
  26. exit();
  27. }
  28. else
  29. {
  30. $resultArray = Array();
  31.  
  32. while(($row = $result->fetch_array(MYSQLI_ASSOC)) !== NULL)
  33. {
  34. $resultArray[] = $row;
  35. }
  36.  
  37. if(count($resultArray) > 0)
  38. return $resultArray;
  39. else
  40. return false;
  41. }
  42.  
  43. mysqli_close($conn);
  44. }
  45. }
  46. ?>


ModuleLoader.class.php:
  1. <?php
  2. class ModuleLoader
  3. {
  4. static public function load($MODULE)
  5. {
  6. switch($MODULE)
  7. {
  8. /*///////////*/ case 'login':
  9. if(!isset($_POST['login']))
  10. {
  11. header("Location: mainmenu");
  12. exit();
  13. }
  14.  
  15. $login = $_POST['login'];
  16. $login = htmlentities($login, ENT_QUOTES, "UTF-8");
  17.  
  18. DatabaseManager::selectBySQL("SELECT * FROM users WHERE username='$login'");
  19.  
  20. if($resultArray)
  21. {
  22. $password = $_POST['password'];
  23.  
  24. if(password_verify($password, $resultArray['password']))
  25. {
  26.  
  27. $_SESSION['online'] = true;
  28. $_SESSION['login'] = $login;
  29.  
  30. $result->free_result();
  31.  
  32. unset($_POST['password']);
  33. unset($_POST['login']);
  34. header("Location: home");
  35. }
  36. else
  37. {
  38. $result->free_result();
  39. $_SESSION['repeat_login'] = '<span style="color: red">Nieprawidłowy login lub hasło!</span>';
  40. header("Location: mainmenu");
  41. }
  42. }
  43. else
  44. {
  45. $_SESSION['repeat_login'] = '<span style="color: red">Nieprawidłowy login lub hasło!</span>';
  46. header("Location: mainmenu");
  47. }
  48. break;
  49. }
  50. }
  51. }
  52. ?>


Problem pojawia się w 18 linii pliku ModuleLoader.class.php z samym zapytaniem. Nie ważne w jaki sposób próbuje tą zmienną włożyć do zapytania uaktywnia się if z 23 linii pliku DatabaseManager.class.php świadczący o złym sformułowaniu zapytania.

Jeżeli to samo zapytanie występuje bez zmiennej, załóżmy:
"SELECT * FROM users WHERE id=1"
To wszystko działa jak powinno (tj. uaktywnia się if z 37 linii (DatabaseManager.class.php) jeżeli wyszukanie nic nie znalazło lub else z 39 linii (DatabaseManager.class.php) jeżeli zapytanie coś wyszukało).

Problem pojawia się właśnie w chwili gdy chce do zapytania włożyć zmienną php. Próbowałem na różne sposoby:
1. "SELECT * FROM users WHERE username='$login'"
2. 'SELECT * FROM users WHERE username="$login"'
3. "SELECT * FROM users WHERE username='".$login."'"
4. 'SELECT * FROM users WHERE username="'$login'"'
5. "SELECT * FROM users WHERE username='{$login}'"
6. 'SELECT * FROM users WHERE username="{$login}"'
7. "SELECT * FROM users WHERE username='.{$login}.'"
8. 'SELECT * FROM users WHERE username=".{$login}."'
9. "SELECT * FROM users WHERE username='%$login%'"

Niestety żaden ze sposób nie przyniósł żadnego lepszego efektu.
Go to the top of the page
+Quote Post
viking
post 8.09.2016, 15:51:52
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Ta twoja klasa jest do kitu. real_escape_string powinien escapować część zapytania czyli wartość wkładaną. Do tego $SQL może zwrócić null i nawet o tym nie będziesz wiedział.


--------------------
Go to the top of the page
+Quote Post
lustfingers
post 9.09.2016, 20:50:22
Post #3





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


Nie znam się na PHP ale na moje oko to linia 18 powinna wyglądać tak:

  1. DatabaseManager::selectBySQL('SELECT * FROM users WHERE username='.$login);
Go to the top of the page
+Quote Post
kapslokk
post 9.09.2016, 20:54:06
Post #4





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Na sql'u też się nie znasz, skoro chcesz wciskać string do zapytania bez apostrofów / cudzysłowów.

Ten post edytował kapslokk 9.09.2016, 20:54:38
Go to the top of the page
+Quote Post
lustfingers
post 10.09.2016, 09:15:08
Post #5





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


Ciekawe forum, widzę że łatwiej jest komuś wytknąć błąd niż dać rzeczową poradę które może na kierunkować na rozwiązanie. Tak nie znam sie i nie jestem programistą, interesuje sie tym od niedawna w wolnym czasie w ramach hobby.
Go to the top of the page
+Quote Post
kapslokk
post 10.09.2016, 09:29:12
Post #6





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Wytknalem Ci błąd, bo wprowadzasz innych użytkowników w błąd, a rzeczowej porady udzielił już viking i więcej do dodania już tutaj nie ma
Go to the top of the page
+Quote Post
viking
post 10.09.2016, 11:30:32
Post #7





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Żeby nie było że mało rzeczowo. Weź sobie jakiś orm typu Propel i zobacz jak to tam wygląda. Najlepiej użyj zewnętrzne rozwiązanie albo nawet goły kod PDO / Mysqli. Poczytaj o bindowaniu, zobacz w dokumentacji jak to wygląda. To co tu przedstawiłes nadaje się tylko do kosza.


--------------------
Go to the top of the page
+Quote Post
szajens
post 17.09.2016, 06:22:44
Post #8





Grupa: Zarejestrowani
Postów: 150
Pomógł: 4
Dołączył: 3.01.2010

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


  1. DatabaseManager::selectBySQL("SELECT * FROM users WHERE username='$login'");


Ten post edytował szajens 17.09.2016, 06:34:29
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.2024 - 23:40