2015-04-18 42 views
1

我一直在搞乱我的搜索页面。我加了mysqli_real_escape_stringstrip_tags,据我所知,一切正常,应该是安全的。在搜索字段中输入单引号导致mysqli_num_rows错误

我只是试图在搜索表单中输入随机符号,以查看是否所有数据库条目都可以在这些安全措施的适当位置找到。除了当我搜索单引号(')时,所有的都不错。

这给了我“mysqli_num_rows()期望参数1为mysqli_result,布尔给定”错误。有很多关于这个错误的信息,我知道如何解决它(至少我是这么认为的)。然而,在这种特定的情况下,我不知道:/

代码:

ini_set('display_errors', 1); 
$search = $_GET ['q']; 
$conn = mysqli_connect("localhost", "root", "","release"); 
$search = mysqli_real_escape_string($conn, "$search"); 
$search = stripslashes(strip_tags(trim("$search"))); 

$query = mysqli_query($conn,"SELECT * FROM game WHERE game_name LIKE '%". $search ."%' ORDER BY game_release"); 
$count = mysqli_num_rows($query); 
+1

您必须使用绑定参数机制。 它显示在这里: http://stackoverflow.com/questions/15748254/how-to-run-the-bind-param-statement-in-php –

+0

@KanchoIliev你应该,但你没有至。 – jeroen

+0

是的,你说得对,对不起。 –

回答

1

你应该在最后使用mysqli_real_escape_string,你注入的变量在数据库中的查询权之前,虽然准备的语句是首选。就我而言更容易。

您当前的问题不在于你不能只是mysqli_real_escape_string做到这一点,但是功能的组合和顺序使用:

$search = mysqli_real_escape_string($conn, "$search"); 
$search = stripslashes(strip_tags(trim("$search"))); 

您转义为MySQL值的特殊字符在第一线。这是通过添加斜杠来完成的。

而在第二行中,您删除了斜杠,撤销了与mysqli_real_escape_string的转义,并使您的查询容易受到sql注入的影响。

至于对SQL语句中的有关安全的问题,mysqli_real_escape_string是不够的,所以你只需要一个准备好的声明或:

$search = mysqli_real_escape_string($conn, $search); 

其余部分是不必要的,但如果你想这样做任何方式(例如,如果不允许使用标签),您应该将该行移动到最终转义行的上方:

$search = stripslashes(strip_tags(trim($search))); 
$search = mysqli_real_escape_string($conn, $search); 

// and now run your query without further manipulation: 
$query = mysqli_query(...); 
+1

谢谢你对Jeroen的清晰解释。接受这样的构建答案真的帮助我很多! – Michael

相关问题