DB操作 newsfeed制作5
DB操作 newsfeed制作5
DB内のデータを削除するために必要な、削除対象のnews_id取得までを進める。
前準備
削除実行用のnews_delete_confirm.phpと、削除後処理用のnews_delete_fin.phpという名前のファイルを作る。また、コード短縮のためにsession.phpを作り、session開始させる箇所で呼び出す。
コード記述session.php前半
まずsession開始処理を別ファイル化しコード短縮する。init.phpの呼び出しも記述しておき、片方記述すれば事足りるようにする。init.hpにsession開始を記述しないのは、login.php内でinit.phpの読み込みとsession開始が別タイミングとなるためである。
require_once dirname(__FILE__).'/init.php'; session_start(); session_regenerate_id(true);
これによりindex.phpの上記コード部は、下記に置き換えられる。
require_once dirname(__FILE__).'/session.php';
コード記述news_delete_confirm.php
news_list.phpで削除がクリックされた記事を表示させ、本当に削除していいか確認させる。
セッション開始~url直打ちリダイレクト
リダイレクト条件が増えると、一見何を条件にしているか分かりにくくなる。正しくページを進めてきたユーザだけが削除処理を行なえるようにするため、DB操作処理では重要度が増す。
require_once dirname(__FILE__).'/session.php'; if(!isset($_SESSION['login']['success'])||!$_SESSION['login']['success']||!isset($_GET['news_id'])||!is_numeric($_GET['news_id'])){ header('ROOT_URL.index.php'); exit; }
news_id取得~DB接続
削除対象のnews_idを確定させるために、$_GETから値を取得、格納する。
$news_id=$_GET['news_id']; $dbh=""; try{ $dbh=new PDO(DB_CONNECT,DB_USER,DB_PASS); }catch(Exception $e){ exit('エラーが発生しました'); }
DBからデータ取得~変数へ格納
$_SESSION['delete_data']['news_id']に$_GET['news_id']を格納する点がポイントとなる。これにより次のnews_delete_fin.phpで削除処理が実行できるようになる。
$sql="SELECT * FROM news WHERE news_id=:news_id;"; $stmt=$dbh->prepare($sql); $stmt->bindParam(':news_id',$news_id); $stmt->execute(); $row=$stmt->fetch(PDO::FETCH_ASSOC); $_SESSION['delete_data']['news_id']=$_GET['news_id']; if(false===$row){ header('ROOT_URL.index.php'); exit; } foreach($row as $k=>$v){ $$k=$v; }
コード記述session.php後半
削除の確認を促すメッセージと、削除対象の内容を書き出す。
<h1>この記事を削除します。よろしいですか?</h1> <table> <?php print"<tr><td>news-id ".h($news_id)."</td><td>".h($news_headline)."</td><td>".h($news_date)."</td>\n"; print"<td>".nl2br(h($news_article)); print"</td><td><button><a href='news_delete_fin.php'>削除を実行</a></button></td>\n"; ?> </table> <p class="back"><a href="news_list.php">news headlineへ戻る</a></p>