【问题标题】:PHP / AJAX checkbox valuesPHP / AJAX 复选框值
【发布时间】:2017-07-15 10:15:59
【问题描述】:

我正在尝试获取所有选中的复选框值并使用 AJAX 将它们解析为我的 php 函数。

我使用 foreach 来尝试获取选中复选框的每个 id。

我的问题是,当我尝试更新数据库时,它不会返回“1”,我会在成功时回显。

当我取出我的 foreach 代码时,它可以工作。

我的删除按钮是:

<form class="form -dark" id="form-inline" method="POST">
    <div class="btn-group">
        <button type="button" onclick="deleteSelectedTokens()" class="btn -dark" style="margin-left: 5px;" title="Delete all selected tokens"><i class="fa fa-trash"> </i></a>
    </div>
</form>

我的复选框 html/php 代码是:

<table class="table -dark -striped">
<thead>
    <tr>
        <th style="text-align: center;"><input type="checkbox" id="selectall"/></th>
        <th style="text-align: center;">Token</th>
        <th style="text-align: center;">Date/Time Generated</th>
        <th style="text-align: center;">Status</th>
        <th style="text-align: center;">Durbaility</th>
    </tr>
</thead>
   <tbody>
      <tr>
        <?php

        $username = $_SESSION['username'];
        $token_result = mysqli_query($con, "SELECT id, token, used, time_generated, durability FROM tokens WHERE user_id = '$username' ORDER BY used");
        if(mysqli_num_rows($token_result) > 0) {
            while($token_row = mysqli_fetch_array($token_result)) {

            $result = array($token_row['durability']); $sub_struct_month = ($result[0] / 30) ; $sub_struct_month = floor($sub_struct_month); $sub_struct_days = ($result[0] % 30); $sub_struct = "<i>".$sub_struct_month."</i> month(s) <i>".$sub_struct_days."</i> day(s)";

            echo '                  
            <tr style="text-align: center;">
            <td>
            <center><input type="checkbox" id="checkedTokens" class="checkbox" value='.($token_row['id']).'></center>
            </td>
            <td>
            '.$token_row['token'].'
            </td>
            <td>
            '.($token_row['time_generated']).'
            </td>
            <td>
            '.($token_row['used'] == "0" ? "<span class='label label-primary'><i class='fa fa-check'></i> Valid </span>" : "<span class='label label-primary'><i class='fa fa-fa fa-times'></i> Used </span>").'
            </td>
            <td>
            '.$sub_struct.'
            </td>
            ';
             } }else{ ?>

             <tr>
             <td colspan="12" style="padding: 30px;">
             <div class="alert -dark">
                <div class="alert-icon _text-danger">
                    <i class="fa fa-exclamation-circle"></i>
                </div>
                No tokens in your account
            </div>
            </td>
            </tr>

            <?php } ?>
      </tr>
   </tbody>

请注意,我需要使用 foreach 来获取每个复选框的值,以便在按下删除按钮时删除选定的复选框。

我的 AJAX 发送到 PHP 函数是:

<script>
function deleteSelectedTokens() {
  var selectedTokens = document.getElementById("checkedTokens").value;

  $.ajax({
      type: "POST",
      url: "includes/form_submit.php",
      data: {
        deleteSelectedTkns: true,
        checked_id: selectedTokens
      },
      success: function(msg){
        if(msg == 1) {
          update_myDays_success();
        } else {
          general_error_forms();
        }
      },
  });
return false;
}
</script>

我认为问题出在 Javascript...当我获取复选框的值并发布它们时,我认为它只会在 checkedTokens id 中获得 1 个值。

我的 php 接收代码(这不是问题):

$username       = $_SESSION['username'];
$selectedTokens = mysqli_real_escape_string($con, $_POST['checked_id']);
foreach($selectedTokens as $id) {
    $doUpdateDelete = 'DELETE FROM tokens WHERE id = "'.$id.'" AND user_id = "'.$username.'"';
    $result = $con->query($doUpdateDelete) or die("Error");
    if($result)
    {
        echo '1';
    }
    else
    {
        echo 'Failed';
    }
}

我的 console.log 没有错误。就像我说的那样,我认为这是获取复选框值的 javascript 代码并没有获取所有值。

【问题讨论】:

  • 您将 id 重复到多个复选框,这不是您获取所有复选框值的方式,请具体说明您的 ids,即它们不应该对所有元素都相同。跨度>
  • @FarrukhAyyaz 不,我使用数据库中每一行的 ID 作为每个文本框的值。
  • 在您的代码中,复选框 ID、您在 javascript 中的分配和使用与每个复选框相同。它不是您的表格 ID。

标签: javascript php jquery


【解决方案1】:

您可以发送已检查项目的 json:

<script>
    var selectedTokens = []; 
    $('#checkedTokens:checked').each(function(key, value){
        selectedTokens.push($(value).val());
    });
    $.ajax({
        type: "POST",
        url: "includes/form_submit.php",
        data: {
           deleteSelectedTkns: true,
           checked_id: JSON.stringify(selectedTokens)
    },
    success: function(msg){
      if(msg == 1) {
        update_myDays_success();
      } else {
        general_error_forms();
      }
    },
  });
  </script>

而你的 php 代码 mysqli_real_escape_string 只给出我们应该将 json 转换为数组的字符串:

$selectedTokens = json_decode($_POST['checked_id']); 
foreach($selectedTokens as $id) {
    $doUpdateDelete = 'DELETE FROM tokens WHERE id = "'.$id.'" AND user_id = "'.$username.'"';
    $result = $con->query($doUpdateDelete) or die("Error");
    if($result)
    {
        echo '1';
    }
    else
    {
        echo 'Failed';
    } 
}

【讨论】:

  • 哇。它工作得很好!你怎么知道这会起作用?你能解释一下它为什么起作用吗?
  • 当你在客户端和服务器之间发送数据发送时,使用JSON或XML。你得到检查项目的价值。并转换为 json。在服务器上你得到 json 并转换为对象。
【解决方案2】:

在 html 中,不允许将相同的 id 分配给多个标签。 (正如 cmets 中已经提到的那样。)

如果您将复选框放在&lt;form id="some_id"&gt; 上,并为每个复选框指定唯一的名称和 ID,则可以使用函数 $('#some_id').serialize() 获取表单的数据并将其发布到服务器。

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多