Cyb*_*nja 1 php mysql mysqli pdo delete-row
我查找了删除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;
}
?>
Run Code Online (Sandbox Code Playgroud)
似乎您没有正确设置$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";
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我们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)) {
Run Code Online (Sandbox Code Playgroud)
在第一行上方更改:
$stmt = dbh->query('SELECT * FROM news ORDER BY id ASC');
Run Code Online (Sandbox Code Playgroud)
此外,您的定界符语法是错误的:里面<<<_END ... END你必须用方括号来包装阵列名称:{$rows['id']},{$rows['title']},等...
在调试代码时,您必须检查错误:
而且,将来不要忘记在我们的php代码中激活错误检查:
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
Run Code Online (Sandbox Code Playgroud)
通过错误检查,我们的原始代码会产生以下错误:
激活错误报告(error_reporting( E_ALL ); ini_set( 'display_errors', 1 );在脚本顶部),并且-如果遇到500服务器错误-查看服务器错误日志:在这里您将看到详细的错误,文件以及发生错误的行。
| 归档时间: |
|
| 查看次数: |
5507 次 |
| 最近记录: |