如何使用PHP和PDO正确删除行

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)

fus*_*n3k 5

似乎您没有正确设置$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服务器错误-查看服务器错误日志:在这里您将看到详细的错误,文件以及发生错误的行。