0

配列とforループを使用してMySQLデータベースに値を挿入するクエリがありますが、MySQLデータベースからフォームを送信すると、二重エントリが表示されます。最初のレコードは空で、2 番目のレコードには値がありますか? MySQL データベースが First Record Empty Entry を表示するのはなぜですか? その理由がわかりません。

ここに私の機能コード

<?php 
if(isset($_REQUEST['order'])) 
{
$count=1;
$count++;   
$total=$_POST['total']; 
for ($i=1; $i<=$count; $i++){
$queryproduct=mysql_query("INSERT INTO shoppingcart VALUES    ('','','','$uid','$email','".$_POST['product'][$i]."','".$_POST['userfile_name'] [$i]."','".$_POST['price'][$i]."','".$_POST['qty'][$i]."','".$_POST['amt'][$i]."','$total')") or die("Order  Query Problem");    
}
}
?>
4

2 に答える 2

0

最初にこのコードのセキュリティ問題を無視します。後でその部分に戻ることができます。まず、私が正しい方法で見ている問題に対処しましょう。

最初のレコードは空で、2番目のレコードには値がありますか?なぜMySQLデータベースにFirstRecordEmpty Entry.iが表示されているのか、その背後にある理由がわかりません。

$count=1;
$count++;

ここで何が起こっているのですか?$countに等しい設定をしてから、2行目で1もすぐに1ずつ増やします。2どうしてそんなことをするのか?そもそも2つに設定してみませんか?

きっと、最初のレコードが空であるという問題は、これらのコード行から始まります。

$total = $_POST['total'];

これはクエリで1回だけ使用されるため、メモリを浪費しているだけで、別の変数に割り当てる必要があります。

あなたのコードの最初の例から、これはあなたがそれから得ることができる最高の実行であると私は言うでしょう(ここでも、セキュリティについて話していません)。

<?php 
if(isset($_REQUEST['order'])) 
{
    for ($i = 1, $count = 0; $i <= $count; ++$i)
    {
        $queryproduct = mysql_query
        (
            "INSERT INTO shoppingcart VALUES
            (
                '',
                '',
                '',
                '$uid',
                '$email',
                '{$_POST['product'][$i]}',
                '{$_POST['userfile_name'][$i]}',
                '{$_POST['price'][$i]}',
                '{$_POST['qty'][$i]}',
                '{$_POST['amt'][$i]}',
                '{$_POST['total']}'
            );"
        )
        or die("Order Query Problem");
    }
}
?>

2番目のコードセットを見ると、これはおそらくそれを使ってできる最善の方法でしょう。

<?php
    if(isset($_REQUEST['order']))
    {
        for($i = 0, $p = count($_POST['product']); $i < $p; ++$i)
        {
            $queryproduct = mysql_query
            (
                "INSERT INTO shoppingcart VALUES
                (
                    '',
                    '',
                    '{$_POST['pid'][$i]}',
                    '$uid',
                    '$email',
                    '{$_POST['product'][$i]}',
                    '{$_POST['userfile_name'][$i]}',
                    '{$_POST['price'][$i]}',
                    '{$_POST['qty'][$i]}',
                    '{$_POST['amt'][$i]}',
                    '{$_POST['total']}'
                );"
            )
            or die("Order Query Problem");
        }
    }
?>

最後に、これはセキュリティに関するものです。PHPコードベース内にある非推奨ではない関数のいくつかを使用すれば、これらのステートメントを安全にすることができます。

PDOはこれらのインターフェースの中で最も一般的であり、SQLデータベースへのPDO接続をセットアップするために必要なすべてのドキュメントを見つけることができます。

<?php
    if(isset($_REQUEST['order']))
    {
        $stmt = $dbh->prepare("INSERT INTO shoppingcart VALUES ('', '', ?, ?, ?, ?, ?, ?, ?, ?, ?);");

        $stmt->bindParam(1, $pid);

        $stmt->bindParam(2, $uid);
        $stmt->bindParam(3, $email);

        $stmt->bindParam(4, $product);
        $stmt->bindParam(5, $name);
        $stmt->bindParam(6, $price);
        $stmt->bindParam(7, $qty);
        $stmt->bindParam(8, $amt);

        $stmt->bindParam(9, $total);

        for($i = 0, $p = count($_POST['product']); $i < $p; ++$i)
        {
            $pid = $_POST['pid'][$i]);

            $product = $_POST['product'][$i]);
            $name = $_POST['userfile_name'][$i]);
            $price = $_POST['price'][$i]);
            $qty = $_POST['qty'][$i]);
            $amt = $_POST['amt'][$i]);

            $total = $_POST['total'];
        }

        $stmt->execute();
    }
?>

これらは、クエリステートメントを正しくエスケープする処理を行います。私たち全員がすべての攻撃ベクトルを知ることができず、専門家が最も一般的なものを修正する方法に関するコードをすでに考え出している場合、大いに役立ちます。

于 2013-03-03T21:23:44.797 に答える
0

$_POST["pid"] 変数は 0 から番号が付けられているため、2 番目の (実際の) 例のように、ループを 0 から開始してみてください。

for($i=0; $i<$lenght; $i++){ ...

ただし、Matt Ball がコメントで述べているように、mysql_* 関数の使用は避けてください。

于 2013-03-03T20:50:37.287 に答える