1

目的:ユーザーがチェックボックスの使用可能なリストから項目を選択できるようにし、添付されたIDでDBを更新できるようにします。$ _POSTの後、選択したアイテムがチェックされます。

問題:フォームが送信されると、現在のチェックボックスではなく、前のチェックボックスのセットが返されます。何も変更せずにフォームを再送信すると、チェックボックスの新しいセットが利用できるようになります。基本的に、新しい値は、送信btnが2回押された後にのみ表示されます。

コード:DBにクエリを実行して、フォームにチェックボックスを入力する関数...

function chCheck($conn){
$sql = "Select CHEESE, ID, OnMenu from CheeseSelections";
$result=$conn->query($sql);
    while($row=$result->fetch_assoc())
        {   
            if ($row['OnMenu']==="True"){
                $str =  "<input type='checkbox' name='chList[]' value='".$row['ID']."' id='".$row['CHEESE']."' checked/>";
                $str .= "<label for ='".$row['CHEESE']."'>".$row['CHEESE']."</label>";
                $str .= " <a href=\"#\">view/edit item</a><br />";  
                echo $str;
                }
            elseif ($row['OnMenu']==="False"){
                $str =  "<input type='checkbox' name='chList[]' value='".$row['ID']."' id='".$row['CHEESE'];
                $str .= "/> <label for ='".$row['CHEESE']."'>".$row['CHEESE']."</label>";
                $str .= " <a href=\"#\">view/edit item</a><br />";  
                echo $str;
                }
        }

}

HTML

 <form name="chCheck" method="post" action="">
        <?php chCheck($conn); ?>
        <input type="submit" name="update" value="Update Selections"></br>  
    </form>

$ _POST

if ($_POST) 
    {
        $ids = $_POST['chList'];

                $sql = "UPDATE CheeseSelections SET CheeseSelections.OnMenu = \"False\";";
        foreach($ids as $items){        
                $sql .= "UPDATE CheeseSelections SET CheeseSelections.OnMenu = \"True\" WHERE CheeseSelections.ID IN (".$items."); ";
                    }       
        //echo $sql;

        mysqli_multi_query($conn, $sql);
        mysqli_query($conn, $sql);
        printf("Affected rows (UPDATE): %d\n", $conn->affected_rows);

        printf("Error Code: %d\n", $conn->errno);
    }

ロジック:送信すると、「OnMenu」の列全体が「False」に設定されます。$ _POSTから収集されたIDは、「True」に設定されます。これにより、列の設定が解除されてからリセットされます。この論理は正しいですか?私は別の方法で何をすべきですか?

ありがとうございました。

4

2 に答える 2

1

私が違ったやり方でやることがいくつかあります。まず、ベストプラクティスとして、チェックされたステータスのみが異なる場合は、入力ボックスの重複を避けてください。現在、変更を行う場合は、2か所で変更を加える必要があります。

function chCheck($conn)
{
    $sql = "Select CHEESE, ID, OnMenu from CheeseSelections";
    $result=$conn->query($sql);
    while($row=$result->fetch_assoc())
    {   
        $selected = ($row['OnMenu'] === "True" ? ' checked="checked"' : '');
        echo '<input type="checkbox" name="chList[]" value="'.$row['ID'].'" id="'.$row['CHEESE'].'"'.$selected.' /><label for="'.$row['CHEESE'].'">'.htmlentities($row['CHEESE']).'</label> <a href="#">view/edit item</a><br />';               
    }
}

次に、ラジオボタンのようにチェックを外すと、HTMLチェックボックスは値を送信しません。POSTでは、最初にすべての値をクリアし(実行中に、すべてのデータベース値をFalseに設定します)、次に、投稿された値をループして配列に入れ、単一のクエリを呼び出してそれらをTrueに設定します。

$item_ids = array();
foreach ($ids as $item)
    $item_ids[] = intval($item);  // to prevent $_POST data type tampering

$sql .= "UPDATE CheeseSelections SET CheeseSelections.OnMenu = 'True' WHERE CheeseSelections.ID IN (".implode(",",$item_ids)."); ";

$ _POST処理コードが、スクリプトの上部の関数呼び出しの上にもあることを確認してください。それがあなたが見ている行動の原因である可能性があります。

また、ブール値をテキストとして格納することは避けたいので、「True」および「False」のテキスト値を使用するのではなく、TinyInt(1)データ型を使用して0または1に設定します。それはただより効率的です。

于 2012-08-30T18:47:57.530 に答える
0

プログラムのロジックに問題があります。

フォームの HTML を生成し、最後に SQL 更新を実行しています。ユーザーが送信をクリックして次のページが作成されると、データベース クエリは既存の選択肢を返し、それに応じて HTML を生成します。最後に、$_POST が処理され、データベースが更新されます。そのため、ページが生成されるまで更新されません。

$_POSTへの呼び出しの前に if ステートメント全体を移動してみてくださいchCheck()

于 2012-08-30T18:29:08.093 に答える