0

約 500,000 行のテーブルがあり、クエリを実行して結果を取得する必要があります。基本的にユーザーはケース番号を入力するだけで、次のクエリを実行し、while ループを使用して結果を表示したい

if (!empty($_POST["casenum"])) {
    $result2 = mysql_query("SELECT Box_Content.case_number, Transfer.number, Transfer.location, Box.number FROM Box_Content, Transfer, Box WHERE Box_Content.box_id = Box.id and Box.transfer_id = Transfer.id and Box_Content.case_number = '".$_POST['casenum']."'");

    while ($row = mysql_fetch_array($result2)) {
        echo "Case number: ".$casenum." text ";
        echo "<br />";
    }

} else {
    echo "<h4>WARNING!!! Search criteria entered not valid. Please search again.</h4>";
}

ここで何が間違っていますか?

編集:

1 行のみが返された場合は機能しますが、2 行の場合はテーブル全体を印刷しようとしているようです...

$casenum = $_POST["casenum"];
echo "<br />The case number entered is: $casenum<br />";

if (!empty($_POST["casenum"]))
        {
        $result2 = mysql_query("SELECT Box_Content.case_number, Transfer.number as transfer_number, Transfer.location as transfer_location, Box.number as box_number FROM Box_Content, Transfer, Box WHERE Box_Content.box_id = Box.id and Box.transfer_id = Transfer.id and Box_Content.case_number = '" . $_POST['casenum'] . "'");

        while($row = mysql_fetch_array($result2))
                {
                print_r ($row);
                echo "<br />";
                echo "<b>Case number: </b>" . $row['case_number'] ."<br />";
                echo "<b>Transfer number: </b>" . $row['transfer_number'] ."<br />";
                echo "<b>Transfer location: </b>" . $row['transfer_location'] ."<br />";
                echo "<b>Box number: </b>" .$row['box_number'] ."<br />";
                }
}

else
        {
        echo "<h4>WARNING!!! Search criteria entered not valid. Please search again.</h4>";
        }

var_dump($_POST);
4

3 に答える 3

2

試す:

    while ($row = mysql_fetch_array($result2)) {
        echo "Case number: ". $row['Box_Content.case_number'] ." text ";
        echo "<br />";
    }

$row['case_number']case_number結果セットの各行に対して取得されたものを出力します。

ただし、次の2つのいずれかを実行することを検討する必要があります。

  1. ベストプラクティスの使用を開始します。
  2. 非推奨ではないSQLライブラリ(mysqli、PDO)の使用を開始します。

このクエリはSQLインジェクションの影響を受けやすいです。

"SELECT Box_Content.case_number, Transfer.number, Transfer.location, Box.number
     FROM Box_Content, Transfer, Box
     WHERE Box_Content.box_id = Box.id and Box.transfer_id = Transfer.id
     and Box_Content.case_number = '".$_POST['casenum']."'"

mysql_real_escape_string($_POST['casenum'])これにパッチを適用するために使用します。

参照: http: //php.net/manual/en/function.mysql-real-escape-string.php

準備されていないステートメント操作のため、mysql_*関数は長い間非推奨になっています。代わりに、プロジェクトのmysqliまたはPDOを調べてください。

于 2012-09-27T15:42:46.687 に答える
0

ここで何が間違っていますか?

1) コードに $casenum が設定されていません... (それは何もなく、レジスタ スーパーグローバルが有効になっていないことを教えてください?!)$row['case_number']

2)しかし、とにかく、それはあなたが間違っていることではありません...あなたの最大の間違いは、検証やサニタイズを一切行わずにユーザー入力を使用することです...

$_POST["casenum"]が等しいと想像してください...

' or 1=2 union select user,password,email,salt from users

于 2012-09-27T15:46:59.120 に答える
0

$casenumどこからともなく使っているようです。

試す:

while($row = mysql_fetch_assoc($result2))
   echo "Case number: ".$row['number']." text <br />";

mysql_fetch 関数を使用すると、assoc は名前付きインデックス データを返し、num は数値インデックス データを返し、array は両方を返すので、どちらか一方を使用してみてください。

次に、$row = mysql_fetch_assoc($result2)返されたデータの行ごとに本質的に言うと、それを (この場合は連想) 配列として $row に格納するため、標準の配列コマンド ( $row['foo']) を介してデータにアクセスできます。

于 2012-09-27T15:52:32.577 に答える