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

时间:2016-04-10 08:18:26

标签: 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;
    }
    ?>

1 个答案:

答案 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服务器错误 - 请查看您的服务器错误日志:在这里您将看到详细错误,文件和行发生了错误。