【独学】はじめてのWebプログラミング – 9.7 Webページ開発 2-⑦

ツイート投稿機能の作成

ツイートモデルの作成

Modelsフォルダ内に「tweets.php」ファイルを作成します。

VSCode

tweets.phpに以下の内容を書きます。

htdocs/Twitter/Models/tweets.php

<?php

// 設定ファイルの読み込み
include_once '../config.php';

?>

ツイート投稿コントローラーの作成

Controllersフォルダ内に「post.php」ファイルを作成します。

VSCode

post.phpに以下の内容を書きます。

htdocs/Twitter/Controllers/post.php

<?php

include_once '../util.php';

// ツイートモデルを読み込み
include_once '../Models/tweets.php';

// ログインチェック
$view_user = getSession();
if ($view_user == false) {
    // ログインしていない
    header('Location: ../Controllers/sign-in.php');
    exit;
}

// 画面表示
include_once '../Views/post.php';

?>

画像アップロード機能の作成

画像ファイルをアップロードする関数の追加

util.phpを以下のように修正します。

htdocs/Twitter/util.php

<?php

function saveSession($user)
{
    if (session_status() === PHP_SESSION_NONE) {
        // セッション開始
        session_start();
    }

    // セッションにユーザー情報を保存
    $_SESSION['USER'] = $user;
}

function deleteSession()
{
    if (session_status() === PHP_SESSION_NONE) {
        // セッション開始
        session_start();
    }

    // セッションのユーザー情報を削除
    unset($_SESSION['USER']);
}

function getSession()
{
    if (session_status() === PHP_SESSION_NONE) {
        // セッション開始
        session_start();
    }

    if (isset($_SESSION['USER']) == false) {
        // セッションにユーザー情報が存在しない
        return false;
    }

    // セッションのユーザー情報を返す
    $user = $_SESSION['USER'];
    return $user;
}

// ★変更箇所(ここから)
function saveFile($user, $file, $type)
{
    // ランダムな数字を取得
    $random = mt_rand();

    // ファイル名の変更
    $file_name = $user['id'].'_'.$random.'_'.$file['name'];

    // 保存先
    $file_path = '../Views/img_uploaded/'.$type.'/'.$file_name;

    // 画像を設置
    move_uploaded_file($file['tmp_name'], $file_path);

    return $file_path;
}
// ★変更箇所(ここまで)

?>

画像ファイルをサーバーに保存する関数である「saveFile関数」を追加しました。
引数として、(セッションの)ユーザー情報である「$user」、アップロードされた画像ファイルの情報である「$file」、種別を示す「$type」を受け取るものとします。
種別は、ユーザー(’user’という文字列)もしくはツイート(’tweet’という文字列)を受け取るものとします。

はじめに、サーバー上でファイル名がぶつからないように、「ユーザーID」と「ランダムな数字」を、ファイル名の先頭に付与しています。
mt_rand関数はPHPの関数で、ランダムな数字を取得できます。

次に、「’../Views/img_uploaded/’.$type」をサーバー上のファイルの保存先としています。$typeには「user」もしくは「tweet」が入るので、「../Views/img_uploaded/user」もしくは「../Views/img_uploaded/tweet」が保存先になります。

以前解説をしたPHPの関数であるmove_uploaded_file(アップロードされたファイル, 保存先)を使って、アップロードされたファイルをサーバーに保存しています。

最後に、サーバーの保存先を呼び出し元に返しています。

ツイート投稿コントローラーの変更

post.phpを以下のように修正します。

htdocs/Twitter/Controllers/post.php

<?php

include_once '../util.php';

// ツイートモデルを読み込み
include_once '../Models/tweets.php';

// ログインチェック
$view_user = getSession();
if ($view_user == false) {
    // ログインしていない
    header('Location: ../Controllers/sign-in.php');
    exit;
}

// ★変更箇所(ここから)
if (isset($_POST['body'])) {
    $file_path = null;
    if (isset($_FILES['image']) && is_uploaded_file($_FILES['image']['tmp_name'])) {
        $file_path = saveFile($user, $_FILES['image'], 'tweet');
    }
}
// ★変更箇所(ここまで)

