簡體   English   中英

如何使用PHP和PDO正確刪除行

[英]How to properly delete a row using PHP & PDO

我查找了刪除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;
    }
    ?>

看來您沒有正確設置$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個服務器錯誤-查看服務器錯誤日志:在這里您將看到詳細的錯誤,文件和發生錯誤的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM