2011-02-23 74 views
0

我正在研究教程并完全复制下面的代码,但是我收到以下错误消息。任何想法有什么问题的语法?PHP SQL查询错误消息

数据库查询失败:您的SQL语法中有一个 错误;检查对应于你的MySQL 服务器版本正确的语法近 使用“按位置ASC”第2行

function get_pages_for_subject($subject_id, $public = true) { 
      global $connection; 
      $query = "SELECT * FROM pages WHERE subject_id = .$subject_id."; 
      if ($public) { 
       $query .= "AND visible = 1 "; 
      } 
      $query .= "ORDER BY position ASC"; 
      $page_set = mysql_query($query, $connection); 
      confirm_query($page_set); 
      return $page_set; 
      } 
+5

请显示完整生成的查询。机会是'$ subject_id'不是一个数字,需要用引号括起来。 – 2011-02-23 11:06:56

+0

我不确定你的意思。我是一个在教程上工作的新手,所以很多事情我不清楚。不过,我相信你提出了同样的事情(用引号括起来)和下面的人一样,后面我提到的提示很不幸没有奏效。 – Leahcim 2011-02-23 12:08:49

回答

0

你可以抽象出了PHP着这样的 手册,大概。

打印$query会告诉你,$subject_id可能不是你想象的那样。 另外,您的SQL注入预防在哪里?

+0

我只是在学习这个东西的教程。它目前没有教SQL注入......但要注意。谢谢 – Leahcim 2011-02-23 11:44:42

+0

@Michael:那么,您是否打印过'$ query'来查看发生了什么? – 2011-02-23 13:10:22

0

请强制执行$subject_id是一个整数值或用引号把它包了:

$subject_id = (int)$subject_id; before your $query .= "WHERE subject_id = {$subject_id} "; 

$query .= "WHERE subject_id = '{$subject_id}' "; 

这应该工作。问题是$subject_id值正在突破你的查询。

小建议:在这里强化一些安全性,你应该防止SQL注入场景。

0

你应该反引用你所有的字段名称。像

`visible` = 1 

ORDER BY `position` 

等等,以确保没有任何冲突与保留的MySQL字(我在考虑“位置”这是一个字符串函数)。