2011-06-06 121 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准备好的语句。这避免了知道哪些输入需要被转义,应该如何引用以及甚至是一些验证。