2014
5
22
WordPressでタイムテーブル型予約システムをつくる 第8回「削除」

遂に完結です!ずっとこの記事ばかり書いてて読んでる方が飽きてないか心配でした…ていうかわたしが飽きてました((└(:3」┌)┘))


この記事をスマホで読む

関連記事

WPで、というタイトルですがWP外でも実装できます。間違いや、お気づきの点がありましたらご指摘下さい。

削除ボタンを実装

140522-1

前回、タイムテーブルと共にボタンだけは出力してあると思いますが、まだ押しても何も動かない状態です。ここに処理を実装していきます。

//略
if ( isset($_POST['calendar']) ){
	//カレンダーがクリックされた場合
} elseif ( isset($_POST['register']) ) {
	//登録ボタンがクリックされた場合
} elseif( isset($_POST['delete']) ) {
	//削除ボタン(キー無)がクリックされた場合
} elseif ( isset($_POST['kwd_delete']) ) {
	//削除ボタン(キー有)がクリックされた場合
}
//略

今までこのような形で進めてきて、今回はハイライト部分を書いていく予定なのですが。これの「キーワード有りの削除ボタンがクリックされた場合」のときには、

140522-2

このようなフォームを出したいと思います。そのため、このボタンを押した時の処理も追加しなくちゃいけません。

//略
if ( isset($_POST['calendar']) ){
	//カレンダーがクリックされた場合
} elseif ( isset($_POST['register']) ) {
	//登録ボタンがクリックされた場合
} elseif( isset($_POST['delete']) ) {
	//削除ボタン(キー無)がクリックされた場合
} elseif ( isset($_POST['kwd_delete']) ) {
	//削除ボタン(キー有)がクリックされた場合
} elseif( isset($_POST['rgs_delete']) ) {
	//キー入力後の削除ボタンがクリックされた場合
}
//略

というわけで、この部分を追加して進めていきます。

キーワード無しのデータ削除

//略
if ( isset($_POST['calendar']) ){
	//カレンダーがクリックされた場合
} elseif ( isset($_POST['register']) ) {
	//登録ボタンがクリックされた場合
} elseif( isset($_POST['delete']) ) {
	//削除ボタン(キー無)がクリックされた場合
} elseif ( isset($_POST['kwd_delete']) ) {
	//削除ボタン(キー有)がクリックされた場合
} elseif( isset($_POST['rgs_delete']) ) {
	//キー入力後の削除ボタンがクリックされた場合
}
//略

まずここ。第6回の記事で、ボタンを押したら確認のJavaScriptが走るようにしてあるはずなので、この部分は削除するだけです。

WPの場合

$date = isset($_POST['date']) && is_string($_POST['date']) ? $_POST['date'] : '';
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
//データ削除
$sql_rsl = $wpdb->query( $wpdb->prepare(
	"DELETE FROM $wpdb->rsv_timetable WHERE id = %d",
	$id
) );
if ( $sql_rsl == false ) {
	$log1 = '<p>削除に失敗しました。</p>';
} else {
	$log1 = '<p>削除しました。</p>';
}

WP外の場合(PDO)

$date = isset($_POST['date']) && is_string($_POST['date']) ? $_POST['date'] : '';
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
//データ削除
$sql = $pdo->prepare( 'DELETE FROM rsv_timetable WHERE id = :id' );
$sql->bindValue(':id', $id, PDO::PARAM_INT);
$rsl = $sql->execute(); //実行
if ( $rsl == false ){
	$log1 = '<p>削除に失敗しました。</p>';
} else {
	$log1 = '<p>削除しました。</p>';
}

削除ボタンのフォームに一緒に設置した hidden(隠し)要素から日付とIDを取得して、日付は上書き、指定IDでDBから情報を削除します。

キーワード有りのデータ削除

<?php
if ( isset($_POST['calendar']) ){
	//カレンダーがクリックされた場合
} elseif ( isset($_POST['register']) ) {
	//登録ボタンがクリックされた場合
} elseif( isset($_POST['delete']) ) {
	//削除ボタン(キー無)がクリックされた場合
} elseif ( isset($_POST['kwd_delete']) ) {
	//削除ボタン(キー有)がクリックされた場合
} elseif( isset($_POST['rgs_delete']) ) {
	//キー入力後の削除ボタンがクリックされた場合
}
//略

次はここ。ここでは削除せずに、削除キーワードを入力してもらうフォームを出力します。せっかくなのでメッセージ枠内に出力しちゃいましょう。 $log1 に入れていきます。

$date = isset($_POST['date']) && is_string($_POST['date']) ? $_POST['date'] : '';
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
$log1 .= "<p>削除キーを入力してください。</p>\n";
$log1 .= '<form action="" method="post">'."\n";
$log1 .= '<input type="hidden" name="date" value="'.h($date).'" />'."\n";
$log1 .= '<input type="hidden" name="id" value="'.h($id).'" />'."\n";
$log1 .= '<input type="text" name="ipt_kwd" size="10" value="" />'."\n";
$log1 .= '<input type="submit" name="rgs_delete" value="削除">'."\n";
$log1 .= "</form>\n";

