0

奇妙な小さな問題があります。

複数の行を MySQL DB に挿入するスクリプトを書いていますが、奇妙なことに、それらの ID は、編集中のように適切な 1、2、3 のセットであるとは限りません。continue ステートメントは、PHP でタイムアウトになるため、すべての行をスキップする必要があります。これは、過去数時間、私の頭を悩ませてきました。何か案は?

ありがとう!

$items = $_POST['invItemQuantity'];
$i = 1;
while($i <= $items) {
    if(!isset($_POST['item'.$i])) continue;
        //assign posts to variables
        $date = $_POST["item_date".$i];
        $description = $_POST["description".$i];
        $price = $_POST["price".$i];
        $ID = $_POST["item".$i];

        $que = "UPDATE invoice_items SET date='".$date."', description ='".$description."', price ='".$price."' WHERE item_ID=".$ID;
        $test .= $que."<br>";
        $i++; 

} 
4

3 に答える 3

4
if(!isset($_POST['item'.$i])) continue;

その場合、i をインクリメントするのを忘れました。次のように修正します。

if(!isset($_POST['item'.$i])) { $i++; continue; }
于 2013-02-17T01:26:13.300 に答える
1

何があってもすべての項目フィールドを反復処理する必要があるため、for ループを使用すると、インクリメント アクションを忘れないようにすることが容易になる場合があります。

$items = $_POST['invItemQuantity'];
for($i=1; $i<=$items; $i++)
{
    if(!isset($_POST['item'.$i])) continue;

    // ...
}

コードで使用する前に、"$_POST['invItemQuantity']" に対して何らかの検証を実行することもできます (たとえば、期待される範囲の数が含まれていることを確認します)。

于 2013-02-17T01:35:59.027 に答える
0

これに対するあなたの全体的なアプローチは非常に奇妙です。あなたのフォームにはitem1、item2、item3などがあると思います。代わりに、すべてのアイテムが配列として送信されるようにitems[]が必要です。item_date、description、price ごとに同じことを行います。次に、単に実行します。

foreach($_POST['items'] as $i => $item) {
    if(!empty($item)) {
        $date = mysql_real_escape_string(trim($_POST['item_date'][$i]));
        $description = mysql_real_escape_string(trim($_POST['description'][$i]));
        $price = mysql_real_escape_string(trim($_POST['price'][$i]));
        $ID = (int)$_POST['item'][$i];

        //UPDATE QUERY...
    }
}

もう 1 つは、SQL インジェクションの危険にさらされるため、ユーザー入力をデータベースに直接入力しないでください。常に最初に mysql_real_escape_string (mysql 用) を使用してエスケープする必要があります。MySQLi または PDO を学ぶことはさらに良いことです。

また、入力がクリーンであることを確認する良い方法であるfilter_inputを確認することもできます。ユーザー入力を決して信用してはならず、可能であれば常に適切な変数のホワイト リストに対してテストする必要があります。

于 2013-02-17T01:35:51.000 に答える