[英]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.