【问题标题】:mysql checkbox values checked using the php loop not working使用php循环检查的mysql复选框值不起作用
【发布时间】:2018-09-09 15:04:10
【问题描述】:

我正在尝试从 mysql 中获取复选框中选中的值。我可以输出检查的值。但我不能让他们选中复选框。我尝试了许多互联网上的方法,但似乎没有一个有效。也许我在这里遗漏了一些东西。帮帮我。

$sql = "SELECT courses.*, enrollments.* 
        FROM enrollments LEFT JOIN courses 
            ON enrollments.courses=courses.course_id 
        WHERE enrollments.enrollment_id = '$id'";
$sql_c = "SELECT * FROM courses";

// query the result
$result = mysqli_query($con, $sql);
$result_c = mysqli_query($con, $sql_c);

// first loop calling using id
while($row = mysqli_fetch_assoc($result)){
    $courses = $row['courses']; // only the selected values

    // Second loop calling all the courses
    while ($rowc = mysqli_fetch_array($result_c)) {
        $courseName = $rowc['course_name']; // all the course names
        $courseId = $rowc['course_id']; // all the course id

        echo "<input type='checkbox' name='courses[]' value='$courseId' id='$courseId' autocomplete='off'>";
        echo "<label for='$courseName'>$courseName</label><br/>";
    } // loop 2
} // loop 1

这是输出

echo $courses;
// 26, 24, 21, 20

echo $courseId." ";
// 18 19 20 21 22 23 24 26 

如何检查这些值。

这就是我要找的东西

┌─────────┬─────────────────┐
│ [check] │ English         │
│ [ ]     │ French          │
│ [ ]     │ Sanskrit        │
│ [check] │ Arts and Crafts │
│ [check] │ History         │
│ [ ]     │ Chemistry       │
└─────────┴─────────────────┘

【问题讨论】:

  • "我尝试了很多来自互联网的方法" 您尝试过的那些方法是什么?在您的问题中显示它们。
  • 您的代码中没有任何内容表明您正在尝试检查复选框。
  • 不清楚您的问题是什么。您是否尝试根据某些条件将checked='checked' 添加到每个input?什么条件?为什么不直接使用三元?你试过什么不起作用?
  • @IncredibleHat 我已经编辑了问题并在最后添加了我想要的内容。

标签: php mysql mysqli while-loop


【解决方案1】:

@Patrick Q - 我确实尝试了很多来自互联网的方法。因为代码很乱,我一直在评论和删除它,我无法在这里发布它。

@Magnus Eriksson 和 @IncredibleHat - 很抱歉造成混乱,下次我会注意的。

@Barmar - 非常感谢。 :)

这是最终的工作代码。我有两个主要问题Normalization 和不使用 FK。因为我测试速度很快,所以我在没有设置 FK 的情况下创建了表格。我能够使用@barmar 方法为一个项目选择一个复选框值。所以我知道我很接近。我删除了所有表并从头开始创建。

互联网上有很多关于为静态下拉列表选择值的答案,但与从另一个表中动态生成的复选框并选择值有关,我找不到。

1.复选框是从另一个表生成的

while($row = mysqli_fetch_assoc($result)){
    $courseName = $row['course_name'];
    $courseId = $row['course_id'];
    echo "<input type='checkbox' name='courses[]' value='$courseId' id='$courseName' autocomplete='off'>";
    echo "<label for='$courseName'>$courseName</label><br/>";
}

2.编辑选中值的复选框

while ($row = mysqli_fetch_assoc($result)) {
    $studentid = $row['studentid'];
    $courseId = $row['courseId'];
    $courseName = $row['courseName'];

    $checked = $studentid == NULL ? "" : "checked='checked'";
    echo "<input type='checkbox' name='courses[]' value='$courseId' id='$courseId' $checked autocomplete='off'>";
    echo "<label for='$courseId'>$courseName</label><br/>";
}

希望这对从动态表中搜索复选框选定值的人有所帮助。

【讨论】:

    【解决方案2】:

    您的内部循环只会在第一次工作。第二次通过外循环时,您将获取第二次查询的所有结果,因此内循环将立即停止。

    不需要两个查询和两个循环。第一个查询返回所有课程。您只需要检查enrollment 表中的列是否被选中。但要使其正常工作,您需要将enrollments.enrollment_id 移动到ON 子句中(请参阅Return default result for IN value regardless)。

    您还需要更改LEFT JOIN 的顺序。既然你想要所有课程,那就应该是courses LEFT JOIN enrollments

    <?php
    $sql = "SELECT courses.*, enrollments.* 
            FROM courses
            LEFT JOIN enrollments 
            ON enrollments.courses=courses.course_id AND enrollments.enrollment_id = '$id'";
    $result = mysqli_query($con, $sql);
    while ($row = mysqli_fetch_assoc($result)) {
        $courseName = $row['course_name'];
        $courseId = $row['course_id'];
        $checked = $row['enrollment_id'] == NULL ? "" : "checked";
        echo "<input type='checkbox' name='courses[]' value='$courseId' id='$courseId' $checked>";
        echo "<label for='$courseName'>$courseName</label><br/>";
    }
    

    【讨论】:

    • 啊!我没有注意到课程。*谢谢。这有什么问题。 SELECT enrollments.enrollment_id, enrollments.courses FROM enrollments LEFT JOIN courses ON enrollments.courses=courses.course_id WHERE enrollments.enrollment_id = 4
    • 阅读我链接的问题,了解为什么它必须在 ON 而不是 WHERE
    • 您的代码没有选择所有 - 测试。它根据课程 ID 进行选择,但我想要基于注册 ID 的内容。 1. 默认情况下所有复选框都是可见的 2. 根据 where 子句检查课程.. 很抱歉造成混淆。
    • 啊,我看到了问题,LEFT JOIN 是向后的。
    • 它可以工作,但只有第一个值被选中。是因为我将数据库中的复选框值保存在单列中吗?这些值在数据库中保存为courses,值为26, 24, 21, 20。其中只有 26 个被选中。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多