MySQL查询什么都不返回

时间:2012-06-22 17:35:13

标签: php mysql

我在堆栈上搜索这个问题并没有发现任何内容。这可能是一个语法问题,但我不明白。

//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.不幸的是,在users表和名称列中有一些东西。

有任何帮助吗? 非常感谢!!

编辑:问题来自security_check函数。我想尽可能避免sql注入,所以我做了这个:

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

5 个答案:

答案 0 :(得分: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语句。

答案 1 :(得分: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将在这里自行处理。试试这个

答案 2 :(得分:0)

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

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

应该是

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

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

答案 3 :(得分:0)

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

See Demo

答案 4 :(得分:0)

您的安全功能看起来就像是问题所在。 例如,每当$ u是单词test时,它将返回'test' 已经存在于您的SQL语句中。

将其从安全功能中删除,你会没事的。 我建议不要更改条带斜线并添加斜线更合理的东西,比如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的解决方案。斜杠不属于那里。