DB操作 newsfeed制作8
DB操作 newsfeed制作8
今回はUPDATEの続きで、編集データを受け取り実際にDBへUPDATEする処理を記述する。
コード記述news_update_confirm.php(前半)
news_update_confirm.phpは削除前の確認画面としての機能を有する。前画面の編集データをPOSTで受け取り、news_idだけはSESSIONで取得した。その内容を表示させ、実際の削除処理へつなげる画面である。
外部ファイル読込~リダイレクト
今回のリダイレクト条件は下記の4つとした。
- ログインに成功していない
- ログインしていない
- news_idがない
- news_idが数値データでない
require_once dirname(__FILE__).'/session.php'; if(!isset($_SESSION['login']['success'])||!$_SESSION['login']['success']||!isset($_SESSION['update_data']['news_id'])||!is_numeric($_SESSION['update_data']['news_id'])){ header(ROOT_URL.'index.php'); exit; }
編集データ変数初期化
foreachを使い、変数を初期化させる。キーの宣言、配列の初期化の処理を続けて実行している。
$update_data=array('news_id','news_headline','news_date','news_article');
foreach($update_data as $v){
$$v='';
}
foreach($_POST as $k=>$v){
$$k=$v;
}
エラーデータ変数初期化
エラーデータ用の変数も初期化する。
$news_id=$_SESSION['update_data']['news_id']; $error=true; $news_headline_error=''; $news_article_error=''; $news_date_error='';
エラーメッセージ取得
エラー判別処理。エラー時のメッセージを取得し、変数にかくのう後、フラグをfalseにしている。
日付のチェックで登場するdate_parse_from_formatは日付チェック関数。var_dumで見るとyearやerrorを自動で変数化し、値を格納する。
if(mb_strlen($news_headline,'utf-8')>128){ $news_headline_error='見出しが長すぎます(127文字以内)'; $error=false; } if(mb_strlen($news_article,'utf-8')>65535){ $news_article_error='記事が長すぎます(65535文字以内)'; $error=false; } $date_check=date_parse_from_format('Y-m-d H:i:s',$news_date); if($date_check['error_count']>0||$date_check['warning_count']>0){ $news_date_error='不正な日付方式です。例:2014-10-23 17:25の形式で入力して下さい'; $error=false; } if(strlen($news_date)!==mb_strlen($news_date,'utf-8')){ $news_date_error='半角で入力して下さい'; $error=false; } if(empty($news_headline)){ $news__error="記事タイトルが入力されていません"; $error=false; } if(empty($news_date)){ $news__error="投稿日時が入力されていません"; $error=false; } if(empty($news_article)){ $news__error="本文が入力されていません"; $error=false; }
セッションデータ生成
実際のUPDATEを実行するnews_update_fin.phpに引き渡すセッションデータを生成する。
foreach($_POST as $k=>$v){
$_SESSION['update_data'][$k]=$v;
}
$_SESSION['update_data']['error']=$error;
コード記述news_update_confirm.php(後半)
前半で生成したデータを表示させる。
<h1>この内容で修正します。</h1> <table> <tr><th>news-id</th><th>記事タイトル</th><th>投稿日時</th><th>本文</th></tr> <tr><td><?php echo $news_id;?></td> <td><?php echo h($news_headline),h($news_headline_error);?></td> <td><?php echo h($news_date),h($news_date_error);?></td> <td><?php echo nl2br(h($news_article),h($news_article_error));?></td></tr> </table> <p class="back"><a href="news_update_fin.php">実行</a></p>
コード記述news_update_fin.php
ここではUPDATE処理を実行するだけで、ブラウザ表示は一切ない。UPDATE終了後はnews_list.phpに戻る仕様。
外部ファイル読込~リダイレクト
今回のリダイレクト条件は下記の4つとした。
require_once dirname(__FILE__).'/session.php'; if(!isset($_SESSION['login']['success'])||!$_SESSION['login']['success']||!isset($_SESSION['update_data']['error'])||!($_SESSION['update_data']['error'])){ header(ROOT_URL.'index.php'); exit; }
セッションデータ取得~セッション破棄
セッションデータを変数に格納後、セッションデータを即座に破棄する。
foreach($_SESSION['update_data'] as $k=>$v){ $$k=$v; } $_SESSION['update_data']=array(); unset($_SESSION['update_data']);
UPDATE実行~後処理
DBに対しUPDATEをかける。失敗した場合はログアウトさせる。
try{ $dbh=new PDO(DB_CONNECT,DB_USER,DB_PASS); }catch(Exception $e){ exit('システムエラーが発生しました'); } $sql='UPDATE news SET news_headline=:news_headline,news_date=:news_date,news_article=:news_article WHERE news_id=:news_id;'; $stmt=$dbh->prepare($sql); $stmt->bindParam(':news_id',$news_id); $stmt->bindParam(':news_headline',$news_headline); $stmt->bindParam(':news_date',$news_date); $stmt->bindParam(':news_article',$news_article); $r=$stmt->execute(); if($r){ header(ROOT_URL.'news_list.php'); exit; } header(ROOT_URL.'logout.php');
感想
DELETE続き、UPDATE処理を学習した。更新データ入力フォームが増え、データの受け渡しがGETとSESSIONの2系統になる点がやや複雑なものの、今まで学習した内容で十分に理解可能なないようだった。頭を使う場面としては、リダイレクト条件の設定と、初期化必須な変数を見抜く点だ。いまのところこの点に関してはすらすらと記述できない。今後の課題としたい。