機能概要

ここまで習ってきたニュース(お知らせ)にファイルアップロードを追加しました。
また、SQLを利用して、2つのテーブルにデータ登録しています。

プログラミングコード

「newsAdd_fileuploads.php」お知らせ新規登録ページファイル

データベースにニュース情報を登録(投稿)します。また、ファイルアップロード用のテーブルにもレコードを登録します。

 


Create Table news_tbl (
 news_id int not null auto_increment,
 title varchar(255) not null,
 article text not null,
 insert_at datetime not null,
 update_at datetime not null,
 delete_at datetime null,

 Primary Key(
  news_id
 )
);

Create Table news_fileuploads_tbl (
 seq_id int not null auto_increment,
 news_id int not null,
 folder_name varchar(255) not null,
 file_name varchar(255) not null,
 insert_at datetime not null,
 update_at datetime not null,
 delete_at datetime null,

 Primary Key(
  seq_id
 )
);

  • 4行目:「config.php」を読み込み、その中の変数情報を使用することができるようになります。
  • 9行目:変数「$newid」の初期化。新しく発番された番号を取得するための変数です。
  • 48行目:「lastInsertId()」は、最後に登録した主キーの連番を取得します。
  • 53行目:「isset($newid)」で、連番が取得できた場合のみ動作します。
  • 55~59行目:保存先のフォルダを作成します。
  • 61行目:保存先フォルダと保存ファイル名を変数「$save」に保存します。
  • 64行目:ファイルを保存します。
  • 65~90行目:テーブル「news_fileuploads_tbl」に保存先情報を登録します。
  • 92行目:「newsAdd_fileuploads.php」に自動的に遷移します
  • 107行目:「formタグ」のプロパティを設定します。
    • action:ファイル名やURL
    • method:POSTを入力(※その他、GETも利用可)
    • enctype:multipart/form-data
<?php

//データベース接続情報を格納
include("config.php");

if($_SERVER['REQUEST_METHOD'] === 'POST'){

    //新しい番号を保存するための変数
    $newid = "";

    //POSTデータの取得
    $txt_title = $_POST['txt_title'];
    $txt_article = $_POST['txt_article'];

    $err = "";

    if($txt_title == ""){
        $err .= "【件名】";
    }
    if($txt_article == ""){
        $err .= "【内容】";
    }

    if($err == ""){

        $sql = "insert into news_tbl("
                ."title"
                .",article"
                .",insert_at"
                .",update_at"
                .") values ("
                .":title"
                .",:article"
                .",now()"
                .",now()"
                .");";
        $dbh = new PDO($dsn, $user, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        try{
            $stmt = $dbh->prepare($sql);
            $stmt->bindValue(':title', $txt_title, PDO::PARAM_STR);
            $stmt->bindValue(':article', $txt_article, PDO::PARAM_STR);
            $stmt->execute();
            //$dbh->lastInsertId()は、最後に登録した番号を取得
            $newid = $dbh->lastInsertId();
        } catch(Exception $e){
            echo "データの書き込みに失敗しました。". $e->getMessage();
        }

        if(isset($newid)){
            //フォルダ名を日付+ランダム文字列(4桁)で生成する//
            if(isset($_FILES['up_file'])){
                //ASCIIコードによる文字変換は65がA、90がZとなります。
                $folder = date(ymd).chr(mt_rand(65,90)).chr(mt_rand(65,90)).chr(mt_rand(65,90)).chr(mt_rand(65,90));
                mkdir('uploads/'.$folder);
            }

            $save = 'uploads/'.$folder.'/'.basename($_FILES['up_file']['name']);
        
            //move_uploaded_fileで、一時ファイルを保存先ディレクトリに移動させる
            if(move_uploaded_file($_FILES['up_file']['tmp_name'], $save)){
                $sql = "insert into news_fileuploads_tbl("
                    ."news_id"
                    .",folder_name"
                    .",file_name"
                    .",insert_at"
                    .",update_at"
                    .") values ("
                    .":news_id"
                    .",:folder_name"
                    .",:file_name"
                    .",now()"
                    .",now()"
                    .");";
                $dbh = new PDO($dsn, $user, $password);
                $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                try{
                    $stmt = $dbh->prepare($sql);
                    $stmt->bindValue(':news_id', $newid, PDO::PARAM_INT);
                    $stmt->bindValue(':folder_name', $folder, PDO::PARAM_STR);
                    $stmt->bindValue(':file_name', basename($_FILES['up_file']['name'], PDO::PARAM_STR));
                    $stmt->execute();
                } catch(Exception $e){
                    echo "データの書き込みに失敗しました。". $e->getMessage();
                }

                header("Location:newsList_fileuploads.php");

            }else{
                echo 'アップロード失敗!';
            }
        }
    }else{
        echo $err."を修正してください。";
    }
}
?>

<html>
<body>
<h1>ニュース登録</h1>
<form action="newsAdd_fileuploads.php" method="POST" enctype="multipart/form-data">
    件名<br>
    <input type="text" name="txt_title" /><br>
    内容<br>
    <textarea name="txt_article" style="width:300px;height:150px;"></textarea><br>
    画像<br>
    <input type="file" name="up_file"><br><br>
    <input type="submit" value="投稿">
</form>
</body>
</html>

演習問題

  1. 上記のコードを使用して、ファイル作成し、動作するようにしてみよう。
  2. データベースやテーブルを変更し、違う情報を利用して、動作するようにしてみよう。