[英]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
文獻資料
SELECT
- http://dev.mysql.com/doc/refman/5.0/en/select.html mysql_query
( 不推薦 ) - http://php.net/manual/en/function.mysql-query.php PDO::prepare
- http://www.php.net/manual/zh/pdo.prepare.php PDOStatement::fetch
- http: PDOStatement::fetch
PDOStatement::execute
- http: PDOStatement::execute
沒有注入漏洞(之前需要'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.