0

この手法を使用して、単一の送信ボタンでオプションのリスト全体を更新できる動的フォームを作成しましたforeach($_POST)が、何らかの理由で、チェックボックス入力で同じことを達成するのに問題があります。

どのチェックボックスを選択解除しても、チェックボックスを評価し、フォームの最後の行を選択解除した行として処理するスクリプト。つまり、どのチェックボックスを選択解除しても、POST スクリプトは最後のチェックボックスが選択解除されたと判断します。これまでに見たことのない非常に奇妙な効果です。

たとえば、この PHP 配列フェッチは、アイテムを非表示にするオプションを使用して在庫アイテムの行を生成します。

****私はまだセキュリティ対策を講じていないことに注意してください. この作品を論理的に見ると、すべてをサニタイズします。今のところREQUESTも使いたくありませんが、まずはこの作品を見てみたいです。

<form action="update.php" method="post">
while($row=mysql_fetch_array($histresult))
    {
                echo '<tr height = "50px">';
                //We grab the product id as well as everything else we need.
                $customer_id= $row['customer_id'];
                $product_id= $row['product_id'];
                $link = $row['image_path'];
                $name = $row['name'];
                $sku_item_number = $row['sku_item_number'];
                $suggested_quantity = $row['suggested_quantity'];
                $sales_info = $row['sales_info'];
                $item_id = $row['id_product_customer_suggested_qty'];
                $customer_level = $row['level'];


                //Visibility Option Goes here
                echo '<td>';
                echo '<input name="i" type="hidden" value="'.$i.'">
                <input name="product_id[]" type="hidden" value="'.$product_id.'">
                <input name="customer_id[]" type="hidden" value="'.$customer_view.'">
                <input name="customer_level[]" type="hidden" value="'.$customer_level.'">';

                echo '<input name="cart_visible[]" type="checkbox" value = "1"';
                if (!in_array($product_id, $hidden))
                {
                    echo 'checked = "checked"';
                }
                echo '></td>';
                echo '<td>';
                echo '<a href="displayitem.php?product_id='.$product_id.'">'.$name.'</a>';
                 echo '</td>';
                 echo '<td>'.$sku_item_number.'</td>';
                 echo '<td>'.$product_id.'</td>';
                 echo '<td>'.$sales_info.'</td>';
                 echo '<td>'.$suggested_quantity.'</td>';
                         echo '</tr>';
<input type="submit" name="button" id="button" value="Submit">
</form>

//And then update.php looks like this:

$j=0;
foreach($_REQUEST['product_id'] as $key=>$product_id)
{ 
    echo 'j value is '.$j.'<br>';
    $customer_id = $_REQUEST['customer_id'][$key];
    $customer_level = $_REQUEST['customer_level'][$key];
    $price_level_id = $_REQUEST['price_level_id'][$key];
    $cart_visible = $_REQUEST['cart_visible'][$key];

    if ($cart_visible != 1)
    {
        $cart_visible = 0;
    }
    //echo 'Customer ID is '.$customer_id.'<br>';
    echo 'Testing - Product ID is '.$product_id.'<br>';
    //echo 'Customer Level is '.$customer_level.'<br>';
    //echo 'Price Level ID is '.$price_level_id.'<br>';
    echo 'Cart visibility selection is '.$cart_visible.'<br>';
}

デバッグ行のエコーは、どの行を選択解除しても、フォームの最後の行を選択解除されたものとして扱うことを示しています。たとえば、10 行あり、行 1、3、および 8 のチェックボックスの選択を解除すると、フォームは、ユーザーが 8、9、および 10 番目のチェックボックスの選択を解除したように動作します。チェックボックス専用にこれを行うのはなぜですか?

4

1 に答える 1

2

選択解除されたチェックボックスを投稿すると、その「値」が送信されないため、POST には含まれません。

チェックボックスが配列名の一部であり、10 個のチェックボックスがあり、3 個が選択解除されている場合、POST の結果の配列には 0 から 6 までの 7 つのインデックスが含まれます。

この問題を解決するには、チェックボックス名に配列の値を指定します。

私はあなたのコードを正しく理解していないかもしれませんが、このようなものです

$ite=0;    
while($row=mysql_fetch_array($histresult)){
      //....
      echo '<input name="cart_visible['.$ite.']" type="checkbox" value = "1"';
      //....
      $ite++;
}

ここで、チェックボックス番号 3 の選択を解除したとします。これは、3 番目のインデックスが存在しないことを意味します。コードの $cart_visible 部分は次のようになります

//if checkbox value exists, make $cart_visible to that value, else make $cart_visible to 0
$cart_visible = isset($_REQUEST['cart_visible'][$key])?$_REQUEST['cart_visible'][$key]:0;

$cart_visible の if ステートメントを削除します

于 2012-09-16T19:10:53.287 に答える