【PHPでwebアプリ】ログインユーザーのマイページと新規投稿機能編

post Webエンジニア

前回の記事「【PHPでのログイン処理の実装方法】セッションとは何か?」にて新規登録したユーザーでログイン処理を実装する方法は書きました。

なので今回はログインしたユーザーのマイページと新規投稿機能の作成に入っていこうかと思います。

マイページを作る

ログインしたらまずはマイページにリダイレクトし、マイページの内容を表示するような想定です。

ファイル名はmypage.phpとしてURLでもそれにアクセスするような形と想定しましょう。

まずはログインせずにそのページにアクセスしてしまった場合の処理から考えてみます。

前回の記事の通り、ログイン状態はセッション変数authenticationに持っていますので以下のように判断してみます。

if (!$_SESSION['authentication']) {
    echo 'ログインが必要です';
    exit;
}

文字だけ出して終了なのでちょっと不親切ですね。もっとよくするならログインページへリダイレクトしてあげる形にしてあげると良いかと思います。

この処理を抜けてきた場合はログイン済みなので、以降にログイン済みの場合の処理を書いていきます。

どんなサイトにするかは以下の記事でざっくり書いてます。

think

webエンジニアになる為にどんなwebサイト・アプリを作ったらいいか?

2019年9月21日

なのでマイページでは投稿機能と、自分の投稿一覧が表示されるような形で書いてみようかと思います。

投稿機能

これはテキストの入力欄を表示するだけなので割と簡単ですね。

【送信側】

<form action="post.php" method="post">
<div>投稿する</div>
<div><textarea name="post_text" rows="10" cols="50"></textarea></div>
<div><input type="submit" value="送信"></div>
</form>

受信側はpost.phpとして以下のように作成しました。

<?php
    session_start();
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWORD', '');
    define('DB_NAME', 'whateat');
    
    $db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if ($db->connect_error){
        echo '接続失敗';
        exit;
    }
    $db->set_charset('utf8');

    $post_text = $_POST['post_text'];
    
    if (!$post_text) {
        echo '入力されていません';
        exit;
    }
    
    $stmt = $db->prepare("INSERT INTO posts (post_id, user_id, post_text, created_at) VALUES (NULL, ?, ?, now())");
    $stmt->bind_param('ss', $_SESSION['user_id'], $post_text);
    $res = $stmt->execute();
    
    if (!$res){
        echo '登録失敗';
        exit;
    }
    
    $stmt->close();
    $db->close();
    
    header('Location: ../whateat/mypage.php');
    exit;
?>

基本的にはユーザー登録の時と同様です。

regist

【PHPでwebアプリを作る】登録フォームでユーザーの新規登録をする

2019年10月1日

登録後にマイページに飛ばして戻しています。マイページでは投稿されたテキストの内容の表示も追加して以下のような形。

<?php session_start();?>
<?php include('header.php'); ?>
<?php
    if (!$_SESSION['authentication']) {
        echo 'ログインが必要です';
        exit;
    }
    
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWORD', '');
    define('DB_NAME', 'whateat');
    
    $db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if ($db->connect_error){
        echo '接続失敗';
        exit;
    }
    $db->set_charset('utf8');
    
    $stmt = $db->prepare("select post_text, created_at from posts where user_id = ?");
    $stmt->bind_param('s', $_SESSION['user_id']);
    $stmt->execute();
    $stmt->bind_result($post_text, $created_at);
?>
<form action="post.php" method="post">
<div>投稿する</div>
<div><textarea name="post_text" rows="10" cols="50"></textarea></div>
<div><input type="submit" value="送信"></div>
</form>

<div>投稿一覧</div>
<?php
    while ($stmt->fetch()) {
        $display_text = $post_text;
        $display_text = htmlspecialchars($display_text, ENT_QUOTES);
        $display_text = $display_text . "\n" . $created_at;
        $display_text = nl2br($display_text);
        echo '<div>' . $display_text . '</div>';
    }
?>
<?php include('footer.php'); ?>

これで一応動きますが問題は山積みです。

リファクタリングは必要

実はこのコードは素のPHPだけで一番最初に何も知らない状態から始めると書きがちかなぁというあまりよくない書き方をしまくっております。

ただ最初からここはこう書きます、とだけ言われても何が悪くて何を良くするためにそう書いてるかがわからないと思うので最初は失敗する方がいいと思います。

実はLaravelなどのフレームワークを利用すれば必然的にある程度は規則化して書かなければいけなくなるので解決することも多いです。

詳細はまたその際にでも解説しますね。