簡體   English   中英

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

這會將“訂單”中的所有內容輸出到表中,但我希望它僅輸出用戶在上一頁中輸入的具有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"不是公認的輸入類型。 以下是HTML 4的類型 列表和HTML 5的列表

如您所見,HTML 5確實具有新的輸入類型“數字”。 它沒有被完全采用,但是如果您想使用它:

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

但是請注意,並非所有瀏覽器都會將輸入限制為數字: http : //caniuse.com/#feat=input-number

文獻資料

嘗試這個:

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

這將使用$_POST['order_no']並對其進行某種程度$_POST['order_no'] 然后,您將$orderNumber的值應用於MySQL。

但是,使用PDOMySQLi會更好。 兩者都可以保護您(如果使用正確)免受SQL注入。 目前,您的代碼非常容易進行SQL注入。

沒有注入漏洞(之前需要'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>";
}

您的表格應如下所示:

<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中的Input TYPE與您在編程語言中用來聲明Data type的輸入類型不同。 在這里,TYPE只是為了讓瀏覽器知道其文本字段/單選按鈕等。要了解有效輸入類型,請更好地閱讀有關HTML表單的w3.org建議

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查詢中,因此應始終對其進行過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM