这里还有一个(基本)问题。我需要知道如何使用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.phpPDOStatement::fetch
-http://www.php.net/manual/en/pdostatement.fetch.phpPDOStatement::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查询中,应该始终首先对其进行筛选。