【问题标题】:PHP Form to delete records in mySQLi when displaying then in a tablePHP表单在表格中显示时删除mySQLi中的记录
【发布时间】:2017-04-26 22:02:26
【问题描述】:

我正在制作一个系统以在表格中显示系统中的页面,其中一列是操作列,让人们可以选择删除页面。我这样做了:

listpages.php

<?php
$sql = "SELECT * FROM Pages";
$result = $conn->query($sql);
if ($result) {
    while($row = $result->fetch_assoc()) {
        $pages[] = array_map('htmlspecialchars', $row);
    }
}
// PHP is finished now, here's the HTML
?>
      <form method="post" action="utils/delpage.php">
      <table>
        <thead>
          <tr>
              <th>Page Name</th>
              <th>Page Type</th>
              <th>Registered on</th>
              <th>Actions</th>
          </tr>
        </thead>
        <tbody>
        <?php foreach($pages as $page):?>
          <tr>
          <input type="hidden" name="targetid" value="<?= $page['id'] ?>"></input>
            <td><?= $page['pagename'] ?></td>
            <td><?= $page['pagetype'] ?></td>
            <td><?= $page['regdate'] ?></td>
            <td><input type="submit" value="delete" class="red-text material-icons tooltipped" data-tooltip="Delete"><td>
          </tr>
        <?php endforeach ?>
        </tbody>
      </table>
      </form>

delpage.php

<?php 

include ('../../php/db.php');


$id = $_POST['targetid'];
$target = htmlentities($id);

$stmt = $conn->prepare("DELETE FROM Pages WHERE id = (?)");
$stmt->bind_param("i", $page);

$page = $target;
$stmt->execute();


?>

这部分有效:我得到了我设置为删除记录的垃圾桶图标。问题是,当我点击它时,它总是会删除最后一条记录,而不是它说要删除的记录。这是一个问题,而不是它应该如何工作。我不明白为什么要这样做,因为 id 正在以与其他信息相同的方式“显示”。我搜索了一个答案,但没有任何效果,我没有看到很多选择,但创建了一个问题。有什么帮助吗?

提前致谢

【问题讨论】:

  • 只需阅读代码@user2860957

标签: php sql mysqli sql-delete delete-row


【解决方案1】:

如果这是一个大表单,那么您将有多个字段都命名为 targetid。这是一个问题,浏览器正在发送最后一个字段的值。试试下面的小表格。通过对它们进行编号,每个表单都可以拥有自己的名称。

从上方移除表单并将其放入循环中。

<?php foreach($pages as $page):
?>
<tr>
<form method="post" action="utils/delpage.php">
    <input type="hidden" name="targetid" value="<?= $page['id'] ?>"></input>
    <td><?= $page['pagename'] ?></td>
    <td><?= $page['pagetype'] ?></td>
    <td><?= $page['regdate'] ?></td>
    <td><input type="submit" value="delete" class="red-text material-icons tooltipped" data-tooltip="Delete"><td>
        </tr>
</form>
<?php endforeach ?>

这是一个简单的输入示例,其中包含相同的名称和 PHP 接收的值:

<form method="post" action="#">
    <input name="a" value="1">
    <input name="a" value="2">
    <button type="submit" value="delete">Always prints second.</button>
</form>

<form method="post" action="#">
    <input name="a" value="1">
    <button type="submit" value="delete">Returns 1</button>
</form>
    <form method="post" action="#">
    <input name="a" value="2">
    <button type="submit" value="delete">Returns 2</button>
</form>


<?php
if (isset($_POST['a'])) {
    echo $_POST['a'];
} else {
    echo 'page loaded';
}

【讨论】:

    【解决方案2】:

    您的delpage.php 有错误,您将错误的变量传递给 sql 查询 id 参数。

    查看bindParam

    试试这个:

    delpage.php

    <?php 
    
        include ('../../php/db.php');
    
        $id = $_POST['targetid'];
        $target = htmlentities($id);
    
        $stmt = $conn->prepare("DELETE FROM Pages WHERE id = :id");
        $stmt->bindParam(":id", $target);
    
        $page = $target;
        $stmt->execute();   
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2019-03-23
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多