

## 前提・実現したいこと

phpを使って、ログインした後に画像投稿フォームに飛んで画像を投稿できる機能を作っているのですが、
ログインした後に画像投稿フォームに飛ぶのですが、投稿した後に、別のページに飛んで、’アップロードされました。’などの表示がされ”戻る”ボタンを押すと、毎回ログインするページに飛び再度ログインしないとちゃんと投稿されているのか見れません。
”戻る”を押した後再度ログインしなくても画像投稿フォームに戻るにはどうしたらいいですか。ご教授ください。

## 発生している問題・エラーメッセージ

一度ログインしているのに画像投稿後再度ログインを求められる

該当のソースコード  
login_form.php

[code]

    <?php
    session_start();
    
    ini_set( 'display_errors', 1);
    ini_set( 'error_reporting', E_ALL );
    
    require_once '../classes/UserLogic.php';
    
    $result = UserLogic::checkLogin();
    if($result) {
    header('Location: mypage.php');
    return;
    }
    
    $err = $_SESSION;
    
    $_SESSION = array();
    session_destroy();
    ?>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ログイン画面</title> 
    </head>
    <body>
    <div>
    <img src="../img00/travel.jpg">
    <h2>ログインフォーム</h2>
    <?php if (isset($err['msg'])) : ?>
    <p><?php echo $err['msg']; ?></p>
    <?php endif; ?>
    <form action="../upload/upload_form.php" method="POST">
    <div class="email">
    <p>
    <label for="email">メールアドレス:</label>
    <input type="email" name ="email">
    <?php if (isset($err['email'])) : ?>
    <p><?php echo $err['email']; ?></p>
    <?php endif; ?>
    </p>
    </div>
    <p>
    <label for="username">パスワード:</label>
    <input type="text" name ="password">
    <?php if (isset($err['password'])) : ?>
    <p><?php echo $err['password']; ?></p>
    <?php endif; ?>
    </p>
    <p>
    <input type="submit" value="ログイン">
    </p>
    </form>
    <a href="signup_form.php">新規登録はこちら</a>
    <p></p>
    </div>
    <style>
    img {margin-top: 10px;}
    div {text-align: center;}
    .email {margin-right: 37px;}
    body {background-color: #CCFFFF;}
    h2, label, input {margin-top: 20px;}
    </style>
    </body>
    </html>
    
[/code]

upload_form.php

[code]

    <?php
    ini_set( 'display_errors', 1);
    ini_set( 'error_reporting', E_ALL );
    
    session_start();
    // フォーム
    
    require_once '../classes/UserLogic.php';
    require_once '../dbc/dbc.php';
    require_once "dbc.php";
    $files = getAllFile();
    
    //エラーメッセージ
    $err = [];
    
    //バリデーション
    if(!$email = filter_input(INPUT_POST, 'email')) {
    $err['email'] = 'メールアドレスを記入してください。';
    }
    if(!$password = filter_input(INPUT_POST, 'password')
    ) {
    $err['password'] = 'パスワードを記入してください。';
    }
    
    if (count($err) > 0) {
    // エラーがあった場合は戻す
    $_SESSION = $err;
    header('Location: ../public/login_form.php');
    return;
    }
    //ログイン成功時の処理
    $result = UserLogic::login($email, $password);
    //ログイン失敗時の処理
    if (!$result) {
    header('Location: ../public/login_form.php');
    return;
    }
    
    ?>
    
    <!-- ①フォームの説明 -->
    <!-- ②$_FILEの確認 -->
    <!-- ③バリデーション -->
    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>アップロードフォーム</title>
    </head>
    <style>
    body {
    padding: 30px;
    margin: 0 auto;
    width: 50%;
    background-color: #CCFFFF;
    }
    textarea {
    width: 98%;
    height: 60px;
    }
    .file-up {
    margin-bottom: 10px;
    }
    .submit {
    text-align: right;
    }
    .btn {
    display: inline-block;
    border-radius: 3px;
    font-size: 18px;
    background: #67c5ff;
    border: 2px solid #67c5ff;
    padding: 5px 10px;
    color: #fff;
    cursor: pointer;
    }
    </style>
    
    <body>
    <form enctype="multipart/form-data" action="./file_upload.php" method="POST">
    <div class="file-up">
    <input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
    <input name="img" type="file" accept="image/*" />
    <a href="../public/mypage.php">マイページへ</a>
    </div>
    
    <div>
    <textarea
    name="caption"
    placeholder="キャプション（140文字以下）"
    id="caption"
    ></textarea>
    </div>
    
    <div class="submit">
    <input type="submit" value="送信" class="btn" />
    </div>
    </form>
    <div>
    <?php foreach($files as $file): ?>
    <img src=<?php echo "{$file['file_path']}"; ?> alt="">
    <p><?php echo h("{$file['description']}"); ?></p>
    <?php endforeach; ?>
    </div>
    </body>
    </html>
    
[/code]

file_upload.php

[code]

    <?php
    ini_set( 'display_errors', 1);
    ini_set( 'error_reporting', E_ALL );
    
    session_start();
    
    // require_once '../classes/UserLogic.php';
    
    //①ファイルの保存
    //②DB接続
    //③DBへの保存
    require_once "../upload/dbc.php";
    
    // ファイル関連の取得
    $file = $_FILES['img'];
    $filename = basename($file['name']);
    $tmp_path = $file['tmp_name'];
    $file_err = $file['error'];
    $filesize = $file['size'];
    $upload_dir = 'images/';
    $save_filename = date('YmdHis') . $filename;
    $err_msgs = array();
    $save_path = $upload_dir. $save_filename;
    
    // キャプションを取得
    $caption = filter_input(INPUT_POST, 'caption',
    FILTER_SANITIZE_SPECIAL_CHARS);
    
    //キャプションのバリデーション
    //未入力
    if(empty($caption)) {
    array_push($err_msgs, 'キャプションを入力してください。');
    echo '<br>';
    }
    //140文字か
    if(strlen($caption) > 140) {
    echo 'キャプションは１４０文字以内にしてください。';
    echo '<br>';
    }
    
    //ファイルのバリデーション
    // ファイルサイズが１MB未満か
    if($filesize > 1048576 || $file_err == 2) {
    echo 'ファイルサイズは１MB未満にしてください。';
    echo '<br>';
    }
    
    //拡張は画像形式か
    $allow_ext = array('jpg', 'jpeg', 'png');
    $file_ext = pathinfo($filename, PATHINFO_EXTENSION);
    
    if(!in_array(strtolower($file_ext), $allow_ext)) {
    array_push($err_msgs, '画像ファイルを添付してください。');
    echo '<br>';
    }
    
    if (count($err_msgs) === 0) {
    //ファイルはあるかどうか？
    if (is_uploaded_file($tmp_path)) {
    if (move_uploaded_file($tmp_path, $save_path)) {
    echo $filename . 'を'. $upload_dir. 'アップしました。';
    // DBに保存（ファイル名、ファイルパス、キャプション）
    $result = fileSave($filename, $save_path, $caption);
    
    if ($result) {
    echo'データベースに保存しました！';
    } else {
    echo 'データベースへの保存に失敗しました！';
    }
    } else {
    echo 'ファイルが保存できませんでした。';
    }
    } else {
    echo 'ファイルが選択されていません。';
    echo '<br>';
    }
    } else {
    foreach($err_msgs as $msg) {
    echo $msg;
    echo '<br>';
    }
    
    /// 更新日時順で並び替える関数
    $sort_by_lastmod = function($a, $b) {
    return filemtime($b) - filemtime($a);
    };
    
    /// 並び替えして出力
    $files = glob( 'path/to/files/*.*' );
    usort( $files, $sort_by_lastmod );
    foreach( $files as $file ) {
    $timestamp = date('Y-m-d H:i:s', filemtime( $file ) );
    echo basename( $file ) . ' : ' . $timestamp . '<br>'; 
    }
    
    }
    ?>
    <a href= "upload_form.php">次ページ</a>
    
    <style>
    body {
    background-color: #CCFFFF;
    }
    </style>
    
[/code]

UserLogic.php

[code]

    <?php
    ini_set( 'display_errors', 1);
    ini_set( 'error_reporting', E_ALL );
    
    require_once '../dbconnect.php';
    
    class UserLogic
    {
    /**
    
    ユーザーを登録する
    @param array $userData
    @return array|bool $result|false
    */
    public static function createUser($userData)
    {
    $result = false;
    $sql = 'INSERT INTO users (name, email, password) VALUES (?, ?, ?)';
    
    //ユーザーデータを配列に入れる
    $arr = [];
    $arr[] = $userData['username'];
    $arr[] = $userData['email'];
    $arr[] = password_hash($userData['password'],
    PASSWORD_DEFAULT);
    
    try {
    $stmt = connect()->prepare($sql);
    $result = $stmt->execute($arr);  
    return $result;
    } catch(\Exception $e) {
    return $result;
    }
    }
    
    /**
    
    ログイン処理
    @param string $email
    @param string $password
    @return bool $result
    */
    public static function login($email, $password)
    {
    // 結果
    $result = false;
    // ユーザーをemailから検索して取得
    $user = self::getUserByEmail($email); 
    if (!$user) {
    $_SESSION['msg'] = 'emailが一致しません。';
    return $result;
    }
    
    // パスワードの照会
    if (password_verify($password, $user['password'])) {
    // ログイン成功
    session_regenerate_id(true);
    $_SESSION['login_user'] = $user;
    $result = true;
    return $result;
    }
    
    $_SESSION['msg'] = 'パスワードが一致しません。';
    return $result;
    }
    
    /**
    
    emailからユーザーを取得
    @param string $email
    @return array|bool $user|false
    */
    public static function getUserByEmail($email)
    {
    //SQLの準備
    //SQLの実行
    //SQLの結果を返す
    $sql = 'SELECT * FROM users WHERE email = ?';
    //emailを配列に入れる
    $arr = [];
    $arr[] = $email;
    
    try {
    $stmt = connect()->prepare($sql);
    $stmt->execute($arr);
    //SQLの結果を返す
    $user = $stmt->fetch();
    return $user;
    } catch(\Exception $e) {
    return false;
    }
    }
    
    /**
    
    ログインチェック
    @param void
    @return bool $result
    */
    public static function checkLogin()
    {
    $result = false;
    //セッションにログインユーザーが入っていなかったらfalse
    if (isset($_SESSION['login_user']) && $_SESSION['login_user'] ['id'] > 0) {
    return $result = true;
    }
    
    return $result;
    }
    
    /**
    
    ログアウト処理
    */
    public static function logout()
    {
    $_SESSION = array();
    session_destroy();
    }
    }
    
    
[/code]

php html css MAMP を使いました

## 試したこと

ぐぐったりyahoo知恵袋を使いました。

これは、youtubeに上がっていた”ログインフォーム”と、”画像投稿フォーム”を自分なりにくっつけたのですが、つまずいたので初めて質問させていただきました。


CC BY-SA 4.0
2020-11-29T11:46:51.427
72272
2023-09-22T07:05:45.693
2020-11-29T12:14:32.913
32986
42921
question
php html
phpを使ってログインした後の画面移動


ソースコードの問題というよりも  
画面遷移と画面ごとの処理の責任範囲やログイン認証回りの理解が進んでいないのかなという印象です。

ぜひまずはサーバの処理とユーザの処理をきちんと分けてユースケースを確認すると動きがおかしいことに気づきましょう。

（０）ユーザ login_form.phpへアクセスする  
（１）サーバ login_form.phpでログイン画面を表示する  
（２）ユーザ IDパスワードをupload_form.phpへ送信する  
（３）サーバ upload_form.phpでIDパスワードの認証をする。成功すればファイルアップロード画面を表示する。失敗すれば（１）へ  
（４）ユーザ ファイルをfile_upload.phpへ送信する  
（５）サーバ file_upload.phpでファイルを受け取ってファイルを表示しつつupload_form.phpへのリンクを表示する  
（６）ユーザ （３）へアクセスする。

で（３）にアクセスするとIDパスワードがないので（１）に行っちゃいますね。

なので（３）のときにログインしていれば、IDパスワードの認証を飛ばす処理をする必要がありそうですね。


CC BY-SA 4.0
2020-11-30T01:14:08.290
72281
2020-11-30T01:14:08.290
22665
72272
answer