【问题标题】:Syntax error or access violation: 1064 on isset语法错误或访问冲突:isset 上的 1064
【发布时间】:2015-10-06 14:22:50
【问题描述】:

我不断得到

'SQLSTATE[42000]: 语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在第 5 行的 ''5'' 附近使用正确的语法

“5”是从下拉框中选择的任何数字。

这是我迄今为止与该问题相关的代码。

if (isset($_GET['orderBy']) && $_GET['orderBy'] == 'rank' || $_GET['orderBy'] == 'release_year' || $_GET['orderBy'] == 'author'
                        || $_GET['orderBy']== 'publisher')

if (isset($_GET['returnLimit']) && $_GET['returnLimit'] == 1 || $_GET['returnLimit'] == 5 || $_GET['returnLimit'] == 10
                                || $_GET['returnLimit'] == 25 || $_GET['returnLimit'] == 50 || $_GET['returnLimit'] == 75
                                || $_GET['returnLimit'] == 100)
{
      try{

           $db = new PDO ("mysql:host=localhost;dbname=user", "user", "12345");
           $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
           $minimum = $_GET['minimumYear'];
           $maximum = $_GET['maximumYear'];
           $order = $_GET['orderBy'];
           $limit = $_GET['returnLimit'];

           $q = "SELECT * 
           FROM book 
           WHERE '$minimum' <= '$maximum' 
           ORDER BY '$order'
           LIMIT '$limit'";

           $query = $db->query($q);
           $statement = $db->prepare($query);
           $statement->execute();

从我得到的错误来看,我猜它之所以出现是因为没有将数字传递给 $limit,因此 SQL 查询与 'LIMIT' 无关。我检查了语法,但无法弄清楚我做错了什么,任何帮助将不胜感激。

【问题讨论】:

  • 你能找到单独的 SQL 语句吗,在那个 php 文件之后?
  • 回显 sql 语句 ($q) 然后在 phpmyadmin 中尝试调试
  • 试试这个 $q = "SELECT * FROM book WHERE ".$minimum."
  • 我回应了我的 $q,并得到了 'SELECT * FROM book WHERE '1900'
  • @aimme 我得到 警告:PDO::prepare() 期望参数 1 是字符串,在第 35 行的 /home/user/public_html/PDO_Test/bookFetch.php 中给出的对象致命错误:当我使用它时,在第 36 行的 /home/user/public_html/PDO_Test/bookFetch.php 中调用一个非对象的成员函数 execute()

标签: php mysql sql pdo


【解决方案1】:

您的代码至少有四个主要问题,可能更多。

  • 首先,您在 LIMIT 子句中使用引号。以及按顺序排列
  • 其次,您没有使用准备好的语句。
  • 第三,这个查询毫无意义。
  • 第四,错误的prepared statement语法。

将您的代码更改为

if (
       isset($_GET['orderBy']) 
    && in_array($_GET['orderBy'], array('rank','release_year','author','publisher'))
    && isset($_GET['returnLimit'] 
    && in_array($_GET['returnLimit'], array(1,5,10,25,50,75,100))
    )
{
           $db = new PDO ("mysql:host=localhost;dbname=user", "user", "12345");
           $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
           $min = $_GET['minimumYear'];
           $max = $_GET['maximumYear'];
           $order = $_GET['orderBy'];
           $limit = $_GET['returnLimit'];

           $q = "SELECT * FROM book WHERE release_year BETWEEN ? AND ? 
           ORDER BY $order LIMIT $limit";

           $statement = $db->prepare($q);
           $statement->execute(array($min, $max));
           $data = $statement->fetchAll();

【讨论】:

  • 有什么理由不参数化$order$limit
猜你喜欢
  • 2017-10-08
  • 2015-10-12
  • 2014-08-19
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2017-10-29
相关资源
最近更新 更多