【问题标题】:Checkboxes are not updating in the database复选框未在数据库中更新
【发布时间】:2015-06-05 23:27:50
【问题描述】:

我有一个关于数据库和复选框的问题。我有一张看起来像这样的桌子:

网站看起来像:

在页面底部我还有一个按钮,所以当我提交选中的复选框时,数据库中的复选框将更新为 1 或 0。 (对或错)

因此,当我单击受过训练的第三个复选框时,它将使用用户/房间 ID '3583' 更新数据库中受过训练的列。 (ID显示在屏幕右侧)

代码:

<form class='verwerkInfo' method='post' action='<?php echo $_SERVER['PHP_SELF']; ?>?license=6'>
                <td>
                    <?php if($room->trained == 1) { ?> <input type='checkbox' name="<?php echo $room->room_id; ?>" checked> <?php echo "Y"; } else{ ?> <input type='checkbox' name="<?php echo $room->room_id; ?>"> <?php echo "N"; }?> </td>
                <Td><?php if($room->active == 1) { ?> <input type='checkbox' name="<?php echo $room->room_id; ?>" checked> <?php echo "Active"; } else { ?> <input type='checkbox' name="<?php echo $room->room_id; ?>"  <?php echo "Inactive"; } ?>
                </td>

                <Td><?php echo $room->configuration; ?></td>
                <td><?php echo $room->room_id; ?></td>
                <td><?php var_dump($room->user_id); }?></td>
                </tr>

所以我想我的复选框名称有问题。

查询看起来像:

$trainedQuery = "UPDATE room_users
                            SET trained = 1
                            WHERE user_id = $room->user_id";

$room-&gt;user_id 指的是数据库中的 user_id。

【问题讨论】:

  • 在每个复选框中,它的名称总是相同的,房间号。尝试为此添加一些独特的陈述。像“n_{room_id}”和第二个复选框“y_{room_id}”。
  • 你能给我们看看你的html表单吗
  • 我没有 HTML 表单,但是你可以在代码中看到它 ^^ 以
    开头然后复选框仔细看..
  • 复选框名称必须唯一
  • 你是什么意思@NarendraSisodia 你能解释一下吗?

标签: php mysql checkbox pdo mysqli


【解决方案1】:

只需添加 yes、no 和 active 来更改复选框名称属性

  name="yes_<?php echo $room->room_id; ?>"
  name="no_<?php echo $room->room_id; ?>"
  name="act_<?php echo $room->room_id; ?>"

【讨论】:

  • 在代码中更进一步?我试过了,但没有用,你能简单介绍一下吗?我对此感到满意:)
  • 请在提交时告诉我您发送的价值是多少。
  • 你可以检查 if(isset($_POST['yes_']) ) { // 一定要在此处为​​训练的 Yes 条件编写代码 }
【解决方案2】:

这是一种为复选框赋予唯一名称并为每个元素传递额外信息的方法:

name="trained[<?php echo $room->room_id; ?>]" value="<?php echo $room->user_id; ?>"

然后在处理表单提交的 PHP 脚本中,您可以:

foreach ( $_POST['trained'] as $room_id => $user_id ) {
    // This query needs protection from SQL Injection!
    $trainedQuery = "UPDATE room_users SET trained = 1 WHERE user_id = $user_id";
}

目前还不清楚 room_iduser_id 之间的关系是什么,以及为什么您只使用 user_id 更新 room_user。您如何处理 room_id

这是你真正需要的吗:

// This query needs protection from SQL Injection!
$trainedClear = "UPDATE room_users SET trained = 0 WHERE user_id = $user_id";
$db->exec($trainedClear); // first clear all

foreach ( $_POST['trained'] as $room_id => $user_id ) {
    // This query needs protection from SQL Injection!
    $trainedQuery = "UPDATE room_users SET trained = 1 
        WHERE user_id = $user_id AND room_id = $room_id";
    $db->exec($trainedQuery); // then add selections
}
// assuming there's a database connection `$db-exec`.
// Replace with your actual connection and query method.

为清晰起见重构了复选框列:

<?php

$room_id = $room->id;
$room_configuration = $room->configuration;
$room_user_id = $room->user_id;

if ( $room->trained == 1 ) {
    $trained_checked = 'checked';
    $trained_label = 'Y';
}
else {
    $trained_checked = '';
    $trained_label = 'N';
}

if ( $room->active == 1 ) {
    $active_checked = 'checked';
    $active_label = 'Active';
}
else {
    $active_checked = '';
    $active_label = 'Inactive';
}

echo <<<EOT

    <td><input type="checkbox" name="trained[$room_id]" value="$room_user_id" $trained_checked> $trained_label</td>
    <td><input type="checkbox" name="active[$room_id]" value="$room_user_id" $active_checked> $active_label</td>
    <td>$room_configuration</td>
    <td>$room_id</td>
    <td>$room_user_id</td>

EOT;

?>

【讨论】:

  • 这是一个很好的解决方案,但在 foreach 之前,他还应该将所有用户的所有“受过训练”设置为 0。这样他也可以取消支票:-)
  • 您遇到错误了吗?什么是不希望的结果?
  • 这只是重新加载网页,因为我在同一页面中运行了 php 脚本。但是我有更多的 php 脚本,这会不会有问题?数据库未更新
  • 它给了我一个致命错误:调用未定义的方法 db::exec() 错误@bloodyKnuckles
  • 您必须使用自己的数据库连接。我不知道它们是什么,因为你没有把它们放在你的帖子里。
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 2017-12-18
  • 2014-07-09
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2011-11-04
相关资源
最近更新 更多