PHP / PDO - связывание данных с подготовленным оператором SQL нарушает их - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь привязать значения к запросу в PHP.Я делал это успешно много раз, но по какой-то причине мой код не работает.

function get_movies($vars, $page) {

    global $db;

    $get_movies = $db->prepare('SELECT * FROM `movies` WHERE LOWER(genres) LIKE :genre AND `qualities` LIKE :quality AND `rating` >= :imdb_min AND `rating` <= :imdb_max AND `year` >= :year_min AND `year` <= :year_max ORDER BY id DESC');

    $get_movies->bindValue(':genre', $vars['genre']);
    $get_movies->bindValue(':quality', $vars['quality']);
    $get_movies->bindValue(':imdb_min', $vars['imdb_min']);
    $get_movies->bindValue(':imdb_max', $vars['imdb_max']);
    $get_movies->bindValue(':year_min', $vars['year_min']);
    $get_movies->bindValue(':year_max', $vars['year_max']);

    try {
        $get_movies->execute();
        $movies = $get_movies->fetchAll(); // list of all movies fitting parameters
        $movie_offset = ($page - 1) * VIDEOS_PER_PAGE;
        $movies = array_slice($movies, $movie_offset, VIDEOS_PER_PAGE);
        return $movies;
    } catch (Exception $e) {
        throw $e;
        return false;
    }

}

Приведенный выше код не работает.Исключение не выдается, но оно возвращает 0 результатов.Однако, если бы я построил запрос вручную (например, заменив каждый: ключ на $ vars ['key'] и подготовив оператор из полученной строки), запрос вернет результаты совершенно нормально.

Любые подсказки будутс благодарностью.

Редактировать: вот массив $ vars, переданный в функцию $ get_movies.

$vars = array(
    'genre' => "Action", 
    'quality' => 1080, 
    'imdb_min' => 0.1,
    'imdb_max' => 10.0, 
    'year_min' => 2000,
    'year_max' => 2019
);

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Мне удалось решить проблему.При выполнении запроса вручную символы ", окружающие строки в сравнении LIKE, интерпретируются как индикаторы того, что значение между ними является строкой. При связывании значения с символами", окружающими строку, символы включаются в само значение.Вот почему не было сгенерировано исключение, и запрос вернул 0 результатов.Спасибо за помощь.

0 голосов
/ 27 февраля 2019

Когда я использую pdo, вот как я делаю свой запрос. Например:

$stmt=db_conn->prepare ("SELECT * FROM table WHERE id = ? AND name = ? AND = uptime = ?");
$stmt->bindParam (1, $firstvariable);
$stmt->bindParam (2, $secondvariable);
$stmt->bindParam (3, $thirdvariable);
$stmt->execute(); 
$result=$stmt->fetchAll();

Он будет уважительно связываться со слепыми параметрами (?)

Попробуйте игнорировать смещение фильма и фильмыпеременные на данный момент и получить результаты, используя цикл foreach.

Попробуйте это и посмотрите.Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...