PDOでDELETEの使い方【PHP】

PHPのPDOで削除を行うDELETE文の書き方をまとめました。

例として、下記のテーブルをサンプルコードで使用します。

table名:yasai_item
id name
(UNIQUE)
price
1 にんじん 50
2 トマト 100
3 きゅうり 80

PDOでのDELETE文の書き方

DELETE句を含め、PDOでSQLを実行する方法は大きく分けて2つあります。

  • query
  • prepare→execute

queryとprepareを使用したDELETE文の実行方法をそれぞれで解説していきます。

query

queryは、ソースコードで書くSQLが既に決まっている場合に使用します。

条件指定の削除(WHERE句)

$sql = "DELETE FROM yasai_item
        WHERE
        name = 'にんじん'";
$sth = $pdo -> query($sql);

こちらは、nameが「にんじん」となっている行を削除する処理です。
実行して、「にんじん」の行が削除されていたら成功です。

id name price
2 トマト 100
3 きゅうり 80

全行の削除

テーブルのデータをすべて削除する場合、「DELETE FROM テーブル名」とだけ書きます。

$sql = "DELETE FROM yasai_item";
$sth = $pdo -> query($sql);

もしくは、「TRUNCATE TABLE テーブル名」でも同様のことが行えます。

$sql = "TRUNCATE TABLE yasai_item";
$sth = $pdo -> query($sql);

TRUNCATE TABLEは、一旦テーブルそのものを削除した後、再度テーブルを生成するという処理なので、データ量に関わらず高速に処理が完了します。

AUTO INCREMENT等もリセットされるので、テーブルの用途に合わせて使い分けるのが良いでしょう。

変数にDELETE文に組み込む場合の注意点

DELETE文で変数を使用したい場合は、文字列連結でも対応できます。

$item = 'にんじん';
$sql = "DELETE FROM yasai_item
        WHERE
        name = '".$item."'";
$sth = $pdo -> query($sql);

ただし、この場合に文字列連結で組み込む変数は、外部のユーザーから取得した値を何の検証もせずに組み込むと、SQLインジェクション攻撃を受ける可能性があります。

//やってはいけない例 $_GETなどでユーザーから入力された値を文字列連結で組み込む
$item = $_GET['item'];
$sql = "DELETE FROM yasai_item
        WHERE
        name = '".$item."'";
$sth = $pdo -> query($sql);

参考 PHPでSQLインジェクション攻撃の対策方法【PDO】

ユーザーの操作によってDELETE句を使用する場合は、prepareを使用してください。

prepare→execute

prepareは、SQL文を一度実行準備を行い、その後に変数を当てはめて実行できる機能です。

参考 PDOでprepareの使い方【PHP】

  • prepare()でクエリの実行準備
  • bindValue()でクエリ内の値を設定
  • execute()で更新の実行

という流れでDELETEを行います。

実行準備の段階でDELETE文と認識するため、SQLインジェクション攻撃のように別の処理に変えられることはありません。
そのため、セキュリティに強いprepareからクエリを実行する方が基本的にオススメです。

$sql = "DELETE FROM yasai_item
        WHERE
        name = :name";
//実行準備
$sth = $pdo -> prepare($sql);
//クエリのパラメータに合わせて値を組み込む
$sth -> bindValue(':name', 'にんじん');
//組み込み後のSQL文を実行
$sth -> execute();

コロン付きのパラメータで、のちに代入する値を指定しておきます。
その後、bindValueで値を設定後、executeでクエリが実行されます。

削除された件数を取得するrowCount

DELETEを行った結果、削除された件数を取得したい場合はrowCount()を使用します。

参考 【PHP】PDOで件数を取得するrowCountの使い方

$sql = "DELETE FROM yasai_item";
$sth = $pdo -> query($sql);
$count = $sth -> rowCount();
echo $count; // ⇒ 3

以上、PDOでDELETEの使い方、でした。

PHP