使用PHP确认提示删除记录

使用PHP确认提示删除记录,php,html,mysql,pdo,Php,Html,Mysql,Pdo,在从Mysql数据库中删除作者之前,我试图向用户提供确认是/否提示。当用户点击authors.html.php中的Delete时,控制器包含一个confirm.php。php会提示用户确认是或否。如果单击yes按钮,confirm.php将把id传递回控制器,然后控制器将检查是否设置了操作,如果是,则根据id删除作者 不幸的是,作者并没有被删除,所以问题在于是否包含确认提示。如果没有confirm include,脚本工作得非常好,但是我想找出哪里出了问题,而且Javascript太容易使用了

在从Mysql数据库中删除作者之前,我试图向用户提供确认是/否提示。当用户点击authors.html.php中的Delete时,控制器包含一个confirm.php。php会提示用户确认是或否。如果单击yes按钮,confirm.php将把id传递回控制器,然后控制器将检查是否设置了操作,如果是,则根据id删除作者

不幸的是,作者并没有被删除,所以问题在于是否包含确认提示。如果没有confirm include,脚本工作得非常好,但是我想找出哪里出了问题,而且Javascript太容易使用了

谢谢你的帮助

我的控制器:index.php

//inlcude the data connection.
include $_SERVER['DOCUMENT_ROOT'] . '/authors/includes/db.inc.php';

try
{
  $result = $pdo->query('SELECT id, name FROM author'); //Rows of a result set returned by fetch are represented as associative arrays,
}
catch (PDOException $e)
{
  $error = 'Error fetching authors from the database!';
  include 'error.html.php';
  exit();
}

foreach ($result as $row)
{
  $authors[] = array('id' => $row['id'], 'name' => $row['name']);
}

include 'authors.html.php';


if(isset($_POST['action']) and $_POST['action'] == 'Delete') {

include "confirm.php";

  if(isset($_POST['action']) and $_POST['action'] == 'Yes') {

    try {
        $sql = 'DELETE FROM author WHERE id = :id';
        $s = $pdo -> prepare($sql);
        $s->bindValue(':id', $_POST['id']);
        $s->execute();
    }

    catch (PDOException $e) {
        $error = "Error deleting author.";
        include 'error.html.php';
        exit();
    }

    header('Location: .');
    exit();

  }// if yes

} // end if isset delete
然后,authors.html.php显示作者列表:

<?php foreach ($authors as $author): ?><!-- loop through the list of authors pulled from the database by the controller -->
    <li>
      <form action="" method="post">
        <div>
          <?php htmlout($author['name']); ?> <!--display a list of authors and an edit and delete button-->
          <input type="hidden" name="id" value="<?php
              echo $author['id']; ?>">
          <input type="submit" name="action" value="Edit">
          <input type="submit" name="action" value="Delete">
        </div>
      </form>
    </li>
  <?php endforeach; ?>


  • 对不起,我不能在你的帖子中发表评论,只是一个回答(我没有必要的声誉)

    因此,您的逻辑是错误的,请参见:

    if(isset($_POST['action']) and $_POST['action'] == 'Delete') {
    
    include "confirm.php";
    
      if(isset($_POST['action']) and $_POST['action'] == 'Yes') {
    
    $\u POST['action']=='Yes'
    脚本将不会传递到:

    try {
            $sql = 'DELETE FROM author WHERE id = :id';
            $s = $pdo -> prepare($sql);
            $s->bindValue(':id', $_POST['id']);
            $s->execute();
        }
    
    因为
    $\u POST['action']
    不再是'Delete'


    我认为条件
    if(isset($\u POST['action'])和$\u POST['action']='Yes')
    必须在
    if(isset($\u POST['action'])和$\u POST['action']='Delete')
    之外,严格来说,用PHP来说,而不是试图在一个
    action
    文件(MVC中的控制器)中处理所有事情,你应该做的是。。制作第二个表单以发布到其他控制器

    假设您有一个表单/表格,其中包含删除作者的按钮/表单。让该表单/按钮调用名为
    confirm.php
    的文件,并传递该作者的
    id

    在确认页面中,您使用
    yes
    /
    no
    输入呈现确认表单。然后这个
    confirm.php
    将发布到一个
    delete.php
    ,它将检查确认值是否设置在
    $\u GET
    /
    $\u post
    中,并按此操作

    另外,我建议您学习一些非常基本的javascript,并使用
    confirm()
    函数


    另外,我强烈建议您学习一些验证、消毒、转义和关于会话的知识。

    您的确认表是错误的。它应该是
    $\u POST['id']
    ,因此您捕获被选择删除的作者的id,而不是
    $author['id']
    ,后者是作者列表中最后一个输出的作者。嗯,我真的不明白这是怎么回事。。。您知道您只能通过php在浏览器中显示的页面的完全重新加载中包含这样的确认脚本吗?这听起来很不直观。如果在两个步骤之间必须咨询服务器,那么基于纯客户端逻辑(javascript)或ajax调用(也基于javascript)实现确认步骤是否更有意义?标记B,当将隐藏字段的值更改为$_POST['id']时,它仍然不起作用。arkascha,是的,我在我的帖子中明确表示JS或Ajax可以解决这个问题,但我仍然想从纯学习的角度找出哪里出了问题。我已经看到你因为提出问题和渴望学习而受到惩罚-难道你没有试过这样做:
    $sql='DELETE FROM author WHERE id='.$\u POST[id]
    $sql=“DELETE FROM author WHERE id=$\u POST[id]”
    。我想你的意思是
    $\u POST[id]
    ,而不是
    id
    。如果在php中使用单个引号中的变量名,它们将不会被解释为变量。因此,我使用了
    运算符将变量与字符串连接起来。另一个选项是使用双引号解释变量(不确定双引号作为查询传递时是否有效)。只是一个建议。不过我不确定。“如果我错了,请有人纠正我。请!”感谢您的回答,Lucas,但是当您在确认页面中将名称和值更改为“是”时,并检查控制器中是否(isset($\u POST['yes']),因此避免冲突,它仍然不起作用。如果是条件仍在删除范围内,您可能还需要将
    以confirm.php的形式放置。因为,无论如何,你错过了动作==删除(对不起,我的英语)卢卡斯你的建议非常有用。感谢您的帮助Hi Mohd,发布到一个单独的delete.php解决了这个问题。谢谢:)
    try {
            $sql = 'DELETE FROM author WHERE id = :id';
            $s = $pdo -> prepare($sql);
            $s->bindValue(':id', $_POST['id']);
            $s->execute();
        }