1

我在堆栈上搜索有关此问题的信息,但一无所获。这可能是一个语法问题,但我不明白。

//Include necessary files
include_once("inc/mysql.inc.php");
include_once("inc/security.inc.php");

//SECURITY: Check input before adding them into the table.
$u = security_checkinput($u);

//Connect to the MySQL database.
mysql_dbconnection();
//Go get users id corresponding to the search
$u = mysql_query("SELECT id FROM users
            WHERE name LIKE \"%$u%\" OR active LIKE \"%$u%\" 
            ORDER BY name ASC") or die("There is a server error : " . mysql_error());
$u = mysql_fetch_row($u);
//Close database connection
mysql_dbclose();

//Return the array.
return $u;

查询后我在 $u 上尝试了 mysql_num_rows,它返回 0。不幸的是,用户表和名称列中有一些东西。

有什么帮助吗?非常感谢 !!

编辑:问题出在 security_check 功能。我想尽可能避免sql注入,所以我做了这个:

    function security_checkinput ($s)
{
    $s = stripslashes($s);
    if (!is_numeric($s))
        $s = "'".addslashes($s)."'";
    return $s;  
}
4

5 回答 5

2

第 1 点:您将查询分配给 $u 并在 LIKE 语句中使用相同的变量。

第 2 点:写错了 LIKE语句。它应该是

$query = mysql_query("SELECT id FROM users
            WHERE name LIKE '%$u%' OR active LIKE '%$u%' 
            ORDER BY name ASC") or die("There is a server error : " . mysql_error());

或者

$query = mysql_query("SELECT id FROM users
            WHERE CONCAT(name, ' ,' , active) LIKE '%$u%' 
            ORDER BY name ASC") or die("There is a server error : " . mysql_error());

我更喜欢 CONCAT,因为如果有很多变量,您不需要编写 n 个 OR 语句。

于 2012-06-22T17:45:19.923 回答
0

您是否首先回显您的查询并尝试直接在数据库中运行它?

无论如何,正确使用LIKE子句..

$u = mysql_query("SELECT id FROM users
            WHERE name LIKE '%$u%' OR active LIKE '%$u%' 
            ORDER BY name ASC") or die("There is a server error : " . mysql_error());

您不需要在此处使用“/”,phpvariable 将在此处自行处理。尝试这个

于 2012-06-22T17:41:03.357 回答
0

我不完全确定这是否是您的问题的唯一原因,但这

WHERE name LIKE \"%$u%\" OR active LIKE \"%$u%\" 

应该

WHERE name LIKE '%$u%' OR active LIKE '%$u%' 

您是否尝试过直接针对您的数据库运行此查询?它在那里返回什么?

于 2012-06-22T17:43:49.037 回答
0

$u 是什么?您的查询很好,看起来您没有任何匹配的行。

看演示

于 2012-06-22T17:44:09.013 回答
0

您的安全功能似乎是问题所在。例如,只要 $u 是单词 test,它就会返回 SQL 语句中已经存在的“test”。

将其从您的安全功能中删除,您会没事的。但是,我确实建议更改条形斜杠并将斜杠添加到更体面的东西上,例如 mysql_real_escape_string

基于旧代码的修复示例:

function security_checkinput ($s)
{
    $s = stripslashes($s);
    if (!is_numeric($s))
        $s = addslashes($s);
    return $s;  
}

mysql_real_escape_string 用法示例(您应该真正使用这个)

function security_checkinput ($s){
$s = mysql_real_escape_string($s);
return $s;  
}

确保您还应用了 Nishu Tayal 的解决方案。斜线不属于那里。

于 2012-06-22T18:59:40.370 回答