1

ここで別の(基本的な)質問です。PHP を使用して mysql クエリの結果をフィルタリングするために、html フォームを使用する方法を知る必要があります。私は 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]"); 

どうもありがとうございます

4

4 に答える 4

4

手始めに、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

ドキュメンテーション

于 2012-08-23T18:50:35.083 に答える
1

インジェクションの脆弱性なし (前に '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>";
}
于 2012-08-23T18:56:44.760 に答える
1

これを試して:

$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 インジェクションに対して非常に脆弱です。

于 2012-08-23T18:49:31.463 に答える
0

フォームは次のようになります。

<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 の入力タイプは、プログラミング言語でデータ型を宣言するために使用するものと同じではありません。ここで、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 クエリに直接入力することは決して推奨されません。常に最初にフィルター処理する必要があります。

于 2012-08-23T21:05:26.040 に答える