【问题标题】:PHP Form Loop Passing Variables to $_POST When Input Names Aren't Static当输入名称不是静态时,PHP 表单循环将变量传递给 $_POST
【发布时间】:2021-08-17 15:46:59
【问题描述】:

在下面的表格中,我正在创建一个循环,但我需要唯一的输入名称。名称“api_key”和名称“delete_button”需要类似于“api_key_0”“api_key_1”等以及delete_button_1、delete_button_2等。如何在循环中获得唯一名称?第二部分:如何在 $_POST 中获取在循环中创建的正确输入名称的变量?对于每个删除按钮和 api 键,我需要将正确的变量名称传递给 $_POST。

<?php // Delete API code. 
        if(isset($_POST['delete_button'])) {
            $delete_api_key = $_POST['api_key'];
            if ($mysqli->query("DELETE FROM api_keys WHERE api_key = '$delete_api_key'")) {
             echo "API Key Successfully Deleted.";      
            }
             else {
                echo "Error:" . $mysqli->error;
                    }
            }
    ?>

表单部分:

<?php
if ($api_cnt >= 1) {

    $list_api_keys = $mysqli->query("SELECT api_key, user FROM api_keys WHERE user = 'testuser'");
?>


<form method= "post" action ="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<table>
<tr>
<th>API Keys</th>
</tr>
<?php
    while($row = mysqli_fetch_row($list_api_keys)) {

?>
<tr>
<td><input name = "api_key" type = "hidden" value="<?php echo $row[0]; ?>"><?php echo $row[0]; ?></td> 
<td><input type = "submit" name = "delete_button"  value = "Delete"></td>
</tr>
<?php
    }
?>
</form>
</table>
<?php
$mysqli->close();
}
?>

【问题讨论】:

  • 如果您当时只发送一对,更简单的解决方案是创建不同的表单(每个表格行一个)。然后只会发送相关的输入,并且总是具有相同的名称。

标签: php forms loops while-loop


【解决方案1】:

要这样做,您确实需要多个表单,每个表单都有自己的数据和提交按钮。只能提交一份。我省略了一些 HTML 以保持简短:

<?php while($row = mysqli_fetch_row($list_api_keys)) { ?>
<form method= "post" action ="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<table>
<tr>
<td><input name = "api_key" type = "hidden" value="<?php echo $row[0]; ?>"></td> 
<td><input type = "submit" name = "delete_button"  value = "Delete"></td>
</tr>
</table>
</form>
<?php } ?>

那么就拿吧,因为只有一个提交了:

if(isset($_POST['delete_button'])) {
    $delete_api_key = $_POST['api_key'];
}

或者你可以做一个表单并将提交按钮分配为一个数组,其中 id 作为键:

<form method= "post" action ="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<table>
<?php while($row = mysqli_fetch_row($list_api_keys)) { ?>
<tr>
<td><input type = "submit" name = "delete_button[<?php echo $row[0]; ?>]"  value = "Delete"></td>
</tr>
<?php } ?>
</table>
</form>

那么只要拿到钥匙:

if(isset($_POST['delete_button'])) {
    $delete_api_key = key($_POST['delete_button']);
}

【讨论】:

    【解决方案2】:

    还有比这更优雅的方法 - 例如,为每个方法提供复选标记并有一个删除按钮,或者使用 ajax,但使用您开始的方法,我建议每次迭代使用单独的表单标签。

    <?php
      while($row = mysqli_fetch_row($list_api_keys)) {
    ?>
    <tr>
    <form method='post' action='deleteme.php'>
    <td><input name="api_key" type="hidden" value="<?php echo $row[0]; ?>"><?php echo $row[0]; ?></td> 
    <td><input type="submit" value="Delete"></td>
    </tr>
    </form>
    <?php
        }
    ?>
    

    这是一个 ajax 方法 首先,确保周围的表单标签阻止提交:

    <form onsubmit='return false'>
    

    然后

    <?php
      while($row = mysqli_fetch_row($list_api_keys)) {
    ?>
    <tr data-key="<?php echo $row[0]; ?>">
    <td><?php echo $row[0]; ?></td> 
    <td><button onclick='del(this);' > Delete</button></td>
    </tr>
    <?php
        }
    ?>
    

    配合脚本方便ajax及后续行删除:

    function del(el) {
    let key = $(el).closest('tr').attr('data-key');
    $.ajax({
      url: "delete.php",
      method: 'post',
      data: { api_key: key}
    }).done(function(response) {
      if (response.indexOf('Error:') === -1)  $(el).closest('tr').remove();
      else alert("There was an error - " + response);
    });
    }
    

    在您的 PHP 中,使用准备好的语句来保护您自己和您的数据

    $stmt = $mysqli->prepare("DELETE FROM api_keys WHERE api_key = ? LIMIT 1");
    $stmt->bind_param("s", $_POST['api_key']);
    $deleted = $stmt->execute();
    
    if ($deleted) {
      echo "API Key Successfully Deleted.";      
    }
    

    【讨论】:

      【解决方案3】:

      如果您当时只发送一对,更简单的解决方案是创建不同的表单(每个表格行一个)。然后只会发送相关的输入,并且总是具有相同的名称。

      <?php while($row = mysqli_fetch_row($list_api_keys)): ?>
          <tr>
          <td>
              <form method="post" action="">
                  <input name="api_key" type="hidden" value="<?= $row[0]; ?>" /><?php echo $row[0]; ?>
          </td>
          <td>
                  <input type="submit" name="delete_button" value="Delete" />
              </form>
          </td>
          </tr>
      <?php endwhile ?>
      

      旁注: 将表单中的action 留空将使表单提交到当前页面,因此与添加htmlspecialchars($_SERVER["PHP_SELF"]) 相同。在&lt;table&gt;&lt;tr&gt; 之间添加表单标签也会生成无效的HTML(在&lt;tr&gt;&lt;td&gt; 之间添加它也是如此),这就是我将它添加到&lt;td&gt; 中的原因。

      您可以在tabletr 的“允许内容”下阅读更多相关信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多