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