1

这里的另一个(基本)问题。我需要知道如何使用 html 表单来过滤使用 PHP 的 mysql 查询的结果。我一直在看 w3schools,我可以看到如何在一个页面上使用 $_POST 可以输出到另一个页面。但我无法确切了解如何将 $_POST 放入我的查询中。例如我有一页如下:

<form action="orderlist.php" method="post">
OrderNo: <input type="int" name="order_no" />
<input type="Submit" />
</form>

这是一个用户可以输入 order_no 并单击提交的页面,该页面链接到“orderslist.php”页面。在该页面上,我有以下代码:

$result = mysql_query("SELECT * FROM orders");

echo "<table border='5'>
<tr>
<th>order_no</th>
<th>ord_date</th>
<th>est_completion_date</th>
<th>status</th>
<th>invoice_date</th>
<th>inv_amount</th>
<th>name</th>
<th>fName</th>
<th>lName</th>
</tr>";

// -- Use 'while' to check each row in $result in turn:
while($row = mysql_fetch_array($result))
  {
  echo "<tr>";
  echo "<td>" . $row['order_no'] . "</td>";
  echo "<td>" . $row['ord_date'] . "</td>";
  echo "<td>" . $row['est_completion_date'] . "</td>";
  echo "<td>" . $row['status'] . "</td>";
  echo "<td>" . $row['invoice_date'] . "</td>";
  echo "<td>" . $row['inv_amount'] . "</td>";
  echo "<td>" . $row['name'] . "</td>";
  echo "<td>" . $row['fName'] . "</td>";
  echo "<td>" . $row['lName'] . "</td>";
  echo "</tr>";
  }
echo "</table>";

这会将“订单”中的所有内容输出到表中,但我希望它只输出用户在上一页输入的 order_no 行。我该怎么做呢?是不是像:

$result = mysql_query("SELECT * FROM orders WHERE order_no = $_POST[order_no]"); 

非常感谢

4

4 回答 4

4

对于初学者,您应该切换到 PDO 或 mysqli——这些mysql_*功能正在被弃用。

关于你的问题:是的,你就是这样做的,有一个WHERE子句。$_POST但是,在没有卫生条件的情况下直接连接变量是非常(非常非常非常)不安全的。

也就是说,您至少应该这样做:

mysql_query('SELECT * FROM orders WHERE order_no = '.mysql_real_escape_string($_POST[order_no])); 

另一件事......不要使用SELECT *. 您应该始终列出您希望从数据库中获取的列——这样,如果出现问题(例如列已更改),查询可以让您知道。随着SELECT *您取回一个神奇的数据包——您不知道它是什么,更重要的是,它是否具有您的代码所依赖的值。

所以,把它放在一起:

$pdo = new PDO("mysql:host=localhost;dbname=database", '-username-', '-password-');
$sth = $pdo->prepare('
    SELECT 
        `order_no`,
        `ord_date`,
        `est_completion_date`,
        `status`,
        `invoice_date`,
        `inv_amount`,
        `name`,
        `fName`,
        `lName`
    FROM 
        orders 
    WHERE 
        order_no = :order_no
');
$sth->execute(array(':order_no'=>$_POST[order_no]));
while ($order= $sth->fetch()) {
  echo "<tr>";
  echo "<td>" . $order->order_no . "</td>";
  echo "<td>" . $order->ord_date . "</td>";
  echo "<td>" . $order->est_completion_date . "</td>";
  echo "<td>" . $order->status . "</td>";
  echo "<td>" . $order->invoice_date . "</td>";
  echo "<td>" . $order->inv_amount . "</td>";
  echo "<td>" . $order->name . "</td>";
  echo "<td>" . $order->fName . "</td>";
  echo "<td>" . $order->lName . "</td>";
  echo "</tr>";
}

编辑:最后一点,您使用的输入无效;type="int"不是可识别的输入类型。这是 HTML 4 的类型列表和HTML 5 的列表

如您所见,HTML 5 确实有一个新的输入类型“数字”。它没有被完全采用,但如果你想使用它:

<input type="number" name="order_no" />

但是请注意,并非所有浏览器都会将输入限制为数字:http ://caniuse.com/#feat=input-number

文档

于 2012-08-23T18:50:35.083 回答
1

尝试这个:

$orderNumber = mysql_real_escape_string($_POST['order_no']);
$result = mysql_query("SELECT * FROM orders WHERE order_no = $orderNumber");

这需要它的价值$_POST['order_no']并在一定程度上对其进行消毒。然后将 的值$orderNumber应用于 MySQL。

但是,最好使用PDOMySQLi。两者都可以保护您(如果使用正确)免受 SQL 注入。目前,您的代码很容易受到 SQL 注入的影响。

于 2012-08-23T18:49:31.463 回答
1

Without injection vulnerability (require 'mysql_connect' before) :

if(isset($_POST['order_no']))
{
    $orderNo = mysql_real_escape_string($_POST['order_no']);

    $result = mysql_query("SELECT * FROM orders WHERE order_no = $orderNo");

    echo "<table border='5'>";
    echo "  <tr>";
    echo "    <th>order_no</th>";
    echo "    <th>ord_date</th>";
    echo "    <th>est_completion_date</th>";
    echo "    <th>status</th>";
    echo "    <th>invoice_date</th>";
    echo "    <th>inv_amount</th>";
    echo "    <th>name</th>";
    echo "    <th>fName</th>";
    echo "    <th>lName</th>";
    echo "  </tr>";

    if(mysql_num_rows($result) == 0)
    {
        echo '<tr><td colspan="9">Order not found</td></tr>';
    }
    else
    {
        while($row = mysql_fetch_assoc($result))
        {
            echo "<tr>";
            echo "  <td>" . $row['order_no'] . "</td>";
            echo "  <td>" . $row['ord_date'] . "</td>";
            echo "  <td>" . $row['est_completion_date'] . "</td>";
            echo "  <td>" . $row['status'] . "</td>";
            echo "  <td>" . $row['invoice_date'] . "</td>";
            echo "  <td>" . $row['inv_amount'] . "</td>";
            echo "  <td>" . $row['name'] . "</td>";
            echo "  <td>" . $row['fName'] . "</td>";
            echo "  <td>" . $row['lName'] . "</td>";
            echo "</tr>";
        }
    }

    echo "</table>";
}
于 2012-08-23T18:56:44.760 回答
0

你的表格应该是这样的:

<form action="orderlist.php" method="post">
    OrderNo: <input type="text" name="order_no" />
    <input type="Submit" value="Submit"/>
</form>

要获取用户在表单中键入的任何值,您应该使用type="text". type="int"在标准 HTML中没有任何东西。

不要混淆,HTML 中的输入类型与您在编程语言中用于声明数据类型的输入类型不同。这里的 TYPE 只是让浏览器知道它是一个文本字段/单选按钮等。要了解有效输入类型,最好阅读w3.org关于 HTML 表单的建议。

orderlist.php可以查询以检索所需的数据:

if(isset($_POST['order_no'])) {
    $orderNo = mysql_real_escape_string($_POST['order_no']);
    $result = mysql_query("SELECT * FROM orders WHERE order_no = $orderNo");
    while($row = mysql_fetch_array($result)) {
        //code to print table.   
    }
}

笔记:

这类代码容易受到攻击,不建议将用户输入直接放入 SQL 查询中,应始终先过滤。

于 2012-08-23T21:05:26.040 回答