Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Prepared Statements + operator LIKE
offensive__tomat...
post 21.09.2010, 09:03:23
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 21.09.2010

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


Witam.
Mam następujący problem. Mam bazę danych w której jest tabela KSIAZKI. Chcę napisać skrypt wykorzystujący instrukcje przygotowawcze do odczytu zawartości tabeli. Skrypt ma znaleźć odpowiednie wyrażenie ($wyrażenie) w polu wskazanym przez użytkownika ($metoda_szukania). W całej imprezie chciałbym wykorzystać operator LIKE zamiast operatora równości. I tu właśnie pojawia się problem. Skrypt w zaprezentowanej poniżej postawi wykonuje się bez żadnego błędu jednak nie zwraca żadnych wyników. Jedyną informację jaką otrzymuje to: „Znaleziono: 0”. Oczywiście dane wpisuje poprawne.

Nie mam pojęcia gdzie jest błąd. Wczoraj siedziałem nad tym cały dzień i nic. Być może to jakaś pierdoła której po prostu nie widzę. Szukałem rozwiązania w sieci jednak nic nie znalazłem. Będą wdzięczny za pomoc. Dopiero uczę się tego wszystkiego więc proszę o wyrozumiałość winksmiley.jpg.

Raczej to niepotrzebne ale zamieszczam też kod formularza.

--==FORMULARZ==--

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  5. <link href="style.css" rel="stylesheet" type="text/css" />
  6. <title>Wyszukiwanie książek (instrukcje przygotowawcze)</title>
  7. </head>
  8. <body>
  9. <h1>Wyszukiwanie książek (instrukcje przygotowawcze)</h1>
  10. <form action="rezultat_instr_przyg.php" method="post">
  11. <p>
  12. Wybierz metodę wyszukiwania:<br />
  13. <select name="metoda_szukania">
  14. <option value="autor">Autor</option>
  15. <option value="tytul">Tytuł</option>
  16. <option value="isbn">ISBN</option>
  17. </select>
  18. </p>
  19. <p>
  20. Wprowadź poszukiwane wyrażenie<br />
  21. <input name="wyrazenie" type="text"></input><br />
  22. <input type="submit" name="submit" value="Szukaj"></input>
  23. </p>
  24. </form>
  25. </body>
  26. </html>


--==SKRYPT PHP==--

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  5. <link href="style.css" rel="stylesheet" type="text/css" />
  6. <title>Wyszukiwanie książek (instrukcje przygotowawcze)</title>
  7. </head>
  8. <body>
  9. <h1>Wyszukiwanie książek (instrukcje przygotowawcze)</h1>
  10.  
  11. <?php
  12. $metoda_szukania = trim($_POST['metoda_szukania']);
  13. $wyrazenie = trim($_POST['wyrazenie']);
  14.  
  15.  
  16. if (!$metoda_szukania || !$wyrazenie) {
  17. echo '<p>Brak parametrów wyszukania. Wróć do poprzedniej strony i spróbuj ponownie.</p>';
  18. }
  19.  
  20. $metoda_szukania = addslashes($metoda_szukania);
  21. $wyrazenie = addslashes($wyrazenie);
  22. }
  23.  
  24. @ $db = new mysqli('localhost', 'offensivetomato', 'ksiazki', 'asd123');
  25.  
  26. if (mysqli_connect_errno ()) {
  27. echo '<p>Błąd: Połączenie z bazą danych nie powiodło się.
  28. Spróbuj jeszcze raz później</p>';
  29. }
  30.  
  31. $wyrazenie = "'%".$wyrazenie."%'";
  32.  
  33. $zapytanie = $db->prepare("select isbn, autor, tytul, cena from ksiazki where ? like ?");
  34. $zapytanie->bind_param("ss", $metoda_szukania, $wyrazenie);
  35. $zapytanie->execute();
  36. $zapytanie->bind_result($isbn, $autor, $tytul, $cena);
  37. $zapytanie->store_result();
  38. $ile_znalezionych = $zapytanie->num_rows;
  39. echo 'Znaleziono: ' .$ile_znalezionych;
  40.  
  41. for ($i=0; $i<$ile_znalezionych; $i++){
  42. $zapytanie->fetch();
  43. echo '<p><strong>' .($i+1). ' Tytuł: </strong>' .stripslashes($tytul). '<br />';
  44. echo 'Autor: ' . stripslashes($autor). '<br />';
  45. echo 'ISBN: ' . stripslashes($isbn). '<br />';
  46. echo 'Cena: ' . number_format($cena, 2). '</p>';
  47. }
  48.  
  49. $db->close();
  50. ?>
  51. <p>
  52. <a href="szukaj_instr_przyg.php">Powrót</a>
  53. </p>
  54. </body>
  55. </html>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
everth
post 21.09.2010, 09:16:36
Post #2





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


Cytat
  1. $zapytanie = $db->prepare("select isbn, autor, tytul, cena from ksiazki where ? like ?");
  2. $zapytanie->bind_param("ss", $metoda_szukania, $wyrazenie);

Bindujesz parametr po nazwie, a w zapytaniu nie masz jej określonej - w przypadku ? bindujemy po numerze wystąpienia. Jakbyś chciał zbindować po nazwie to musiałbyś umieścić ją w zapytaniu np.
  1. $zapytanie = $db->prepare("select isbn, autor, tytul, cena from ksiazki where isbn like :ss");
  2. $zapytanie->bind_param("ss", $metoda_szukania, '%'.$wyrazenie);

Przy tym wydaje mi się że nie możesz bindować kolumn - tylko wartości. Więc where ? liki ? chyba nie zadziała (wiem że ograniczenie odnosi się do kolumn, więc może się okazać że jednak można bindować kolumny po WHERE, nie chce mi się tego sprawdzać teraz).

Ten post edytował everth 21.09.2010, 09:17:04


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
athei
post 21.09.2010, 10:09:53
Post #3





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


Tak jak kolega wyżej napisał nie możesz bindować kolumny (where, order by itd).
Po co ci trim i addslashes na metodzie_szukania. To ty określasz jakie są metody szukania, a nie user, więc sprawdzaj czy user nie zmienił czegoś w kodzie:
Kod
$metody = array('autor','tytul','isbn');
if (in_array( $_POST['metoda_szukania'], $metody)) {
    $metoda_szukania = $_POST['metoda_szukania'];
} else {  
    $metoda_szukania = 'autor'; //lub inna ktora ma byc domyslna
}
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: 28.06.2025 - 08:03