ツイート投稿機能の作成
ツイートモデルの作成
Modelsフォルダ内に「tweets.php」ファイルを作成します。
tweets.phpに以下の内容を書きます。
htdocs/Twitter/Models/tweets.php
<?php
// 設定ファイルの読み込み
include_once '../config.php';
?>
ツイート投稿コントローラーの作成
Controllersフォルダ内に「post.php」ファイルを作成します。
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にプッシュして下さい。
本節の説明は以上になります。