【问题标题】:Checkbox only updating last row in database复选框仅更新数据库中的最后一行
【发布时间】:2015-09-26 07:49:17
【问题描述】:

我似乎无法让我的复选框仅更新选中的复选框。现在,当我选中任何框并单击提交时,它会将最后一行标记为 1(即使未选中该行)。为了发布到同一页面并更新任何已选中的框,我在这里遗漏了什么?

while($row = mysql_fetch_array( $result )) {

$addr = $row['address'];
$info = $row['info'];
$date = $row['date'];
$status = $row['status'];
$id = $row['id'];

?>
<tr>
    <td><?php echo $id; ?></td>
    <td><?php echo $addr; ?></td>
    <td><?php echo $info; ?></td> 
    <td><?php echo $date; ?></td>
    <td><?php echo $status; ?></td>
    <td><input type="checkbox" name="handled" value="1"><br></td>
</tr>

<?php
}
?>


</table>

<?php
  if (isset($_POST['checked'])) {
    echo "Posted!";
    $sql2 = "UPDATE requests SET status = 1 WHERE id = '".$id."'";
    mysql_query($sql2) or die(mysql_error());
  }

?>

<br>
<form action="" method="post">
<input name="checked" type="submit"/>

【问题讨论】:

标签: php mysql checkbox


【解决方案1】:

您的代码容易受到 sql 注入的影响。使用 mysqli 或 PDO

在 php 中更新代码的特定部分,并将复选框放入表单中。

<?php
  if (isset($_POST)) {
    echo "Posted!";
    //uncomment print_r for debugging
    //print_r($_POST);
    if(isset($_POST['handled'])=='on')
    {
        echo "checkbox is checked for ".$id." so update the status for id";
        $sql2 = "UPDATE requests SET status = 1 WHERE id = '".$id."'";
        //do querying here
    }
    else
    {
        echo "checkbox is not checked for ".$id;
    }

  }

?>

和这样的形式

<form action="" method="post">
<!-- put checkbox inside the form -->
<input type="checkbox" name="handled"/>
<input name="checked" type="submit"/>

[编辑]

关于复选框,您必须了解的一件事是未选中的复选框甚至不会发布。可以说,如果您有一个没有值的文本框,则在提交时将发布空文本框,但是如果复选框未标记复选框,则该帖子甚至会忽略/避免空值,在这种情况下将其视为非现有元素。不会发布任何内容,甚至不会发布空值。为了克服这个问题,使用带有复选框的隐藏字段自动提交值,其中的复选框值通过 javascript onchange 是否选中复选框进行操作。

【讨论】:

  • Posted!Array ( [checked] => Submit [address] => [info] => ) 复选框未选中 12 12 是行中的最后一个 id,我没有选中该框虽然
  • 我不清楚..你的意思是,如果 row['status'] 等于 1 是否意味着应在加载时检查复选框?
  • @TaylorReed 改进了我的答案,请阅读 EDITED 部分。我认为这可能会对你有所帮助:)
【解决方案2】:

您需要将行的 id 放在复选框中,以便 php 在您选中复选框并提交表单时知道要更新哪些行。另外,将名称从handled 更改为handled[],以便php 知道它是一个id 数组。

<input type="checkbox" name="handled[]" value="<?= $id ?>">

然后在你的帖子中

<?php
  if (isset($_POST['checked'])) {
    $ids = implode(',',$_POST['handled']);
    $sql2 = "UPDATE requests SET status = 1 WHERE id IN ($ids)";
    // if you also want to update when boxes are unchecked,
    // then run the following query instead
    // UPDATE requests SET status = id IN ($ids)
    // id in ($ids) will evaluate to either a 0 or 1 in mysql
    mysql_query($sql2) or die(mysql_error());
  }
?>

注意:上面的代码容易受到 SQL 注入的影响,在运行查询之前,您应该确保 $ids 实际上由数字组成。此外,mysql_ 函数已被弃用,您不应再使用它们(切换到 mysqli_PDO)。

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2015-09-18
    • 1970-01-01
    • 2016-07-27
    • 2018-05-28
    • 2014-07-09
    • 2016-05-16
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多