前提・実現したいこと
DockerでPHP環境を構築してメモアプリを作成しています。
<form method="" action="">を使用してデータのやり取りを実現したいです。発生している問題・エラーメッセージ
formが実行(送信)された後、ブラウザ上でこのようなメッセージが出ます。
このサイトにアクセスできませんhttp://localhost:8080/user/action/register.php のウェブページは一時的に停止しているか、新しいウェブアドレスに移動した可能性があります。 ERR_FAILED
このURLを直接入力(画面更新ではだめ)すると指定のページは表示されます。
該当のソースコード
memo/index.php
php
1<?php 2session_start(); ?> 3 4<!DOCTYPE html> 5<html lang="ja"> 6<?php 7include_once "../common/header.php"; 8echo getHeader("ユーザー登録"); 9?> 10 11<body> 12 <div class="d-flex align-items-center justify-content-center h-100"> 13 <form action="./action/register.php" method="POST"> 14 <div class="card rounded login-card-width shadow"> 15 <div class="card-body"> 16 <?php if (isset($_SESSION["errors"])) { 17 echo '<div class="alert alert-danger" role="alert">'; 18 foreach ($_SESSION["errors"] as $error) { 19 echo "<div>{$error}</div>"; 20 } 21 echo "</div>"; 22 unset($_SESSION["errors"]); 23 } ?> 24 <div class="rounded-circle mx-auto border-gray border d-flex mt-3 icon-circle"> 25 <img src="../public/images/animal_stand_zou.png" class="w-75 mx-auto p-2" alt="icon" /> 26 </div> 27 <div class="d-flex justify-content-center"> 28 <div class="mt-3 h2">SimpleMemo</div> 29 </div> 30 <div class="row mt-3"> 31 <div class="offset-2 col-8 offset-2"> 32 <label class="input-group w-100"> 33 <span class="input-group-prepend"> 34 <span class="input-group-text"><i class="fas fa-file-signature"></i></span> 35 </span> 36 <input type="text" name="user_name" class="form-control" placeholder="ユーザー名" 37 autocomplete="off" maxlength="255" /> 38 </label> 39 <label class="input-group w-100"> 40 <span class="input-group-prepend"> 41 <span class="input-group-text"><i class="far fa-envelope"></i></span> 42 </span> 43 <input type="text" name="user_email" class="form-control" placeholder="メールアドレス" 44 autocomplete="off" maxlength="255" /> 45 </label> 46 <label class="input-group w-100"> 47 <span class="input-group-prepend"> 48 <span class="input-group-text"><i class="fas fa-key"></i></span> 49 </span> 50 <input type="password" name="user_password" class="form-control" placeholder="パスワード" 51 autocomplete="off" maxlength="255" /> 52 </label> 53 <button type="submit" class="form-control btn btn-success"> 54 登録する 55 </button> 56 </div> 57 </div> 58 </div> 59 </div> 60 </form> 61 </div> 62</body> 63 64</html>
user/action/register.php
php
1<?php 2session_start(); 3require "../../common/validation.php"; 4require "../../common/database.php"; 5 6// パラメータ取得 7$user_name = $_POST["user_name"]; 8$user_email = $_POST["user_email"]; 9$user_password = $_POST["user_password"]; 10 11// バリデーション 12$_SESSION["errors"] = []; 13 14// - 空チェック 15emptyCheck($_SESSION["errors"], $user_name, "ユーザー名を入力してください。"); 16emptyCheck( 17 $_SESSION["errors"], 18 $user_email, 19 "メールアドレスを入力してください。" 20); 21emptyCheck( 22 $_SESSION["errors"], 23 $user_password, 24 "パスワードを入力してください。" 25); 26 27// - 文字数チェック 28stringMaxSizeCheck( 29 $_SESSION["errors"], 30 $user_name, 31 "ユーザー名は255文字以内で入力してください。" 32); 33stringMaxSizeCheck( 34 $_SESSION["errors"], 35 $user_email, 36 "メールアドレスは255文字以内で入力してください。" 37); 38stringMaxSizeCheck( 39 $_SESSION["errors"], 40 $user_password, 41 "パスワードは255文字以内で入力してください。" 42); 43stringMaxSizeCheck( 44 $_SESSION["errors"], 45 $user_password, 46 "パスワードは8文字以上で入力してください。" 47); 48 49if (!$_SESSION["errors"]) { 50 // - メールアドレスチェック 51 mailAddressCheck( 52 $_SESSION["errors"], 53 $user_email, 54 "正しいメールアドレスを入力してください。" 55 ); 56 57 // - ユーザー名・パスワード半角英数チェック 58 halfAlphanumericCheck( 59 $_SESSION["errors"], 60 $user_name, 61 "ユーザー名は半角英数字で入力してください。" 62 ); 63 halfAlphanumericCheck( 64 $_SESSION["errors"], 65 $user_password, 66 "パスワードは半角英数字で入力してください。" 67 ); 68 69 // - メールアドレス重複チェック 70 mailAddressDuplicationCheck( 71 $_SESSION["errors"], 72 $user_email, 73 "既に登録されているメールアドレスです。" 74 ); 75} 76 77if ($_SESSION["errors"]) { 78 header("Location: ../../user/"); 79 exit(); 80} 81 82// DB接続処理 83$database_handler = getDatabaseConnection(); 84 85try { 86 if ( 87 $statement = $database_handler->prepare( 88 "INSERT INTO users (name, email, password) VALUES (:name, :email, :password)" 89 ) 90 ) { 91 $password = password_hash($user_password, PASSWORD_DEFAULT); 92 93 $statement->bindParam(":name", htmlspecialchars($user_name)); 94 $statement->bindParam(":email", $user_email); 95 $statement->bindParam(":password", $password); 96 $statement->execute(); 97 } 98} catch (Throwable $e) { 99 echo $e->getMessage(); 100 exit(); 101} 102 103// メモ投稿画面にリダイレクト 104header("Location: ../../user/"); 105exit(); 106
common/database.php
php
1<?php 2/** 3 * PDOを使ってデータベースに接続する 4 * @return PDO 5 */ 6function getDatabaseConnection() 7{ 8 try { 9 $database_handler = new PDO( 10 "mysql:host=db;dbname=simple_memo;charset=utf8mb4", 11 "root", 12 "password" 13 ); 14 } catch (PDOException $e) { 15 echo "DB接続に失敗しました。<br/>"; 16 echo $e->getMessage(); 17 exit(); 18 } 19 return $database_handler; 20}
common/validation.php
php
1<?php 2/** 3 * 空チェック 4 * @param $errors 5 * @param $check_value 6 * @param $message 7 */ 8function emptyCheck(&$errors, $check_value, $message) 9{ 10 if (empty(trim($check_value))) { 11 array_push($errors, $message); 12 } 13} 14 15/** 16 * 最小文字数チェック 17 * @param $errors 18 * @param $check_value 19 * @param $message 20 * @param int $min_size 21 */ 22function stringMinSizeCheck(&$errors, $check_value, $message, $min_size = 8) 23{ 24 if (mb_strlen($check_value) < $min_size) { 25 array_push($errors, $message); 26 } 27} 28 29/** 30 * 最大文字数チェック 31 * @param $errors 32 * @param $check_value 33 * @param $message 34 * @param int $max_size 35 */ 36function stringMaxSizeCheck(&$errors, $check_value, $message, $max_size = 255) 37{ 38 if ($max_size < mb_strlen($check_value)) { 39 array_push($errors, $message); 40 } 41} 42 43/** 44 * メールアドレスチェック 45 * @param $errors 46 * @param $check_value 47 * @param $message 48 */ 49function mailAddressCheck(&$errors, $check_value, $message) 50{ 51 if (filter_var($check_value, FILTER_VALIDATE_EMAIL) == false) { 52 array_push($errors, $message); 53 } 54} 55 56/** 57 * 半角英数字チェック 58 * @param $errors 59 * @param $check_value 60 * @param $message 61 */ 62function halfAlphanumericCheck(&$errors, $check_value, $message) 63{ 64 if (preg_match("/^[a-zA-Z0-9]+$/", $check_value) == false) { 65 array_push($errors, $message); 66 } 67} 68 69/** 70 * メールアドレス重複チェック 71 * @param $errors 72 * @param $check_value 73 * @param $message 74 */ 75function mailAddressDuplicationCheck(&$errors, $check_value, $message) 76{ 77 $database_handler = getDatabaseConnection(); 78 if ( 79 $statement = $database_handler->prepare( 80 "SELECT id FROM users WHERE email = :user_email" 81 ) 82 ) { 83 $statement->bindParam(":user_email", $check_value); 84 $statement->execute(); 85 } 86 87 $result = $statement->fetch(PDO::FETCH_ASSOC); 88 if ($result) { 89 array_push($errors, $message); 90 } 91} 92
common/header.php
php
1<?php 2/** 3 * タイトルを指定してヘッダーを作成する 4 * @param $title 5 * @return string 6 */ 7function getHeader($title) 8{ 9 return <<<EOF 10 <head> 11 <meta charset="utf-8"/> 12 <title>SimpleMemo | {$title}</title> 13 <link rel="stylesheet" type="text/css" href="../public/css/bootstrap.min.css" /> 14 <link rel="stylesheet" type="text/css" href="../public/css/main.css" /> 15 <script defer src="../public/js/all.js"></script> 16 </head> 17EOF; 18} 19
試したこと
- register.phpの記載方法が間違っているのでは?と思い、別ページを指定したがダメそうなので、formに問題があるのでは?と断定しました。
補足情報(FW/ツールのバージョンなど)
windows10 Homeを使用。
dockerを使用しています。
- mysql:5.7
- nginx:1.19.1
- phpmyadmin:5.0.0
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 84db2be12f25 mysql:5.7 "docker-entrypoint.s…" 2 days ago Up 22 minutes 33060/tcp, 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp php_simple_memo_mysql 9ba9c7209771 nginx:1.19.1 "/docker-entrypoint.…" 2 days ago Up 22 minutes 80/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp php_simple_memo_nginx 84a64e8d46fd phpmyadmin/phpmyadmin:5.0.0 "/docker-entrypoint.…" 2 days ago Up 22 minutes 0.0.0.0:8081->80/tcp, :::8081->80/tcp php_simple_memo_phpmyadmin 9fcad756694f docker_memo_php "docker-php-entrypoi…" 2 days ago Up 22 minutes 9000/tcp
以前質問させていただいた通り、mysqlでエラーが出ていてlogを出力する為の
- ./mysql/log/:/var/log/mysql
こちらの記述はコメントアウトしてあります。
それ以外は記述におかしい所は発見できませんでした。
回答1件
あなたの回答
tips
プレビュー