DB操作 newsfeed制作7
DB操作 newsfeed制作7
今回はUPDATE文でDBのデータを書き換える処理について学ぶ。データ編集画面表示~受け渡し編集データ確定までを処理するnews_update_entry.phpの記述までを対象とする。
前準備
今回は新たにnews_update_entry.php(更新内容の入力用),news_update_confirm.php(更新内容の確認用),news_update_fin.php(実際の更新処理用)の3ファイルを作る。このうち、news_update_fin.phpはブラウザで表示する内容が存在しない、処理だけのファイルとなる。
処理の流れ
今回の処理の流れは下記の順になる。
コード記述news_update_entry.php(前半)
news_update_entry.phpに必要な機能は、3つの入力フィールド(件名、投稿日時、記事本文)と次画面(news_update_confirm.php)への遷移アンカーである。
外部ファイル読込~リダイレクト(2系統)
リダイレクトが2系統となる。1つ目がログイン失敗時とurl直打ちのリダイレクト、2つ目はGETまたはSESSIONにおいてnews_idが存在していない場合である。
require_once dirname(__FILE__).'/session.php'; if(!isset($_SESSION['logon']['success'])||!$_SESSION['logon']['success']){ header(ROOT_URL.'index.php'); exit; } if(!isset($_GET['news_id']&&!isset($_SESSION['update_data']['news_id'])){ header(ROOT_URL.'index.php'); exit; }
get時のflg on~変数初期化
ひとまず$get_flgをtrueに宣言してしまう。SESSION時にfalseとする記述を後で書く。
初期化する変数はUPDATEするデータが格納される。
$get_flg=true; $update_data=array('news_id','news_headline','news_date','news_article'); foreach($update_data as $v){ $$V=""; } ***GET時の$news_id代入 GETでnews_idを取得する場合の$news_id確定処理(通常の流れ)。$_SESSION['news_id']を破棄する記述があるが、これはnews_update_confirm.phpからurl直打ちで戻ってきた際にだけ有意な処理となる。 >|php| if(isset($_GET['news_id'])){ if(!is_numeric($_GET['news_id'])){ header(ROOT_URL.'index.php'); exit; }else{ $news_id=$_GET['news_id']; $_SESSION['news_id']=array(); } }
SESSION時の$news_id代入
SESSIONでnews_idを取得する場合の$news_id確定処理(確認画面から戻ってきた場合)。ここで$get_flgをfalseにしている。また、SESSIONデータをform内に記述するため、変数に代入する処理も行なう。
if(isset($_SESSION['update']['news_id'])){ if(!is_numeric($_SESSION['update']['news_id'])){ header(ROOT_URL.'index.php'); exit; }else{ $get_flg=false; $news_id=$_SESSION['update_data']['news_id']; foreach($_SESSION['update_data'] as k=>$v){ $$k=$v; } } }
DBデータ呼び出し~引き渡し用$_SESSION['update_data']['news_id']確定
GET時はDBからデータを呼び出しformに転記する。そのデータを取得し、さらに次画面のnews_update_confirm.phpに引き渡すnews_idを確定する。修正データはPOSTで送れるが、idはformで編集できない(一意性データのため)。よってSESSIONを用いる。
if($get_flg){ try{ $dbh=new PDO(DB_CONNECT,DB_USER,DB_PASS); }catch(Exception $e){ exit('システムエラーが発生しました'); } $sql="SELECT * FROM news WHERE news_id=:news_id;"; $stmt=$dbh->prepare($sql); $stmt->bindParam(':news_id',$news_id); $r=$stmt->execute(); $row=$stmt->fetch(PDO::FETCH_ASSOC); if(false===$row){ header(ROOT_URL.'index.php'); exit; } foreach($row as $k=>$v){ $$k=$v; } $_SESSION['update_data']['news_id']=$_GET['news_id']; }
コード記述news_update_entry.php(後半)
DBまたはSESSIONから取得したデータをform内に記述する。
<p>記事番号:<?php print h($news_id);?></p> <form action="news_update_confirm.php" method=POST> <p><label for="news_headline">記事タイトル</label> <input type="text" id="news_headline" name="news_headline" size="128" value="<?php print h($news_headline);?>" required></p> <p><label for="news_date">投稿日時</label> <input type="datetime" name="news_date" id="news_date" size"20" value="<?php print h($news_date);?>" required></p> <p><label for="news_article">記事本文</label></p> <textarea name="news_article" id="news_article" rows="20" cols="30"><?php nl2br(h(news_article));?></textarea><br> <input type="submit" value="確認画面へ"> </form>
今回はここまでとする。