如何显示来自PHP数据库的复选框?

时间:2019-06-28 15:38:48

标签: php mysql database checkbox html-table

我要显示选中的复选框,这些复选框作为值存储在mysql数据库中。

现在,该表将正在检查的复选框的值存储在数据库中。标题和第一列是从数据库中的三个不同表中获取的。而选中的复选框的值将保存在同一张表中。

这是用于插入数据的代码。

$active = "CourseReport";
require_once 'pages/header.php';
require_once './functions/schema-functions.php';
require_once './functions/report-functions.php';
$course = Schema::getCourseReport();
$objective = Schema::getObjective();
$goals = Schema::getGoals();
$mainobj = Schema::getMainObjectives();
$subobj = Schema::getSubObjectives();
 ?>

<form id="addReport" action ='./functions/report-functions.php' method="post">

<table id="table1" class="table table-hover">

    <thead>
    <?php
    echo '<tr><th>Goals</th>';
    for ($i = 0; $i < count($course); $i++) {
        echo '<th id = "rotate1">'. $course[$i]->commonName . '</th>';            
    }
    echo '</tr>';   
    ?>
    </thead>
        <tbody>

    <?php
    for ($y = 0; $y < count($goals); $y++) {           
        echo '<tr class="clickable"><th class="toggle">Goal#'.$goals[$y]['GoalId'].':'." " .' '.$goals[$y]['Goals'].'</th>

        </tr>';           
   ?>

    <?php
    for( $z = 0; $z < count($mainobj); $z++){
  if($mainobj[$z]['GoalId'] == $goals[$y]['GoalId']) {
        echo '<tr class="expander"><th class=row-header>Objective#'.$mainobj[$z]['MainObjId'].':'." ".' '.$mainobj[$z]['MainObjectives'].'</th>

    </tr>';
     ?>

    <?php

    for ($j = 0; $j< count($subobj); $j++) {
       if($mainobj[$z]['MainObjId'] == $subobj[$j]['MainObjId']){
       echo '<tr class="expander"><td class=row-header>'.$subobj[$j]['SubObjId'].' ) '.$subobj[$j]['SubObjectives'].' </td>';

   for ($x = 0; $x < count($course); $x++) {
      echo "<td><input name='check[]' type=checkbox value=c".$course[$x]->courseId."-o".$subobj[$j]['SubObjId']." id=checked></td>";
        }
        echo '</tr>';
    }
   }
  }
 }
}       
    ?>       
        </tbody>       
</table>
<button class="button" name= "submit" value= "Submit">Submit</button>

</form>

report-functions.php

if( isset( $_POST['submit'], $_POST['check'] ) ){
    try{
      require_once 'db-connect.php';
        $conn = DatabaseConnection::getConnection();
       $sql= " insert into `Report`  (`ColRow`) values (:value) ";
        $stmt = $conn->prepare( $sql );
       if( $stmt ){
         $conn->beginTransaction();
           foreach( $_POST['check'] as $index => $value ) {
               $result = $stmt->execute( [ ':value' => $value ] );
                if( !$result ) {
                   echo '
        <script>
           alert("Error, please try submitting again. Error code 1");
           window.history.back();
        </script>';
                }
            }
            $conn->commit();
          echo '<script>
            alert("Report was submitted successfully.");
            window.location = ".../";
        </script>';
      }
    } catch( Exception $e ){
       $conn->rollback();
        exit( $e->getMessage() );
    }

我希望一旦提交表格,该表格应使用选中的复选框加载同一张表格。我应该能够进行更改并一遍又一遍地提交表格。

如果需要提供其他信息,请发表评论。

1 个答案:

答案 0 :(得分:1)

显示页面时(在代码的第一部分中),您有时会这样做:

echo "<td><input name='check[]' type=checkbox value=c".$course[$x]->courseId."-o".$subobj[$j]['SubObjId']." id=checked></td>";

该值设置为:

value=c"c.$course[$x]->courseId."-o".$subobj[$j]['SubObjId']";

此值是您在注释中提到的选中或未选中值的地方(例如c1-o1.1)。

对。因此,在执行该echo之前,请添加一个新的if条件。

$value = "c$course[$x]->courseId" . "-o$subobj[$j]['SubObjId']";
if (verify_checked($value)) {
    $checked_code = "checked=\"checked\"";
}
else {
    $checked_code = "";
}
echo "<td><input name='check[]' type=checkbox value=$value id=checked $checked_code ></td>";

verify_checked(value)函数可以做到(据我对数据库的了解,您保留了选中元素的“网格位置”):

function verify_checked($value)
{
    // Connect to the database if needed
    // Perform: SELECT count($value) FROM Report
    // If the result is >0, return TRUE
    // Else return FALSE
}
  • 这里的想法是在您每次要回显<input>元素时查询数据库。
  • 有关串联文本的说明,我发现在.周围放置空格以清楚地分割文本的一部分和串联点是更容易理解的。
  • 如前所述,缩进对于理解不同上下文至关重要。在缩进您的代码之前,我还没有意识到不同的循环相对于其他循环是如何工作的。