转义数据库选择查询中的特殊字符


escape special characters in database select query

我有以下查询,如果名称包含特殊字符,则该查询不起作用:

 case 'byMovie':
  $items_per_page = 20;
  $offset = 0;
  $page_count = 0;
  include('Connection.php');
  $query1 = $conn->prepare("
SELECT DISTINCT s.starName
              , s.starImdbID
              , s.movieName
              , p.posterLink 
           FROM star_film as s 
           LEFT 
           JOIN star_Posters as p 
             ON s.starImdbID = p.starImdbID  
          WHERE s.movieName LIKE :q
");
  $query1->execute(array(':q' => '%' . $searchText . '%'));
  $row_count = $query1->rowCount();
  $page_count = (int)ceil($row_count / $items_per_page);
  $page = min($page_count, filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
           'options' => array(
           'default'   => 1,
           'min_range' => 1,
          ),
      )));
       if($page > $page_count) { //double check that request page is in range
           $page = 1;     // error to user, maybe set page to 1
       }
   $offset = ($page - 1) * $items_per_page;
   $query = $conn->prepare("SELECT DISTINCT s.starName, s.starImdbID, s.movieName, p.posterLink FROM star_film as s LEFT JOIN star_Posters as p ON s.starImdbID = p.starImdbID  WHERE s.movieName LIKE :q LIMIT " . $offset . "," . $items_per_page);
   $query->execute(array(':q' => '%' . $searchText . '%'));
break;
}

例如,如果电影名称是"一个鱼的故事",它会向我显示以下错误:

致命错误:未捕获异常"PDOException",消息为'SQLSTATE[42000]:语法错误或访问冲突:1064您有SQL语法错误;查看与您的MySQL服务器版本,在第行"-20,20"附近使用正确的语法1'在/var/www/searchcast.php中:90堆栈跟踪:#0/var/www/searchcast.php(90):PDO->准备('SELECT DISTINCT…')#1{main}在第90行的/var/www/searchcast.php中抛出

我试着按照这里的建议添加mysql_real_eescape_string(s.movieName),但也不起作用。

有人能帮帮我吗?

感谢

正如您在文档中所读到的:

LIMIT子句可用于限制返回的行数通过SELECT语句。LIMIT采用一个或两个数字参数,其必须都是非负整数常数(使用时除外准备好的陈述)。

我认为错误与您使用的offset值有关(显然是-20)。你必须想办法避免这个数字为负数。

看到你的代码,当$page = 0翻译成:时,它变成负数

$offset = (0 - 1) * 20 = -20;

从而产生误差。当$page的值为0或类似值时,可以强制其为1。

希望能有所帮助。