表单操作不允许删除记录


Form action not allowing the delete of a record

我必须添加一个form操作才能转到另一个页面来编辑特定的记录,但这样做不会允许我删除记录,因为它会在执行query之前将我从记录中带走。当我点击"编辑"按钮时,我不确定如何做到这一点,并且仍然可以进入新页面。

<table id="tableid">
        <thead>
            <tr>
                <th>ID</th>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Product</th>
                <th>Save</th>
                <th>Delete</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
        <?php
        $stmt = $dbc->query("SELECT `id`,`first`,`last`,`product` FROM users");
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        while($row = $stmt->fetch()) {
        ?>
        <form method="POST" action="edit-product">
            <tr>
                <td><?php echo $row['id'];?>"</td>
                <td><?php echo $row['first'];?></td>
                <td><?php echo $row['last'];?></td>
                <td><?php echo $row['product'];?></td>
                <input name="id" type="hidden" value="<?php echo $row['id'];?>" readonly>
                <input name="first" type="hidden" value="<?php echo $row['first'];?>">
                <input name="last" type="hidden" value="<?php echo $row['last'];?>">
                <input name="product" type="hidden" value="<?php echo $row['product'];?>">
                <td><input name="save" type="submit" value="Save"></td>
                <td><div class="delete-class" name="delete" id="<?php echo $row['id']; ?>">Delete</div></td>
                <td><input name="edit" type="submit" value="Edit"></td>
            </tr>
        </form>
        <?php } ?>
        </tbody>
    </table>

PHP DELETE query

if(isset($_POST['delete'])) {
    $id = $_POST['id'];
    $stmt = $dbc->prepare("DELETE FROM users WHERE id = :id");
    $stmt->bindParam(':id', $id);
    $stmt->execute();
}

如何更改标记,以便仍然可以编辑(带操作转到另一个页面)和删除该页面?

更新AJAX代码:

$(function() {
    $(".delete_class").click(function(){
   var del_id = $(this).attr('id');
   $.ajax({
      type:'POST',
      url:'delete-product.php',
      data:'delete_id='+del_id,
      success:function(data) {
        if(data) {   // DO SOMETHING
        } else { // DO SOMETHING }
      }
)); //here
 });
});

这不是很理想,但却是一种方法。您可以更改HTML标记以创建两个表单,一个用于编辑大小写,另一个用于删除。删除案例将请求发送到当前页面,如下所示:

while($row = $stmt->fetch()) {
?>
    <tr>
        <td><?php echo $row['id'];?></td>
        <td><?php echo $row['first'];?></td>
        <td><?php echo $row['last'];?></td>
        <td><?php echo $row['product'];?></td>
        <td>
            <form method="post" action="edit-product">
                <input name="id" type="hidden" value="<?php echo $row['id'];?>">
                <input name="first" type="hidden" value="<?php echo $row['first'];?>">
                <input name="last" type="hidden" value="<?php echo $row['last'];?>">
                <input name="product" type="hidden" value="<?php echo $row['product'];?>">
                <input name="save" type="submit" value="Edit">
            </form>
        </td>
        <td>
            <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
                <input name="id" type="hidden" value="<?php echo $row['id'];?>">   
                <input name="delete" type="submit" value="Delete">
            </form>
        </td>
    </tr>
<?php } 
?>
    </tbody>
</table>
<?php
// the delete code goes here
if(isset($_POST['delete'])) {
    $id = $_POST['id'];
    $stmt = $dbc->prepare("DELETE FROM users WHERE id = :id");
    $stmt->bindParam(':id', $id);
    $stmt->execute();
}
?>

我省略了保存案例,但它将类似于编辑案例。

与其有一个表单,不如只有链接而不是表单提交按钮。这样,每个链接都可以将您带到执行特定任务的特定页面。通过传递查询字符串变量并使用$_GET而不是$_POST,可以保留产品ID信息。

示例:

<td><a href="save_product.php?id=<?php echo $row['id'];?>">Save</a></td>
<td><a href="delete_product.php?id=<?php echo $row['id'];?>">Delete</a></td>
<td><a href="edit_product.php?id=<?php echo $row['id'];?>">Edit</a></td>

然后,这些单独的页面可以在数据库中执行您的任务。保存和删除都可以使用Header重定向返回到带有产品列表的原始页面。

delete_product.php示例:

// delete product from database
    $id = $_GET['id']; // Note that it's a $_GET
    $stmt = $dbc->prepare("DELETE FROM users WHERE id = :id");
    $stmt->bindParam(':id', $id);
    $stmt->execute();
// re-direct to original list page
    header("Location: product_list.php"); // or whatever you have your list page named.

然后,edit_product.php页面将具有对特定产品进行更改的典型表单。您将需要使用$_GET['id']值在数据库中再次查找产品以匹配它。

正如评论中所建议的那样,使用AJAX将使整个过程看起来无缝,而不是在页面之间跳转并重新定向。