// 画面表示
include_once '../Views/post.php';

?>

以前解説をしたPHPの変数$_FILES[‘名前’]、およびPHPの関数であるis_uploaded_file($FILES[‘名前’][‘tmp_name’])を使って、アップロードされたファイルがあるかを確認しています。
‘名前’の部分は、Controllers/post.phpへPOSTをしている箇所、すなわちViews/post.phpの「<input type=”file” name=”image” class=”form-control form-control-sm”>」の「image」が該当するのでしたね。

アップロードされたファイルがある場合、saveFile関数を呼び出しています。
ツイート投稿機能のため、3つ目の引数には’tweet’を指定しています。

ツイート投稿機能の作成

ツイートモデルの変更

tweets.phpを以下のように修正します。

htdocs/Twitter/Models/tweets.php

<?php

// 設定ファイルの読み込み
include_once '../config.php';

// ★変更箇所(ここから)
// ツイート登録関数
function createTweet($data)
{
    // データベースに接続
    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

    // 成功/失敗確認
    if ($mysqli->connect_errno) {
        echo 'MySQLの接続に失敗しました。<br>';
        exit;
    }

    // ツイート登録のSQLを作成
    $query = 'INSERT INTO tweets (user_id, body, image_name) VALUES (?, ?, ?)';

    // セキュリティ上、以下のように書く
    $statement = $mysqli->prepare($query);
    $statement->bind_param('iss', $data['user_id'], $data['body'], $data['image_name']);

    // SQLを実行
    $response = $statement->execute();

    // 成功/失敗確認
    if ($response == false) {
        echo 'エラーが発生しました。<br>';
    }

    // データベースへの接続解除
    $statement->close();
    $mysqli->close();

    // result変数には、true(成功)or false(失敗)が入っている
    return $response;
}
// ★変更箇所(ここまで)

?>

ツイートを登録するcreateTweet関数を追加しています。
引数として、連想配列(登録するツイート情報)を受け取るものとします。

bind_param関数の1つ目の引数には「iss」を指定しています。
「i」は「int型(整数)」の略です。int型であるuser_idを指定するためです。

その他はこれまでに解説した内容と同様です。

ツイート投稿コントローラーの変更

post.phpを以下のように修正します。

htdocs/Twitter/Controllers/post.php

<?php

include_once '../util.php';

// ツイートモデルを読み込み
include_once '../Models/tweets.php';

// ログインチェック
$view_user = getSession();
if ($view_user == false) {
    // ログインしていない
    header('Location: ../Controllers/sign-in.php');
    exit;
}

if (isset($_POST['body'])) {
    $file_path = null;
    if (isset($_FILES['image']) && is_uploaded_file($_FILES['image']['tmp_name'])) {
        $file_path = saveFile($view_user, $_FILES['image'], 'tweet');
    }

    // ★変更箇所(ここから)
    $data = [
        'user_id' => $view_user['id'],
        'body' => $_POST['body'],
        'image_name' => $file_path,
    ];

    // ツイート投稿
    if (createTweet($data)) {
        // 成功したらホーム画面に遷移
        header('Location: ../Controllers/home.php');
        exit;
    }
    // ★変更箇所(ここまで)
}

// 画面表示
include_once '../Views/post.php';

?>

セッションのユーザー情報の中のユーザーID($view_user[‘id’])、POSTされてきたツイート文字列($_POST[‘body’])、サーバーに保存したファイルの保存先($file_path)を、連想配列$dataに入れて、createTweet関数に渡しています。
createTweet関数内でツイート登録(データベースへのツイートの挿入)が行われ、成功したら「header(‘Location: ../Controllers/home.php’)」が実行されてホーム画面に遷移します。

ブラウザ

ここでは、「こんにちは」という文字列と、「dog.jpg」という画像をツイートしました。

ここまで出来たら、変更内容をコミットし、GitHubにプッシュして下さい。

本節の説明は以上になります。

トップページ <<前のカリキュラムへ戻る 次のカリキュラムへ進む>>

タイトルとURLをコピーしました