Как я могу запросить базу данных с помощью php, используя переменные связывания? - PullRequest
0 голосов
/ 16 января 2019

Я создаю систему базы данных песен и пытаюсь реализовать способ поиска пользователями песен по категории для поиска (название песни, имя исполнителя, название альбома, жанр и т. Д.) И заданный поисковый термин , Чтобы приспособить пользовательский ввод и защитить от внедрения SQL, я использую подготовленный оператор, сделанный с переменными связывания, однако у меня возникают проблемы с тем, что я сделал в настоящее время:

   search("genre", "electropop", $db);
   function search($column, $term, $db) {
     try {
      $sql = "SELECT * FROM Songs WHERE :column=:term;";
      $stmt = $db->prepare($sql);
      $params = array("column" => $column,
                      "term" => $term);
      $stmt->execute($params);
      $arr = $stmt->fetchALL(PDO::FETCH_ASSOC);
      print (json_encode($arr));
    }
    catch(PDOException $ex) {
      catch_error("The search failed.", $ex);
    }
  }

Всякий раз, когда я проверяю это, я получаю пустой массив: [ ] Я проверил свой запрос ("SELECT * FROM Songs WHERE genre = 'electropop'") в phpmyadmin, и он проверил (вернул мне записи). Правильный синтаксис для предложений WHERE в SQL заключается в том, что термин должен быть заключен в кавычки (https://www.w3schools.com/sql/sql_where.asp), поэтому я попытался экранировать кавычки вокруг термина:

  ...
  $sql = "SELECT * FROM Songs WHERE :column=\':term;\'";
  ...

Но тогда он даже не видит: term как маркер для привязки переменных к более позднему.

Не уверен, как решить эту проблему. Я предположил, что пустой массив связан с правильным поиском, но просто без результатов, но, возможно, я не правильно использую подготовленный оператор. Любая помощь приветствуется! Спасибо!

1 Ответ

0 голосов
/ 16 января 2019

Вы пропустили : до term параметра. Не нужно связывать имя столбца. Просто используйте $column var вместо :column.

search("genre", "electropop", $db);
function search($column, $term, $db) {
try {
    $sql = "SELECT * FROM Songs WHERE $column=:term;";
    $stmt = $db->prepare($sql);
    $params = array(":term" => $term);
    $stmt->execute($params);
    $arr = $stmt->fetchALL(PDO::FETCH_ASSOC);
    print (json_encode($arr));
    }
    catch(PDOException $ex) {
        catch_error("The search failed.", $ex);
    }
}
...