考え、感じる、Web制作。

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

DB操作 newsfeed制作8

DB操作 newsfeed制作8

今回はUPDATEの続きで、編集データを受け取り実際にDBへUPDATEする処理を記述する。

コード記述news_update_confirm.php(前半)

news_update_confirm.phpは削除前の確認画面としての機能を有する。前画面の編集データをPOSTで受け取り、news_idだけはSESSIONで取得した。その内容を表示させ、実際の削除処理へつなげる画面である。

外部ファイル読込~リダイレクト

今回のリダイレクト条件は下記の4つとした。

  1. ログインに成功していない
  2. ログインしていない
  3. news_idがない
  4. 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つとした。

  1. ログインに成功していない
  2. ログインしていない
  3. errorフラグに値がない
  4. errorが発生している
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系統になる点がやや複雑なものの、今まで学習した内容で十分に理解可能なないようだった。頭を使う場面としては、リダイレクト条件の設定と、初期化必須な変数を見抜く点だ。いまのところこの点に関してはすらすらと記述できない。今後の課題としたい。