代码之家  ›  专栏  ›  技术社区  ›  Justin G

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

  •  0
  • Justin G  · 技术社区  · 6 年前

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

    任何提示都将不胜感激。

    编辑:

    $vars = array(
        'genre' => "Action", 
        'quality' => 1080, 
        'imdb_min' => 0.1,
        'imdb_max' => 10.0, 
        'year_min' => 2000,
        'year_max' => 2019
    );
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   ket-c    6 年前

    当我使用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();
    

    它将分别绑定到盲参数(?)

    暂时尝试忽略movie offset和movies变量,并使用 foreach 循环。

        2
  •  0
  •   Justin G    6 年前

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