我正在尝试在我的数据库中添加搜索选项,我创建了以下程序,但它在循环部分给出了一条错误消息,我无法理解为什么它不会转向else语句。请检查一下,然后告诉我哪里弄错了。
<?php
require 'connect.php';
if (isset ($_POST['username']))
{
$username = $_POST['username'];
$query = "select * from users where username like '%$username%' ";
if ($query_result = mysql_query($query))
{
$numrows = mysql_num_rows($query_result);
if ($numrows > 1)
{
for ($i = 0; $i < $numrows; $i++)
{
echo $query_result = mysql_result($query_result, $i, 'username');
}
}
else
{
echo 'No Results Found!';
}
}
else
{
echo 'No Results Found!!';
// echo mysql_error();
}
}
else
{
echo 'Are you kidding with me !';
}
?>
由于
答案 0 :(得分:3)
你正在循环中:
echo $query_result= mysql_result($query_result,$i,'username');
哪个没有加起来:你是echho
- 分配的结果。不仅仅是任何作业。您将mysql_result
的返回值重新分配给资源:$query_result
。因此,在循环的第二次迭代中,mysql_result
调用将失败。
也就是说,mysql_*
扩展程序已弃用且不应再使用,请查看首选的替代扩展程序,例如PDO
或mysqli_*
。
您还可以使用:
while
- 循环
$out = '';
while($row = mysqli_fetch_assoc($query_result))
{
$out .= $row['username'].'<br/>';
}
关于您的查询:
如果您感兴趣的只是用户名(从您的代码看起来是这样的话),而不是基本上为匹配SELECT *
子句的每一行选择所有字段的WHERE
,为什么?不要简单地使用SELECT username
。这对您的数据库来说更容易,并且不需要那么多资源。
您的WHERE
子句读取username LIKE '%{$var}%'
,这意味着,如果输入为a
,则查询将返回包含a
某处的所有用户名。除了不太安全之外,它也很慢。您的查询很可能执行全表扫描,可能需要I / O磁盘操作。使用like
而不使用%
通配符来确保不区分大小写,请使用单字符通配符_
,或者如果需要,只使用一个%
。产生“超人”的“sup”的用户名搜索比产生“dinnersupper”的同一搜索更有意义
最后,您的代码非常易受攻击to mysql-injection attacks。如果我要发布用户名:'; DROP TABLE users; --
,您的查询将如下所示:
select * from users where username like '%'; DROP TABLE users; -- %'
哪个法术灾难,不是吗?
答案 1 :(得分:0)
您调用循环mysql_result
并将查询资源$query_result
替换为单元格的值。在下次通话中,$query_result
将不再是有效资源。
注意:不确定您要尝试做什么,因为您甚至不使用该值...只需删除作业。
答案 2 :(得分:0)
我改变了几行代码..我将你的循环变成了一个while循环..这一个..
if($numrows!=0)
{
while ($rs = mysql_fetch_array($query_result)){
echo $rs['username'] . " <br>";
}
}
希望它有所帮助...