【问题标题】:update checkboxes after submit提交后更新复选框
【发布时间】:2015-05-10 15:19:33
【问题描述】:

我目前遇到了一个问题,我有一个由复选框组成的表单。我从数据库中获取复选框的用户首选项值。一切都很好,并且做了应该做的事情,但是在我更改并选中一些框然后点击提交按钮之后,它仍然会再次向表单显示旧值。如果我再次在页面中单击,它将显示新值。

下面用 cmets 显示代码。

<form action="myprofile.php" method="post">
<?php $usr_cats=array();
$qry_usrcat="SELECT category_id_fk 
             FROM user_categories 
             WHERE user_id_fk='".$_SESSION['user_id']."';";
$result = mysqli_query($conn,$qry_usrcat);
while($row = mysqli_fetch_array($result)){
        $usr_cats[] = $row[0]; // getting user categories from db stored in array
}

$query_allcats="SELECT category_id,category_name, portal_name 
                FROM categories
                INNER JOIN portals on categories.portal_id=portals.portal_id
                ORDER BY category_id;";  // select all category queries
$result = mysqli_query($conn,$query_allcats);
while($row = mysqli_fetch_array($result)){
    echo $row['portal_name'] . "<input "; //print categories
    if(in_array($row['category_id'], $usr_cats)){ // if in array from db, check the checkbox
        echo "checked ";
     }
    echo "type='checkbox' name='categories[]' value='";
    echo $row['category_id']."'> ". $row['category_name']."</br>\n\t\t\t\t\t\t";
}
?>
<input type="submit" name="submit" value="Submit"/>
 <?php
$qry_del_usrcats="DELETE FROM user_categories
                WHERE user_id_fk='".$_SESSION['user_id']."';"; //delete all query
if(isset($_POST['submit'])){
    if(!empty($_POST['categories'])){
        $cats= $_POST['categories'];
        $result = mysqli_query($conn,$qry_del_usrcats); //delete all
        for ($x = 0; $x < count($cats); $x++) {
            $qry_add_usrcats="INSERT INTO `user_categories` (`user_id_fk`, `category_id_fk`) 
                     VALUES ('".$_SESSION['user_id']."', '".$cats[$x]."');";
           $result = mysqli_query($conn,$qry_add_usrcats);    
        }
        echo "success";
    }
    elseif(empty($_POST['categories'])){ //if nothing is selected delete all
        $result = mysqli_query($conn,$qry_del_usrcats);
    }
    unset($usr_cats);
    unset($cats);
}
?>

我不确定是什么原因造成的。某些原因导致提交后不更新表单。但是,正如我所说,在我提交值后,一切都具有重要意义,这些值被存储并保存在数据库中,但未在表单上显示/更新。如果您需要任何说明,请告诉我。

谢谢

【问题讨论】:

  • 您在 SELECT 查询之后执行您的 DELETE/INSERT 查询。将这些查询移到 SELECTs 之前。请注意,您需要将 DELETE 查询移动到 if(isset($_POST['submit'])){ 中,这样您就不会在提交表单之前删除。
  • 其实这不是问题,我必须在提交时插入标题。
  • @comsci_dude 你的程序逻辑还是搞砸了。
  • 您的header() 只是在修复您的反向逻辑。本质上,它与将DELETE/INSERT 移动到SELECT 之前的作用相同。现在您正在执行SELECT,然后是DELETE/INSERT,然后是header() 重定向,然后是SELECT。因此,您正在做同样的事情,但可以通过将您的步骤按正确顺序轻松解决。
  • @Sean 我现在正在处理您的建议!!谢谢你,会告诉你:)

标签: php forms checkbox


【解决方案1】:

您的程序逻辑是倒退的,您正在执行一堆您不需要的 INSERT 查询。正如@sean 所说,改变顺序。

<?php

if(isset($_POST['submit'])){
    if(isset($_POST['categories'])){
        $cats= $_POST['categories'];

        // don't do an INSERT for each category, build the values and do only one INSERT query with multiple values

        $values = '';
        for($x = 0; $x < count($cats); $x++) {
            // add each value...
            $values .= "('".$_SESSION['user_id']."', '".$cats[$x]."'),";

        }
        // trim the trailing apostrophe and add the values to the query
        $qry_add_usrcats="INSERT INTO `user_categories` (`user_id_fk`, `category_id_fk`) VALUES ". rtrim($values,',');
        $result = mysqli_query($conn,$qry_add_usrcats); 
        echo "success";
    }
    elseif(!isset($_POST['categories'])){ //if nothing is selected delete all
        // you may want to put this query first, so if something is checked you delete all, so the db is clean and ready for the new data.
        // and if nothing is checked, you're still deleting....
        $qry_del_usrcats="DELETE FROM user_categories WHERE user_id_fk='".$_SESSION['user_id']."';"; //delete all query
        $result = mysqli_query($conn,$qry_del_usrcats);
    }
    unset($usr_cats);
    unset($cats);
}
?>

<form action="myprofile.php" method="post">
<?php $usr_cats=array();
$qry_usrcat="SELECT category_id_fk FROM user_categories WHERE user_id_fk='".$_SESSION['user_id']."';";
$result = mysqli_query($conn,$qry_usrcat);
while($row = mysqli_fetch_array($result)){
    $usr_cats[] = $row[0]; // getting user categories from db stored in array
}

$query_allcats="SELECT category_id,category_name, portal_name FROM categories INNER JOIN portals on categories.portal_id=portals.portal_id ORDER BY category_id;";  // select all category queries
$result = mysqli_query($conn,$query_allcats);
while($row = mysqli_fetch_array($result)){
    echo $row['portal_name'] . "<input "; //print categories
    if(in_array($row['category_id'], $usr_cats)){ // if in array from db, check the checkbox
        echo "checked ";
     }
    echo "type='checkbox' name='categories[]' value='";
    echo $row['category_id']."'> ". $row['category_name']."</br>\n\t\t\t\t\t\t";
}
?>
<input type="submit" name="submit" value="Submit"/>

【讨论】:

  • 现在我明白我做错了什么,感谢您为我解决这个问题。但是我已经稍微修改了代码,因为正如您所说,这仅适用于插入新值,但如果有人取消选中复选框则无效。
【解决方案2】:

这通常是由于您的查询在脚本中的顺序造成的。

如果您想在提交后显示更新后的结果,您应该使您的 updateinsert 查询成为有条件的,并让脚本自己调用。您的脚本的顺序很好,但您只需要执行以下操作:

进行以下查询:

$qry_del_usrcats="DELETE FROM user_categories
            WHERE user_id_fk='".$_SESSION['user_id']."';"

并将其放在if 语句中,如下所示:

if (isset($_POST['submit'] {

  $qry_del_usrcats="DELETE FROM user_categories
                    WHERE user_id_fk='".$_SESSION['user_id']."';"
$result = mysqli_query($conn,$qry_del_usrcats); 

[along with the other updates you have]
}

另外,您需要将整个条件移到表单本身的上方;通常,任何更新、插入或删除都应该出现在表单的顶部,然后在之后调用选择(在条件之外)

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2014-04-06
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多