2016-02-12 41 views
5

Próbuję napisać skrypt PHP z MySQLi do kwerendy bazy danych.Jak wykonać zapytanie do bazy danych w PHP i zwrócić wyniki na podstawie danych wprowadzonych przez użytkownika?

Chciałbym, aby dane wejściowe użytkownika można było sprawdzić w bazie danych, a następnie zwrócić wynik z kolumny "koniugacja", jeśli w kolumnie "root" tabeli "normal_verbs" znajduje się wpis .

Więc jeśli dane wprowadzane przez użytkownika są podobne do "foobar", a kolumna główna ma "foo", chciałbym, aby zobaczyło 'foo' w 'foobar' i zwróciło wartość 'koniugacji' w tym rząd.

Nie mogę sprawić, aby zapytanie zadziałało tak, jak chcę. Ten, którego używam poniżej jest w zasadzie tylko symbolem zastępczym. Nie do końca rozumiem, dlaczego to nie działa.

Co próbuję, to:

 function db_connect() { 

      static $connection; 

      if(!isset($connection)) { 
       $connection = mysqli_connect('localhost','user','password','Verb_Bank'); 
      } 

      if($connection === false) { 
       return mysqli_connect_error(); 
      } 
      return $connection; 
     } 

     function db_query($query) { 
      $connection = db_connect(); 
      $result = mysqli_query($connection,$query); 

      return $result; 
     } 

     function db_quote($value) { 
       $connection = db_connect(); 
       return "'" . mysqli_real_escape_string($connection,$value) . "'"; 
      }  
$m= db_query("SELECT `conjugation` from normal_verbs where `root` in (" . $y . ")"); 
    if($m === false) { 
     // Handle failure - log the error, notify administrator, etc. 
    } else { 
     // Fetch all the rows in an array 
     $rows = array(); 
     while ($row = mysqli_fetch_assoc($m)) { 
      $rows[] = $row; 
     } 
    } 
    print_r ($rows); 

To nie daje mi żadnych błędów, więc myślę, że połączenia z bazą danych.

EDIT2: Myliłem się. Brakowało mi czegoś oczywistego z powodu nieporozumienia MySQLi i odpowiednio zredagowałem kod. Tak więc powyższy kod działa w tym, że łączy się z bazą danych i zwraca wynik, ale nadal jestem zakwestionowany na wiarygodnej instrukcji SQL, aby zrobić to, co chcę zrobić.

+2

Jeśli te cudzysłowy są tam dostajesz błędy składniowe, są w dziennikach. Dodaj raport błędów do początku pliku (ów) zaraz po otwierającym tag '

+3

[Twój skrypt jest zagrożony atakami SQL Injection.] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in- php) Zapoznaj się z instrukcjami [przygotowanymi] (http://en.wikipedia.org/wiki/Prepared_statement) dla [MySQLi] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) . –

+0

Uruchamiasz zapytanie, ale nie pobierasz z niego danych za pomocą polecenia 'fetch()' –

Odpowiedz

4

Spróbuj tego:

SELECT 'conjugation' FROM 'normal_verbs' WHERE " . $y . " LIKE CONCAT('%',root,'%') 

Wybiera wszystkie wiersze, gdzie główny zawiera $ y wszędzie.

Ponadto Twój kod jest podatny na iniekcje SQL. Proszę spojrzeć na numer here, aby uzyskać więcej informacji.

+0

Dziękuję. Czy to spowoduje wybranie wszystkich wierszy, w których tabela 'root' ma podciąg $ y, a nie cały $ y? – DCM

+0

Tak, wybiera wszystkie wiersze, w których root jest zawarty w $ y. Jeśli chcesz uzyskać tylko jeden wynik, możesz posortować je według jakiegoś parametru i ograniczyć do jednego. –

+0

OK, więc to mniej więcej działało dla mnie, z tym że musiałem zmienić "+ $ y +" na (". $ Y."). Użycie "+ $ y +" nic nie robiło. Chciałbym wiedzieć dlaczego, ale jestem po prostu podekscytowany, że to zadziałało. Dziękuję Ci! – DCM

0

Spróbuj tego zapytania SQL Ci się to

SELECT `conjugation` from normal_verbs where `root` like '%$y%' 
+0

Daje mi to dziwny błąd informujący mnie, że zmienna w mojej instrukcji print_r jest teraz niezdefiniowana. Umieściłem go jako $ m = db_query ("SELECT" koniugacja 'z normal_verbs gdzie' root' jak "% $ y%" "); Czy przegapiłem gdzieś jakieś znaki interpunkcyjne? – DCM

+0

Wypróbuj ten http://stackoverflow.com/questions/29266134/weird-error-in-phpmyadmin-it-is-installed-supcessfully-but-still-not-working problem soved –