Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: prepared statement - bind_param
Forum PHP.pl > Forum > PHP
taktu
Czy ktoś potrafi wytłumaczyć dlaczego ten kod nie wywala błędu? ba nawet zwraca wyniki zupełnie jak w przypadku kiedy w bind_param podstawie poprawna literę czyli 's'. Błąd wywala jedynie dla 'b' oraz niepoprawnej ilości parametrów.

  1. <?php
  2. //polaczenie z baza etc.
  3.  
  4. $sql = 'SELECT * FROM user WHERE user_name = ?';
  5.  
  6. $value = 'admin';
  7.  
  8. $stmt = $mysqli->prepare( $sql );
  9.  
  10. $stmt->bind_param( 'i' , $value );
  11.  
  12. $stmt->execute();
  13. ?>


Sprawdziłem to dogłębnie i jeżeli bind_param 'oczekuje' wartości typu int a podamy mu string to wynikiem będzie wartość 0 (tak jak w rzutowaniu). Ale niestety zapytanie zostanie wykonane z tą wartością czyli dla kodu powyżej poleci

  1. <?php
  2. $sql = 'SELECT * FROM user WHERE user_name = 0';
  3. ?>


czyli wypisze wszystkie rekordy z tabeli user, tu jest to bardziej błąd programisty bo w bind_param powinno być 's', ale gdyby kod wyglądał tak

  1. <?php
  2. $sql = 'SELECT * FROM user WHERE id = ?';
  3.  
  4. $value = 'admin';
  5.  
  6. $stmt = $mysqli->prepare( $sql );
  7.  
  8. $stmt->bind_param( 'i' , $value );
  9.  
  10. $stmt->execute();
  11. ?>


otrzymamy wszystkie dane usera o id = 0, pytanie czy jest to bug? zapytanie nie powinno się wykonać, tak jak jest w przypadku podania 's' w bind_param oraz wartości int. Wynikiem będzie również 0 ale nie dostaniemy żadnych wyników.

Czy ktoś może to potwierdzić?
hostingekspert
ciekawe spostrzeżenie, nie SELECTowałem nigdy przy użyciu prepared statements, raczej uzywam dla zapytań typu INSERT, DELETE

może spróbowałbyś wstawiając jako zapytanie
Kod
$sql = 'SELECT * FROM user WHERE user_name != 0 and user_name = ?';
strzelam smile.gif
taktu
taki sql daje 0 wyników ale moim zdaniem nie tędy droga, nie warto zmieniać każdego odwołania do bazy winksmiley.jpg

pozostaje numerować rekordy od 1 lub na własną rękę sprawdzać czy zmienna jest int
nospor
Cytat
ciekawe spostrzeżenie, nie SELECTowałem nigdy przy użyciu prepared statements
sorki, ale to ze nie umiesz/nie chcesz stosowac bind przy selectach to czemu to ma byc ciekawe?

@taktu
...user_name = 0

Tutaj mysql zachowuje się podobnie do php, czyli rzutuje stringa (user_name) do liczby, czyli 0. wowczas 0 = 0 wiec wszystko sie zgadza.
Nie wiem czemu wiec dla user_name mowisz w bind ze ma to byc int?
taktu
Cytat(nospor @ 26.06.2009, 07:48:56 ) *
Nie wiem czemu wiec dla user_name mowisz w bind ze ma to byc int?


To był oczywisty błąd, chciałem sprawdzić jak zachowa się funkcja, i niestety wykonuje się a liczyłem że będzie inaczej.

I małe sprostowanie, jeżeli podamy w bind ze ma być string to też się wykona tylko w "". Więc jeżeli damy mu liczbę 1234 to poleci "1234".
nospor
Cytat
I małe sprostowanie, jeżeli podamy w bind ze ma być string to też się wykona tylko w "". Więc jeżeli damy mu liczbę 1234 to poleci "1234".
No to raczej dosc oczywiste.Skoro mowisz ze ma byc string to bedzie to string
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.