【问题标题】:PHP how to generate a unique name for a button create on while loop for each rowPHP如何为在while循环上为每一行创建的按钮生成唯一名称
【发布时间】:2020-03-21 21:49:04
【问题描述】:

我创建了一个 while 循环,它将调用数据库中的数据,并且每一行都会带有一个按钮,但是当我单击一个按钮进行更新时,它会更新所有行。我做了一些研究,但是增量解决方案似乎对我的报价没有任何影响。

<form action="registered.php" method="GET">
  <?php
      $sql = "SELECT id, First_name, Last_name, email, Country, paid FROM users";
      $result = $conn->query($sql);
      if ($result->num_rows > 0) {
          while($row = $result->fetch_assoc()) {
              $i = 0;
              $id = $row['id'];
              ?>
              <tr>
                    <td>
                      <a href="basic_table.html#"><?= $row['First_name'];?></a>
                    </td>
                    <td class="hidden-phone"><?= $row['Last_name'];?></td>
                    <td><?= $row['email'];?></td>
                    <td><?= $row['Country'];?></td>
                    <td><span class="label label-info label-mini"><?= $row['paid'];?></span></td>
                    <td>
                      <button class="btn btn-success btn-xs auth" name="$i"><i class="fa fa-check" title="Authorize Access"></i></button>
                      <button class="btn btn-primary btn-xs" name="$id"><i class="fa fa-times" title="Remove Access"></i></button>
                      <button class="btn btn-danger btn-xs" name="$id"><i class="fa fa-trash-o " title="Delete user"></i></button>
                    </td>
                  </tr>
                  <?php 
                  if (isset($_POST['$i'])) {
                    $sql = "UPDATE users SET paid = 'ads' WHERE id = '$id'";
                    $update = $conn->query($sql);
                  }
                  $i++;
          }
      } else {
          echo "0 results";
      }
      $conn->close();
  ?>
  </form>

【问题讨论】:

  • 首先将name="$i" 更改为` name="= $i ?>"`
  • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • 按钮也存在潜在问题,如果我正确理解您的代码,每个用户都有 3 个按钮,但它们在输出 HTML 中的名称都相同。跨度>
  • 我知道 font-awesome 告诉你使用 i 标记他们的东西,但不要。它在语义上是不正确的 HTML,可能会欺骗某些屏幕阅读器。 span 是一个不太糟糕的选择。
  • 这就是为什么我在执行 while 循环时使用 $i 为每个按钮创建不同的名称,但它没有

标签: php html forms


【解决方案1】:

您可以给每个按钮一个值。我还建议给它们起不同的名称和比 $i 更好的名称(这是否意味着是 PHP 变量?)。

附注:

  • 您的代码易受 SQL 注入攻击。我的示例使用带有参数绑定的准备好的语句。
  • 不要混合使用 HTML 和 PHP。我故意将第一个查询分开。您应该在开始输出 HTML 之前执行 PHP 代码。
  • 我在&lt;td&gt; 旁边移动了&lt;form&gt;。您可以将&lt;form&gt; 作为&lt;table&gt; 的孩子。但是,在您的情况下,完全摆脱表单并使用链接可能会更好,除非您打算使用 POST 方法。
<?php
$users = $conn->query('SELECT id, First_name, Last_name, email, Country, paid FROM users')->fetch_all(MYSQLI_ASSOC);
?>
<?php foreach ($users as $row): ?>
<tr>
    <td>
        <a href="basic_table.html#"><?= $row['First_name']; ?></a>
    </td>
    <td class="hidden-phone"><?= $row['Last_name']; ?></td>
    <td><?= $row['email']; ?></td>
    <td><?= $row['Country']; ?></td>
    <td><span class="label label-info label-mini"><?= $row['paid']; ?></span></td>
    <td>
        <form action="registered.php" method="GET">
            <button class="btn btn-success btn-xs auth" name="myButton" value="<?= $row['id']; ?>"><span class="fa fa-check"
                    title="Authorize Access"></span></button>
            <button class="btn btn-primary btn-xs" name="removeAccess"><span class="fa fa-times" title="Remove Access"></span></button>
            <button class="btn btn-danger btn-xs" name="deleteUser"><span class="fa fa-trash-o " title="Delete user"></span></button>
        </form>
    </td>
</tr>
<?php endforeach; ?>

然后在您的registered.php中您可以根据收到的值执行UPDATE查询。

<?php
include 'mysqli.php';

if (isset($_GET['myButtton'])) {
    $stmt = $conn->prepare("UPDATE users SET paid='ads' WHERE id=?");
    $stmt->bind_param('s', $_GET['myButton']);
    $stmt->execute();
}

【讨论】:

  • 您好,抱歉,我需要使用 post 方法,因为按钮必须为每一行更新数据库
  • 没问题,只需更改method="GET" 并使用$_POST[] 而不是$_GET[]
  • 我刚刚做了但是它没有更新到数据库,基本上什么也没发生。
  • 你做了什么调试。您是否启用了 mysqli 错误报告? How to get the error message in MySQLi?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2022-08-19
  • 2020-05-25
  • 2013-01-31
相关资源
最近更新 更多