これで枠内に出力されるはず。

キーワード入力後のデータ削除

//略
if ( isset($_POST['calendar']) ){
	//カレンダーがクリックされた場合
} elseif ( isset($_POST['register']) ) {
	//登録ボタンがクリックされた場合
} elseif( isset($_POST['delete']) ) {
	//削除ボタン(キー無)がクリックされた場合
} elseif ( isset($_POST['kwd_delete']) ) {
	//削除ボタン(キー有)がクリックされた場合
} elseif( isset($_POST['rgs_delete']) ) {
	//キー入力後の削除ボタンがクリックされた場合
}
//略

最後に、上で作ったフォームのボタンを押された場合。

WPの場合

$date = isset($_POST['date']) && is_string($_POST['date']) ? $_POST['date'] : '';
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
$ipt_kwd = isset($_POST['ipt_kwd']) && is_string($_POST['ipt_kwd']) ? $_POST['ipt_kwd'] : '';
//削除キーをDBから抽出
$kwd = $wpdb->get_var( $wpdb->prepare(
	"SELECT kwd FROM $wpdb->rsv_timetable WHERE id = %d",
	$id
) );
if ( $ipt_kwd == $kwd || $ipt_kwd == $master_key ) { //キーワードが一致したら
	//データ削除
	$sql_rsl = $wpdb->query( $wpdb->prepare(
		"DELETE FROM $wpdb->rsv_timetable WHERE id = %d",
		$id
	) );
	if ( $sql_rsl == false ) {
		$log1 = '<p>削除に失敗しました。</p>';
	} else {
		$log1 = '<p>削除しました。</p>';
	}
} else {
	$log1 = '<p>キーワードが間違っているため、削除できません。</p>';
}

WP外の場合(PDO)

$date = isset($_POST['date']) && is_string($_POST['date']) ? $_POST['date'] : '';
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
$ipt_kwd = isset($_POST['ipt_kwd']) && is_string($_POST['ipt_kwd']) ? $_POST['ipt_kwd'] : '';
//削除キーをDBから抽出
$results = $pdo->prepare( 'SELECT kwd FROM rsv_timetable WHERE id = :id' );
$results->bindValue(':id', $id, PDO::PARAM_INT);
$results->execute();
if ( $results ) { foreach ( $results as $value ) {
	$kwd = $value['kwd'];
}	}
if ( $ipt_kwd == $kwd || $ipt_kwd == $master_key ) { //キーワードが一致したら
	//データ削除
	$sql = $pdo->prepare( 'DELETE FROM rsv_timetable WHERE id = :id' );
	$sql->bindValue(':id', $id, PDO::PARAM_INT);
	$rsl = $sql->execute(); //実行
	if ( $rsl == false ){
		$log1 = '<p>削除に失敗しました。</p>';
	} else {
		$log1 = '<p>削除しました。</p>';
	}
} else {
	$log1 = '<p>キーワードが間違っているため、削除できません。</p>';
}

取得IDの削除キーワードをDBから取り出し、をれを取得したキーワードと比べます。一致したら削除、しなければその旨のメッセージを出します。

ハイライト部分は「$ipt_kwd(入力されたキー)が $kwd(抽出されたキー)と同じ、または(||or と同意)、$master_keyと同じならば」という意味で、

/********** 手動設定 **********/
//略
$master_key = 'special';
/********** ここまで **********/

ここで $master_key を設定しておく必要があります。文字列は任意です。

これは、ユーザーが削除キーを忘れてしまった場合に、マスターキーを用意しておくとどんなものでも削除できるよ、という機能のためです。DBを参照すればキーワードは分かるので、不必要な場合は実装しなくて良いと思います。

全ソース

まるっとコピペで動くとは限らないと思うので、お使いの環境に合わせて適宜修正をお願いします。

すっごく長くてカオスです。お好きなところだけ抜き出して部品化するなり、煮るなり焼くなりお好きにつかってください_(:3 」∠)_

あとがき

やっとおわりました…!

正直第1回目の時点で、これWordPressである必要性全く無いよね?って思ってしまい、実稼働でもWPから外してしまい、もうこれ解説記事を書く意味あるのかなぁと、非常に疑問を抱きながらのここまででした。

とはいえ、記事にするため、他人に見られることを意識して書くうちに「ここはもっとスマートに書ける!」「ここの処理いらない!」など、初期のコードよりかなりシュッとして、自分自身にはとても良い勉強になりました。

まるごとお役に立てるかはちょっと微妙だと思うので、スニペットとしてお役立ていただけたら嬉しいです。ここまで読んでくださった方に厚く御礼申し上げます。

公開日:

  • RSSを登録
  • 339 follow us in feedly
  • このエントリーをはてなブックマークに追加



コメントを残す




*コメントは承認制ですので、反映までしばらくお待ち下さい。


back to top