【问题标题】:1064: You have an error in your SQL syntax near ''1064: '' 附近的 SQL 语法有错误
【发布时间】:2014-07-09 21:22:54
【问题描述】:

1064:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 4 行的 '' 附近使用的正确语法
SELECT a.* FROM ws_items a WHERE 1 AND enabled=1 AND visible=1 ORDER BY created DESC 限制 0,

我搜索了该网站,但没有一个符合我的查询。我不知道如何使用mysql,但我确实需要解决这个问题...... 也许这里有人知道解决方案

 if ($params["page_name"]=="index")
        {

            $filter = "";
            if ($_SESSION['user_data']['type']!="admin")
            {
                $filter = " AND `enabled`=1 AND `visible`=1 ";
            }

            $sql = "SELECT a.* FROM 
            `".DB_PREFIX."items` a WHERE 1 $filter 
            ORDER BY `created` DESC 
            LIMIT ".($_SESSION['itemsPerPage']*($page-1)).",".$_SESSION['itemsPerPage'];

            $items = $DB->getAll($sql); 
            for($i=0; $i<count($items); $i++)
            {
                $items[$i][third] = "";

                $items[$i][thumb_rating] = rating_bar($items[$i]['id'], '5', 'static');
                if($i%3==2)
                    $items[$i][third] = 'style="margin-right:0;"';
            }

            $smarty->assign("items", $items);

            $sql = "SELECT COUNT(a.id) as `total` FROM 
            `".DB_PREFIX."items` a WHERE 1 $filter 
            ";

            $items = $DB->get($sql);
            $total = $items['total'];

            $smarty->assign("pagination", $DB->show_pagination($total, $page, $_SESSION['itemsPerPage']));

            $output = $this->display(__FILE__, 'latestwallpapers.tpl');
        }
        return $output;
    }

【问题讨论】:

  • 我想说去掉 where 子句开头的 1 AND 但我不确定
  • 使用字符串连接来编写包含用户数据的查询是您未来非常糟糕的一天的秘诀。你确定你必须这样做吗? SQL injection bugs 一点也不好玩。
  • 您的查询似乎缺少偏移量:DESC LIMIT 0,。当然,在布尔上下文中将 1 评估为 true:MySQL 将任何非零、非 NULL 值评估为 TRUE。 参见 dev.mysql.com/doc/refman/5.6/en/logical-operators.html
  • 你确定 $_SESSION['itemsPerPage'] 有值吗?
  • 我不确定,因为我不知道。

标签: mysql sql


【解决方案1】:

我认为正在发生的是

$_SESSION['itemsPerPage']

为 null 并且当乘以 $page - 1 时被转换为 0,因此它在查询中评估为 0,但是当最后连接时,只会产生任何结果,这会导致 LIMIT 子句中的语法错误:

DESC LIMIT 0,

【讨论】:

  • 我不知道,您是在我发布我的答案之前还是之后编辑了您的答案?我在打电话,所以我花了一点时间才写下答案。
  • 五分钟前。但我完全知道你的意思。我有时会尝试用手机接听,这很痛苦! :-)
  • 嗯,我觉得我的回答更简洁一些。如果会话变量为空,您提出的解决方案实际上根本没有帮助。
【解决方案2】:

如果您有创建$filter 的安全方法来防止 SQL 注入,请尝试将其更改为:

$sql = "SELECT a.* FROM 
       `".DB_PREFIX."items` a WHERE 1=1 $filter 
       ORDER BY `created` DESC 
       LIMIT ".($_SESSION['itemsPerPage']*($page-1)).",".($_SESSION['itemsPerPage']+0);

如果您的查询以LIMIT 0 结尾,那么它不会返回任何行,如果它以LIMIT 0, 结尾,那么它确实在语法上不正确。

你需要确保你有一个偏移值。

我已调整查询以将零添加到偏移量,因此它现在应该以 LIMIT 0,0 结尾,但请注意这不会返回任何行。我猜你的会话变量没有值。

为什么不按照@VMai 的建议尝试var_dump($_SESSION['itemsPerPage']);

编辑:我打赌你$_SESSION['itemsPerPage'] 是在你第一次引用它之后设置的。因此,当您第一次加载页面时它会失败,然后当您刷新时,该值就在那里并且它可以工作。

【讨论】:

  • var_dump($_SESSION['itemsPerPage']); 对 OP 来说是个好主意。并且很好地暗示你的 LIMIT 0 在有效的声明中没有意义。
  • 我不知道为什么它以 LIMIT 0 结尾。我尝试使用你的代码,但它是同样的错误。
  • 确实,您调整后的代码将消除显示的错误,但不会返回任何行。奇怪的是,如果我按刷新,行将显示并且不会显示任何错误(这也发生在使用您的代码之前 - 第一次出现错误,刷新后它正常工作。如果我关闭浏览器并打开它再次,它会显示错误。刷新会解决它。)
  • 那是因为你在尝试使用会话变量后才设置它!
  • 我打赌你$_SESSION['itemsPerPage'] 是在你第一次引用它之后设置的。因此,当您第一次加载页面时它会失败,然后当您刷新时,该值就在那里并且它可以工作。
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 2015-05-28
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多