复选框';s在php中分页后保持检查状态


checkbox's stay checked after pagination in php

你好,我希望我要选中的任何复选框在分页后保持选中状态。

这是代码:

foreach($test as $string){
            $queryForArray = "SELECT p_fname,p_id FROM personnel WHERE p_id = " .$string["p_id"]. "  ;" ;
            $resultForArray = mysql_query($queryForArray, $con);    
            $rowfForArray = mysql_fetch_array($resultForArray);
?>
    <td  id="<?php echo $rowfForArray["p_id"]?>"   onclick="setStyles(this.id)" ><?php echo  $rowfForArray["p_fname"]?></td>
    <td><input id="<?php echo $rowfForArray["p_id"]?>" class="remember_cb" type="checkbox"  name="how_hear[]" value="<?php echo $rowfForArray["p_fname"]?>" 
    <?php  foreach($_POST['how_hear'] as $_SESSION){echo (( $rowfForArray["p_fname"] == $_SESSION) ? ('checked="checked"') : ('')); } ?>/></td>
</tr>
<tr>

我从同一页面中的搜索结果中获取数据,然后每个结果都有一个复选框,这样我就可以选中$_Session使用所需的"人员"。

我唯一想做的就是在分页之后和提交表单之前,复选框保持选中状态!(如果需要,我可以发布分页代码,但他是100%正确的)

在复选框标记中使用三元运算,而不包含foreach:

    <input [...] value="<?php echo $rowfForArray["p_fname"]?>" <?php $rowfForArray["valueToCompareIfTrue"] ? "checked='checked'" : ''; ?> />

因为输入已经在"for"循环中,所以每次循环都会创建一个新的复选框,该复选框将验证是否需要被选中。

我希望我帮助过你。

解决此问题的几种方法:

(直白PHP):每个页面都需要是一个单独的表单,你的"下一步"按钮/链接需要在每次点击下一步时提交表单。然后,提交数据应该被推送到您的$_SESSION变量中。如果数据也向后导航,则可以提取这些数据并用于重新填充表单。只是巧妙地使用表单的适当$_GET变量设置URL。

(HTML5):这将更多地依赖JavaScript,但基本上你可以取消分页,然后将整个数据集分解为div块,你可以用JavaScript+CSS隐藏/显示这些块,或者使用JQuery这样的库。

(AJAX):将事件侦听器添加到复选框中,这样当选中按钮时,就会对PHP脚本进行异步调用,并相应地更新$_SESSION变量。同样,这取决于您使用JavaScript的舒适程度。

请记住,PHP=ServerSide&JavaScript=ClientSide。虽然你可以一起破解一些PHP来处理"客户端"的东西,但它通常丑陋而复杂。。。

我没有接触数据库就完成了。。。

复选框字段是php集合"cbgroup[]"。然后,我制作了一个隐藏的文本框,其中包含所有值,这些值等于与复选框镜像的可选项目的主键。通过这种方式,我可以遍历当前页面上的假复选框,并按ID取消选中仅存在于当前页面上。如果用户搜索项目并且表格发生更改,则保留可选择的项目!(直到他们破坏会话)

我发布分页而不是GET。

用户选择项目后,页面将被张贴,并且我读取当前页面上存在的所有复选框ID的隐藏文本字段。由于仅PhP告诉您从实际复选框中选中了哪些复选框,因此我仅从该文本框值中清除POSTED页面上存在的会话数组中的那些复选框。因此,如果用户先前选择了ID为2、4、5的项目,但当前页面具有ID 7、19和22,则从SESSION数组中仅清除7、19、22。

然后,我用以前检查过的任何项目7、19或22(如果选中)重新填充数组,并将其与2、4和5(如果选中的话)一起附加到SESSION数组

在他们浏览完所有项目并做出最终选择后,我将他们的最终选择发布到数据库中。这样,他们就可以冒险进入其他页面,甚至可能在dB中添加一个项目,返回到项目选择页面,他们的所有选择仍然完好无损!每次页面迭代都不需要在某个临时表中写入数据库!

首先,检查所有复选框并清除这些值的数组这将只清除当前页面中的复选框,而不会清除任何其他页面中以前选中的任何项目。

if (array_key_exists('currentids', $_POST)) {
          $currentids = $_POST['currentids'];
          if (isset($_SESSION['materials'])  )  {
             if ($_SESSION['materials'] != "") {
                  $text = $_SESSION['materials'];
                  $delimiter=',';
                  $itemList = explode($delimiter, $text);
                  $removeItems = explode($delimiter, $currentids);                  
                  foreach ($removeItems as $key => $del_val) {
                  //echo "<br>del_val: ".$del_val." - key: ".$key."<br>";
                         // Rip through all possibilities of Item IDs from the current page
                         if(($key = array_search($del_val, $itemList)) !== false) {
                             unset($itemList[$key]);
                             //echo "<br>removed ".$del_val;
                         }                           
                        // If you know you only have one line to remove, you can decomment the next line, to stop looping
                        //break;                             
                  }
                  // Leaves the previous paged screen's selections intact
                  $newSessionItems = implode(",", $itemList);                     
                  $_SESSION['materials'] = $newSessionItems;                      
             }
          }
       }

现在,我们已经检查了以前屏幕的值,并从SESSION数组中清除了当前复选框,现在让我们写下用户选择的内容,因为他们可能已经取消选择了某些内容或全部内容。检查选中了哪些复选框

if (array_key_exists('cbgroup', $_POST)) {
       if(sizeof($_POST['cbgroup'])) {
            $materials = $_POST['cbgroup'];
            $N = count($materials);
            for($i=0; $i < $N; $i++)
                {                   
                $sessionval = ",".$materials[$i];
                $_SESSION['materials'] = $_SESSION['materials'].$sessionval;
                }                    
        } //end size of 
     } // key exists

现在我们有了所有可能被检查的项目,但可能有重复的项目,因为用户可能来回翻页这将读取整个ID集合,并删除重复项(如果有的话)。

if (isset($_SESSION['materials'])  )  {
   if ($_SESSION['materials'] != "") {
        $text = $_SESSION['materials'];
        $delimiter=',';
        $itemList = explode($delimiter, $text);
        $filtered = array();
            foreach ($itemList as $key => $value){
                if(in_array($value, $filtered)){
                continue;
                }
                array_push($filtered, $value);
            }               
            $uniqueitemschecked = count($filtered);
            $_SESSION['materials'] = null;
            for($i=0; $i < $uniqueitemschecked; $i++)  {
                $_SESSION['materials'] = $_SESSION['materials'].",".$filtered[$i];
            }
   }
}

$_SESSION['materials']是用户选择的所有复选框的集合(在每个分页屏幕上),并包含数据库表中的primary_key值。现在你所需要做的就是翻录SESSION集合,读写材料表(或其他什么),然后通过primary_key 选择/更新

Typical form...
<form name="materials_form" method="post" action="thispage.php">

在某个地方需要这个:跟踪当前页面,所以当你发布时,它会前后转到正确的页面

<input id="_page" name="page" value="<?php echo $page ?> "> 
if ($page < $counter - 1) 
$pagination.= "<a href='"javascript:document.getElementById('_page').value='$next';materials_form.submit();'"> next »</a>";
else
$pagination.= "<span class='"disabled'"> next »</span>";
$pagination.= "</div>'n";   

从数据库中读取并填充表

当您构建表单时,使用类似的方法来应用SESSION数组中等于1的"已检查"值

echo "<input type='checkbox' name='cbgroup[]' value='$row[0]'";                 
                      if (isset($filtered)) {
                         $uniqueitemschecked = count($filtered);
                            for($i=0; $i < $uniqueitemschecked; $i++)  {
                                if ($row[0] == $filtered[$i]) {
                                   echo " checked ";
                                }
                            }
                      }

当您在While循环中构建HTML表时。。。使用这个。它将在循环后将所有选择ID附加到逗号分隔的文本值中

...
$allcheckboxids = "";
while ($row = $result->fetch_row()) {
$allcheckboxids = $allcheckboxids.$row[0].",";
...
}

循环后,写出隐藏的文本字段

echo "<input type='hidden' name='currentids' value='$allcheckboxids'>";