考え、感じる、Web制作。

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

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はブラウザで表示する内容が存在しない、処理だけのファイルとなる。

処理の流れ

今回の処理の流れは下記の順になる。

  1. news_list.phpで書き換える対象を選ぶ。
  2. news_update_entry.phpで更新内容を入力する。
  3. news_update_confirmで入力内容を確認する画面を表示する。
  4. 確認がOKであれば、news_update_fin.phpでUPDATEをDBに対し実行する。
  5. 実行後、news_list.phpに戻る。
処理のポイント

通常の流れでnews_list.phpからnews_update_entry.phpに来る場合、news_idをGETで渡す。一方、news_update_confirm.phpで内容を確認するが、その際修正内容を再修正したい場合がある。ここでnews_update_entry.phpに戻った場合、入力済文字列を残す必要があるため、sessionを使うことになる。このため、news_update_entry.phpではGETとsessionで2系統の処理を記述する必要がある。

コード記述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>

今回はここまでとする。