在mysql查询中使用PHP表单


Using PHP forms in mysql queries

这里还有一个(基本)问题。我需要知道如何使用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并单击submit的页面,该页面链接到"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>";

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

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

非常感谢

对于初学者,您应该切换到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"不是可识别的输入类型。以下是HTML4的类型列表,以及HTML5:的类型列表

正如您所看到的,HTML5确实有一个新的输入类型"数字"。它还没有被完全采用,但如果你想使用它:

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

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

文档

  • mySql SELECT-http://dev.mysql.com/doc/refman/5.0/en/select.html
  • mysql_query弃用)-http://php.net/manual/en/function.mysql-query.php
  • PDO-http://www.php.net/manual/en/book.pdo.php
  • PDO::prepare-http://www.php.net/manual/en/pdo.prepare.php
  • PDOStatement::fetch-http://www.php.net/manual/en/pdostatement.fetch.php
  • PDOStatement::execute-http://www.php.net/manual/en/pdostatement.execute.php

无注入漏洞(之前需要"mysql_connect"):

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>";
}

试试这个:

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

这取了$_POST['order_no']的值并对其进行了某种程度的净化。然后将$orderNumber的值应用于MySQL。

不过,您最好使用PDO或MySQLi。两者都可以保护您(如果使用正确)不受SQL注入的影响。目前,您的代码非常容易出现SQL注入。

您的表单应该是这样的:

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

若要获取用户在表单中键入的任何值,应使用type="text"。在标准HTML中没有什么能比得上type="int"

不要混淆,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查询中,应该始终首先对其进行筛选。