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

时间:2012-01-12 12:26:58

标签: 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使用所需的“人员”。 / p>

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

3 个答案:

答案 0 :(得分:0)

在复选框标签中使用三元操作,在他内部没有foreach:

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

因为输入已经在'for'循环内部,所以每次循环都会创建一个新的复选框,它将验证是否需要进行检查。

我希望我能帮到你。

答案 1 :(得分:0)

解决这个问题的几种方法:

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

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

(AJAX):向复选框添加事件侦听器,以便在选中按钮时,将异步调用返回到PHP脚本,并相应地更新$ _SESSION变量。同样,这个取决于你对JavaScript的舒适程度。

请记住,PHP = ServerSide&amp; JavaScript = ClientSide。虽然你可以一起破解一些PHP来处理“客户端”的东西,但它通常是丑陋和令人费解的......

答案 2 :(得分:0)

我没有碰到数据库就做到了......

复选框字段是一个php集合“cbgroup []”。 然后我创建了一个隐藏文本框,其中的所有值都等于镜像复选框的可选项的主键。这样,我可以遍历当前页面上的假复选框,并取消选中仅当前页面上存在的ID复选框。如果用户搜索项目并且表格发生变化,则可选项目仍然存在! (直到他们破坏会议)

我发布了分页而不是GET。

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

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

在他们翻阅所有项目并做出最终选择之后,我将他们的最终选择发布到数据库。这样,他们可以冒险到其他页面,甚至可能在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数组中的当前复选框,现在让我们写一下用户选择的内容,因为它们可以选择UNselected,或者全部。 检查选中了哪个复选框

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集合并读取\ write到材料表(或其他)并通过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";   

从您的数据库中读取并填充您的表格

构建表单时,使用类似这样的东西来应用它的“checked”值等于SESSION数组中的一个

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'>";