2011-02-23 55 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字(我在考慮「位置」這是一個字符串函數)。