【问题标题】:Statement block not reached after for loopfor循环后未到达语句块
【发布时间】:2013-07-02 15:02:09
【问题描述】:

我正在尝试在我的数据库中添加搜索选项,我创建了以下程序,但它在循环部分给我一个错误消息,我无法理解为什么它没有转向 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 !';
    }
?>

谢谢

【问题讨论】:

标签: php html mysql forms syntax-error


【解决方案1】:

在你正在做的循环内:

echo $query_result=     mysql_result($query_result,$i,'username');

没有加起来:你echho-ing 分配的结果。不仅仅是任何任务。您正在将 mysql_result 的返回值重新分配给资源:$query_result。因此,在循环的第二次迭代中,mysql_result 调用将失败。

也就是说,mysql_* 扩展名已弃用,不应再使用,请查看首选的替代扩展名,例如 PDOmysqli_*
您还可以将循环重写为while-loop,使用:

$out = '';
while($row = mysqli_fetch_assoc($query_result))
{
    $out .= $row['username'].'<br/>';
}

关于您的查询:
而不是做SELECT *,它基本上选择与WHERE子句匹配的每一行的所有字段,如果你感兴趣的是用户名(从你的代码看来是这样),为什么不简单地使用@ 987654334@。这在您的数据库上更容易,并且不需要太多资源。

您的WHERE 子句为username LIKE '%{$var}%',这意味着,如果输入为a,您的查询将返回所有包含a 的用户名。除了不太安全之外,它也非常缓慢。您的查询很可能会执行全表扫描,可能需要 I/O 磁盘操作。要么使用不带% 通配符的like 以确保不区分大小写,要么使用单字符通配符_,或者如果需要,只使用一个%"sup" 的用户名搜索产生 "superman" 比产生 "dinnersupper"

的相同搜索更有意义

最后,您的代码非常易受攻击to mysql-injection attacks。如果我要发布用户名:'; DROP TABLE users; --,您的查询将如下所示:

select * from users where username like '%'; DROP TABLE users; -- %'

这意味着灾难,不是吗?

【讨论】:

  • 感谢您的及时回复 :) 我已将 for 循环替换为 While 循环,但现在它又给了我一条错误消息。
  • 警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,第 27 行 C:\xampp\htdocs\tahakirmani\search.php 中给出的资源
  • @TahaKirmani:当然,我的 sn-p 使用 mysqli_* 扩展名,删除 i 以使用已弃用的 mysql_* 扩展名进行测试,但最好将所有 mysql_* 函数调用替换为他们的mysqli_* 同行
【解决方案2】:

您在循环中调用mysql_result 并将查询资源$query_result 替换为单元格的值。在下一次通话中,$query_result 将不再是有效资源。

注意:不确定您要做什么,因为您甚至不使用该值...只需删除分配即可。

【讨论】:

    【解决方案3】:

    我更改了几行代码..我将您的循环更改为 while 循环..试试这个..

        if($numrows!=0)
        {
            while ($rs = mysql_fetch_array($query_result)){
              echo $rs['username'] . " <br>";
            }
        }
    

    希望对你有帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多