Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Prepared Statements + operator LIKE
Forum PHP.pl > Forum > Przedszkole
offensive__tomato
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>
everth
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).
athei
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
}
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.