0

以下は、私の e コマース Web サイト (プロトタイプ) 内で使用される php ファイルで、顧客が選択したアイテムを書き込み、その選択をフラット ファイル データベースに保存します。ロジックは正常に機能しますが、echo "Order Submitted!;選択されたすべてのアイテムに対して が印刷されます。たとえば、4 つのアイテムが選択されている場合、この行は 4 回印刷されます。1 回だけ印刷する必要があります。これをどのように達成できるか考えていますか?

<body>

    <table>

        <?php   
        if (!($data = file('items.txt'))) {
            echo 'ERROR: Failed to open file! </body></html>';
            exit;
        } else {
            echo "<h1>Transaction Completed!</h1>"; 
        }
        date_default_timezone_set('Europe/London');
        $now = date(' d/m/y H:i:s ');
        $visitor = $_POST['visitor']; 

        foreach ($_POST as $varname => $varvalue) {
            foreach ($data as $thedata) {
                list($partno, $name, $description, $price, $image) = explode('|', $thedata);
                if ($partno == $varname) {
                    $myFile = "purchases.txt";
                    $fh = fopen($myFile, 'a') or die("ERROR: Failed to open purchases file!\n");
                    $content = $now . "|" . $visitor . "|" . $partno . "|" . $name . "|" . $price . "\n";

                    if (!(fwrite($fh, $content))) {
                        echo "<p>ERROR: Cannot write to file($myFile)\n</p>";
                        exit;
                    } else {
                        echo "<p>Order Submitted!</p>";
                        fclose($fh);
                    }
                }
            }
        }
        ?>

    </table>

    <input type="button" onClick="parent.location='home.php'" value="Return Home">
    <input type="button" onClick="parent.location='items.php'" value="New Purchase">

2 つの項目が選択されている場合、出力は次のようになります。

取引完了 注文が送信されました! 注文が送信されました!

4

4 に答える 4

1

エラーがあるかどうかを追跡し、elseをループの外に移動します。

$error=false;
    foreach ($_POST as $varname => $varvalue) {
        foreach ($data as $thedata) {
            list($partno, $name, $description, $price, $image) = explode('|', $thedata);
            if ($partno == $varname) {
                $myFile = "purchases.txt";
                $fh = fopen($myFile, 'a') or die("ERROR: Failed to open purchases file!\n");
                $content = $now . "|" . $visitor . "|" . $partno . "|" . $name . "|" . $price . "\n";

                if (!(fwrite($fh, $content))) {
                    echo "<p>ERROR: Cannot write to file($myFile)\n</p>";
                    $error=true;
                    exit;
                } 
            }
        }
    }
if(!$error) {
  echo "<p>Order Submitted!</p>";
  fclose($fh);
}

ただし、このように記述した場合、エラーが発生した場合は実行されないため、「送信された注文」を囲む条件は必要ありません。(出口のため。)

また、$ myfileが変更されない場合は、ループの外に移動できます。

2番目のバージョン:

    $myFile = "purchases.txt";
    foreach ($_POST as $varname => $varvalue) {
        foreach ($data as $thedata) {
            list($partno, $name, $description, $price, $image) = explode('|', $thedata);
            if ($partno == $varname) {
                $fh = fopen($myFile, 'a') or die("ERROR: Failed to open purchases file!\n");
                $content = $now . "|" . $visitor . "|" . $partno . "|" . $name . "|" . $price . "\n";

                if (!(fwrite($fh, $content))) {
                    echo "<p>ERROR: Cannot write to file($myFile)\n</p>";
                    exit;
                } 
            }
        }
    }
  echo "<p>Order Submitted!</p>";
  fclose($fh);
于 2013-03-20T17:36:25.680 に答える
0

foreachループの前:

$printed=false;

その後、代わりに

else {
    echo "<p>Order Submitted!</p>";
    fclose($fh);
}

使用する

else {
    if(!$printed)
    {
        echo "<p>Order Submitted!</p>";
        $printed=true;
    }
    fclose($fh);
}
于 2013-03-20T17:36:43.590 に答える
0

echoをブランチから削除し、最初の閉じ括弧elseの直後に配置する必要がありますforeach

于 2013-03-20T17:36:49.710 に答える
0

カウンターを使用して、複数のカウンターが送信されたかどうかを確認できます

お気に入り:

$count=0;
foreach ($_POST as $varname => $varvalue) {
            foreach ($data as $thedata) {
                list($partno, $name, $description, $price, $image) = explode('|', $thedata);
                if ($partno == $varname) {
                    $myFile = "purchases.txt";
                    $fh = fopen($myFile, 'a') or die("ERROR: Failed to open purchases file!\n");
                    $content = $now . "|" . $visitor . "|" . $partno . "|" . $name . "|" . $price . "\n";

                    if (!(fwrite($fh, $content))) {
                        echo "<p>ERROR: Cannot write to file($myFile)\n</p>";
                        exit;
                    } else {
                        $count++;
                        fclose($fh);
                    }
                }
            }
         }
    if ($count>0)
        echo "<p>Order Submitted! $count Times</p>";
于 2013-03-20T17:38:13.200 に答える