2011-06-06 118 views
1

我想按用戶定義的類別排列我的博客文章,即他們在我的博客頁面上點擊的博文。按類別排序結果

這裏是我的代碼迄今,

########################################################## 
$cat = mysql_real_escape_string($_GET['category']); 
########################################################## 

$sql = "SELECT * FROM php_blog WHERE category = $cat ORDER BY timestamp"; 

$result = mysql_query($sql) or print ("Can't select entry from table php_blog.<br />" . $sql . "<br />" . mysql_error()); 

但是,這給了我這個錯誤,

不能從表 php_blog項。 SELECT * FROM php_blog WHERE category =更新ORDER BY時間戳 您的SQL語法錯誤; 檢查對應 你的MySQL服務器版本使用附近的「更新ORDER 按時間戳」第1行警告的 正確的語法手冊: mysql_fetch_array():提供的參數 不是 一個有效的MySQL結果資源 /home/funding9/public_html/jbblog/htdocs/category.php 上線91

+0

很好,你使用'mysql_real_escape_string',但你忘了圍繞單引號的$貓,就像這樣'WHERE category ='$ cat''。這意味着SQL注入漏洞仍然是開放的。所以不要忘記那些額外的引號。 – Johan 2011-06-06 19:21:12

回答

4
$sql = "SELECT * FROM php_blog WHERE category = '" . mysql_real_escape_string($cat) . "' ORDER BY timestamp"; 

需要的字符串括起來(在你的例子是更新,需要將「更新」),並我也通過mysql_real_escape_string()來保護y來自SQL注入。

+0

工作就像一個魅力,非常感謝! – AviateX14 2011-06-06 19:17:02

1

MySQL使用back ticks來允許您跳過名稱。您應該使用類似以下內容:

$cat = mysql_real_escape_string($_GET['category'], $mysql_link); 
$queryString = "SELECT * FROM `php_blog` WHERE `category` = '$cat' ORDER BY `timestamp`"; 

供應鏈接將確保它逃過這一方面,不同的數據庫可以有不同的配置和要求他們進行轉義不同的東西。

您也可以考慮使用MySQLi準備好的語句。這避免了知道哪些輸入需要被轉義,應該如何引用以及甚至是一些驗證。