我查找了多种删除PDO中指定行的方法,我是学习PHP / PDO的初学者。我最初使用的是Mysql_query等,但我现在被告知使用它是不好的做法。我有一个脚本,当按下删除按钮时,按ID删除新闻帖子。我把它从最初的MySQL代码转换为PDO,但是这样做我害怕我误读了一些东西而搞砸了。我只是想知道这是否是一种“安全”方法,或者我是否应该使用MySQLI等。
下面是我的脚本,如果你可以帮助我让它工作那将是很好的,但我更感兴趣的是在PHP / PDO中删除行的正确和正确的方法。
<?php
$dbh = connectDb();
if( isset($_POST['delete']) )
{
if( isset( $_POST['id'] ) && is_numeric( $_POST['id'] ) && $_POST['id'] > 0 )
{
$id = $_POST['id'];
$stmt = $dbh->prepare( "DELETE FROM stats WHERE id =:id" );
$stmt->bindParam(':id', $id);
$stmt->execute();
}
else
{
echo "Invalid ID";
}
}
$stmt = $dbh->query('SELECT * FROM news ORDER BY id ASC');
while($stmt = $rows->fetch(PDO::FETCH_ASSOC)) {
echo <<<_END
<pre>
Id: {$rows['id']}
Title: {$rows['title']}
Body: {$rows['body']}
Date: {$rows['date']}
</pre>
<form action="rmposts.php" method="post">
<input type="hidden" name="delete" value="yes" />
<input type="hidden" name="id" value="{$rows['id']}" />
<input type="submit" name="delete" value="DELETE NEWS" /></form>
_END;
}
?>
答案 0 :(得分:3)
您似乎没有正确设置$id
变量。您必须了解php脚本在$_POST
变量中接收所有表单值(包括要删除的id):重新加载脚本时,不会保留以前加载的任何其他值。
因此,您必须检查$_POST['id']
并将其值分配给$id
变量:
$dbh = connectDb();
if( isset($_POST['delete']) )
{
if( isset( $_POST['id'] ) && is_numeric( $_POST['id'] ) && $_POST['id'] > 0 )
{
$id = $_POST['id'];
$stmt = $dbh->prepare( "DELETE FROM news WHERE id =:id" );
$stmt->bindParam(':id', $id);
$stmt->execute();
if( ! $stmt->rowCount() ) echo "Deletion failed";
}
else
{
echo "ID must be a positive integer";
}
}
首先,我们将if( isset($_POST['delete']) )
提升为完整删除代码的包装器:如果查询未执行,则没有理由准备查询。此外,如果未设置$_POST['delete']
,则表示删除失败,但不会请求删除,因此我们会删除错误警报。
然后,我们检查$_POST['id']
有效性(存在,是数字,是正数),我们将其分配给$id
变量,现在我们执行查询:通过->rowCount()
我们检查受查询影响的行,如果结果为0,则显示错误消息。
您的查询例程错误:
$rows = dbh->query('SELECT * FROM news ORDER BY id ASC');
# └─┬─┘
# └─────────┐
# ┌─┴─┐
while($rows = $stmt->fetch(PDO::FETCH_ASSOC)) {
更改以上第一行:
$stmt = dbh->query('SELECT * FROM news ORDER BY id ASC');
您的Heredoc语法也是错误的:在<<<_END ... END
内,您必须用方括号包装数组名称:{$rows['id']}
,{$rows['title']}
等...
在调试代码时,您必须检查错误:
而且,将来,不要忘记在我们的php代码中激活错误检查:
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
通过错误检查,我们的原始代码会产生此错误:
激活错误报告(在您的脚本顶部error_reporting( E_ALL ); ini_set( 'display_errors', 1 );
) - 如果您遇到500服务器错误 - 请查看您的服务器错误日志:在这里您将看到详细错误,文件和行发生了错误。