Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Zmienna PHP w zapytaniu SQL
Forum PHP.pl > Forum > PHP
EthanLyonall
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.
viking
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ł.
lustfingers
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);
kapslokk
Na sql'u też się nie znasz, skoro chcesz wciskać string do zapytania bez apostrofów / cudzysłowów.
lustfingers
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.
kapslokk
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
viking
Ż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.
szajens
  1. DatabaseManager::selectBySQL("SELECT * FROM users WHERE username='$login'");
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.