php select语句没有给出答案

时间:2012-04-08 06:49:45

标签: php mysql

我使用了教程中的PHP代码并且工作正常。但是当我把它重写给我时它会让我无效。这段代码给了我想要的东西,我的意思是它以JSON格式提供数据:

$q=mysql_query("SELECT * FROM people WHERE birthyear>'".$_REQUEST['year']."'");
while($e=mysql_fetch_assoc($q))
    $output[]=$e;
print(json_encode($output));

但是这个代码即使看起来相同也不起作用,它给出了null:

$q=mysql_query("SELECT username, firstname, lastname, email, phone1, skype, city, description 
FROM mdl_user WHERE username LIKE'".$_REQUEST['usern']."'");
while($e=mysql_fetch_assoc($q))
    $output[]=$e;
print(json_encode($output));

如果我不使用$ _REQUEST ['usern']并且正在使用JSON获取数据。但我需要使用请求来搜索特定数据。那么问题出在哪里呢?因为我信任不明白。它看起来和我一样。

3 个答案:

答案 0 :(得分:0)

使用LIKE创建一个使用%的模式。把它放在或任何一端,开始或结束。

$username = mysql_real_escape_string($_REQUEST['usern']);

$q=mysql_query("SELECT username, firstname, lastname, email, phone1, skype, city, description 
FROM mdl_user WHERE username LIKE '$username%'");
                                 ^
                                 |
 // You also missed this space --+

注意您的查询对SQL注入是开放的。试想是否有人将年份作为'; drop table people; --插入。使用mysql_real_escape_string来清理这些字段。

enter image description here

最好明确使用$ _POST或$ _GET,这样可以确保您的数据来自正确的来源。

答案 1 :(得分:0)

使用LIKE,您可以在模式中使用以下两个通配符。

%   Matches any number of characters, even zero characters
_   Matches exactly one character

答案 2 :(得分:-1)

我认为你没有得到任何结果,因为你的用户名与$ _REQUEST ['usern']不完全相同,这就是你首先使用LIKE的原因。因此,您应该放置通配符来告诉MySQL在字符串之前或之后查找任何字符(%),例如:

LIKE '%".$_REQUEST['usern']."%'

请记住,这是低效的,你应该尝试在字符串后只使用一个%(如果这对你有用),或者更好的是,找到另一种方法来搜索表。

编辑:同样作为注释中的用户而我没有提及,这个特定的代码容易受到SQL注入的攻击。在将变量传递给查询之前,您应该清理变量$ _REQUEST ['usern']。