考え、感じる、Web制作。

Web制作の学習や情報についての記事が中心です。

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>