在MySQL查询使用PHP形式(Using PHP forms in mysql queries)

2019-10-17 04:13发布

另一个(基本)的问题在这里。 我需要知道如何使用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]"); 

非常感谢

Answer 1:

首先,你应该切换到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

文档

  • 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


Answer 2:

如果没有注入漏洞(需要“的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>";
}


Answer 3:

尝试这个:

$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注入(如果正确使用)。 Currenly,你的代码是很容易出现的SQL注入。



Answer 4:

您的形式应该是这样的:

<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的输入类型是不一样的,你一个编程语言使用申报数据类型。 这类型只是让浏览器知道它的文本字段/单选按钮等。要了解有效的输入类型更好的阅读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查询,它应该永远先行过滤。



文章来源: Using PHP forms in mysql queries
标签: php html forms