PHP / PDO-将数据绑定到准备好的SQL语句会破坏它

时间:2019-02-27 16:58:23

标签: php mysql pdo data-binding

我正在尝试将值绑定到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']替换每个:key并从结果字符串中准备语句),查询返回的结果将非常好。

任何提示将不胜感激。

编辑: 这是传递给$ get_movies函数的$ vars数组。

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

2 个答案:

答案 0 :(得分:0)

当我使用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循环获取结果。

尝试一下并查看。希望对您有帮助。

答案 1 :(得分:0)

我设法解决了这个问题。手动执行查询时,LIKE比较中的字符串周围的字符被解释为指示符,指示它们之间的值是字符串。将值与字符串周围的字符绑定时,字符本身包含在值中。这就是为什么没有引发异常并且查询返回0个结果的原因。谢谢您的帮助。