0

我有一个大约 500,000 行的表,需要对其进行查询以检索结果。基本上用户只需输入一个案例编号,然后我想执行以下查询并使用 while 循环显示结果

if (!empty($_POST["casenum"])) {
    $result2 = mysql_query("SELECT Box_Content.case_number, Transfer.number, Transfer.location, Box.number FROM Box_Content, Transfer, Box WHERE Box_Content.box_id = Box.id and Box.transfer_id = Transfer.id and Box_Content.case_number = '".$_POST['casenum']."'");

    while ($row = mysql_fetch_array($result2)) {
        echo "Case number: ".$casenum." text ";
        echo "<br />";
    }

} else {
    echo "<h4>WARNING!!! Search criteria entered not valid. Please search again.</h4>";
}

我在这里做错了什么?

编辑:

如果只返回一行,它现在可以工作,但是对于两行,它似乎正在尝试打印整个表格......

$casenum = $_POST["casenum"];
echo "<br />The case number entered is: $casenum<br />";

if (!empty($_POST["casenum"]))
        {
        $result2 = mysql_query("SELECT Box_Content.case_number, Transfer.number as transfer_number, Transfer.location as transfer_location, Box.number as box_number FROM Box_Content, Transfer, Box WHERE Box_Content.box_id = Box.id and Box.transfer_id = Transfer.id and Box_Content.case_number = '" . $_POST['casenum'] . "'");

        while($row = mysql_fetch_array($result2))
                {
                print_r ($row);
                echo "<br />";
                echo "<b>Case number: </b>" . $row['case_number'] ."<br />";
                echo "<b>Transfer number: </b>" . $row['transfer_number'] ."<br />";
                echo "<b>Transfer location: </b>" . $row['transfer_location'] ."<br />";
                echo "<b>Box number: </b>" .$row['box_number'] ."<br />";
                }
}

else
        {
        echo "<h4>WARNING!!! Search criteria entered not valid. Please search again.</h4>";
        }

var_dump($_POST);
4

3 回答 3

2

尝试:

    while ($row = mysql_fetch_array($result2)) {
        echo "Case number: ". $row['Box_Content.case_number'] ." text ";
        echo "<br />";
    }

$row['case_number']将输出case_number结果集中每一行的检索结果。

但是,您应该考虑做以下两件事之一:

  1. 开始使用最佳实践。
  2. 开始使用不推荐使用的 SQL 库(mysqli、PDO)。

此查询容易受到 SQL 注入的影响:

"SELECT Box_Content.case_number, Transfer.number, Transfer.location, Box.number
     FROM Box_Content, Transfer, Box
     WHERE Box_Content.box_id = Box.id and Box.transfer_id = Transfer.id
     and Box_Content.case_number = '".$_POST['casenum']."'"

用来mysql_real_escape_string($_POST['casenum'])修补这个。

参考: http: //php.net/manual/en/function.mysql-real-escape-string.php

由于未准备好的语句操作,这些mysql_*函数早已被弃用。改为为您的项目查看mysqliPDO

于 2012-09-27T15:42:46.687 回答
0

我在这里做错了什么?

1) $casenum 没有在你的代码中设置......(请告诉我它什么都不是,你没有打开注册超全局变量?!)你可能想要$row['case_number']

2)但无论如何,这并不是你做错了什么......你最大的错误是在没有任何验证或清理的情况下使用用户输入......

想象一下,如果$_POST["casenum"]等于...

' or 1=2 union select user,password,email,salt from users

于 2012-09-27T15:46:59.120 回答
0

你似乎$casenum从无处使用。

尝试:

while($row = mysql_fetch_assoc($result2))
   echo "Case number: ".$row['number']." text <br />";

使用 mysql_fetch 函数时 assoc 将带回命名索引数据,num 将带回数字索引数据,array 将带回两者,因此请尝试使用其中一个。

然后,当您$row = mysql_fetch_assoc($result2)对返回的每一行数据执行基本操作时,将其存储为 $row 中的(在本例中为关联)数组,这样您就可以通过标准数组命令 ( $row['foo']) 访问您的数据。

于 2012-09-27T15:52:32.577 回答