Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> prepared statement - bind_param, bug?
taktu
post
Post #1





Grupa: Zarejestrowani
Postów: 89
Pomógł: 7
Dołączył: 19.05.2008

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


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ć?

Ten post edytował taktu 25.06.2009, 13:31:47
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
hostingekspert
post
Post #2





Grupa: Zarejestrowani
Postów: 51
Pomógł: 5
Dołączył: 12.04.2007
Skąd: 1=1

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


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

Ten post edytował hostingekspert 25.06.2009, 18:07:12
Go to the top of the page
+Quote Post
taktu
post
Post #3





Grupa: Zarejestrowani
Postów: 89
Pomógł: 7
Dołączył: 19.05.2008

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


taki sql daje 0 wyników ale moim zdaniem nie tędy droga, nie warto zmieniać każdego odwołania do bazy (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

pozostaje numerować rekordy od 1 lub na własną rękę sprawdzać czy zmienna jest int
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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





Grupa: Zarejestrowani
Postów: 89
Pomógł: 7
Dołączył: 19.05.2008

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


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





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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

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: 23.08.2025 - 02:04