LoginSignup
shinozaki0815
@shinozaki0815

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DB接続ができない

解決したいこと

DB接続ができずに掲示板のユーザー名やパスワードなどのデータをDBに保存できない

例)
PHP,HTML,CSS,Docker,Smartyを使用しています。
解決方法を教えて下さい。

docker-compose.yml

services:
    app:
        build: 
            context: ./docker/php
            dockerfile: Dockerfile
        volumes:
            - ./application/docroot:/var/www/html
            - ./application/private:/var/www/private
        ports:
            - "8080:80"
        depends_on:
            - db
           
        
    db:
        build: 
            context: ./docker/mysql
            dockerfile: Dockerfile
        volumes:
            - ./docker/mysql/data:/var/lib/mysql
        ports:
            - "3306:3306"
        environment:
            -  MYSQL_ROOT_PASSWORD=pass

login.php

require_once '../private/common.php';
require_once '../private/smarty/smarty.php';

$smarty = getSmarty::getSmarty();


$smarty->display('login.tpl');

login_c.php

require_once '../private/common.php';
require_once '../private/smarty/smarty.php';

header('Location: thread_index.php');

$smarty = getSmarty::getSmarty();

$userEmail = isset($_POST['email']) ? $_POST['email'] : '';
$userPassword = isset($_POST['password']) ? $_POST['password'] : '';
if (empty($userEmail)) {
    echo $emailAlert = "<script type='text/javascript'>alert('メールアドレスを入力してください。');</script>";
    echo '<a href="login.php">戻る</a>';
} else if (empty($userPassword)){
    echo $pwAlert = "<script type='text/javascript'>alert('パスワードを入力してください。');</script><br />";
    echo '<a href="login.php">戻る</a>';
}

//DB接続
$mysqli = dbProcess::getConnection();
//DBからデータを取得
$userAccess = dbProcess::getUser($mysqli);
//DBとの接続を解除
$mysqli->close();

if (is_null($userAccess)) {
    echo $loginAlert = "<script type='text/javascript'>alert('メールアドレスまたはパスワードが正しくありません。');</script><br />";
    echo '<a href="login.php">戻る</a>';
} else {
    session_start();
    $_SESSION['userInfo'] = $userAccess;
}

common.php


if ( !defined('INCLUDES_DIR') ) {
    define( 'INCLUDES_DIR', dirname(__FILE__) );
}

class dbProcess
{

    public static function getConnection()
    {
        // データベース接続処理する        
        $mysqli = new mysqli('db','root','pass','keijiban_db');
        if($mysqli->connect_error){
            echo $mysqli->connect_error;
        }
        $mysqli->set_charset("utf8");
     
        return $mysqli;
    }

    
     public static function setUser($mysqli)
    {
        //登録するデータを用意
        $email = $_POST['signup_email'];
        $password = $_POST['signup_password'];
        $user_name = $_POST['signup_user_name'];

        // クエリ実行
        $query = "INSERT INTO users (email, password , user_name) VALUES (?, ?, ?)";

        // プリペアドステートメントの用意
        $stmt = $mysqli->prepare($query);

        // 登録するデータをセット
        $stmt->bind_param('sss', $email, $password, $user_name);

        // 登録実行
        $stmt->execute();

        return $mysqli;

    }


    public static function getUser($mysqli)
    {
        $email = $_POST['email'];
        $password = $_POST['password'];
        $stmt = $mysqli->prepare('SELECT email, user_name FROM users WHERE email = ? AND password = ? ');
        $stmt->bind_param('ss', $email, $password);
        $stmt->execute();

        //結果を取得

        $result = $stmt->get_result();

        $userAccess = null;
        if ($user = $result->fetch_array(MYSQLI_ASSOC)) {
            $userAccess = $user;
        }

        return $userAccess;
    }

smarty.php

require_once 'libs/Smarty.class.php';
    class getSmarty {
        public static function getSmarty()
        {
            $smarty = new Smarty();
            $smarty->template_dir = INCLUDES_DIR . "/smarty/templates/";
            $smarty->compile_dir =INCLUDES_DIR . "/smarty/templates_c/";
            return $smarty;
        }
    }

sign_up.php

require_once '../private/common.php';
require_once '../private/smarty/smarty.php';

$smarty = getSmarty::getSmarty();

$smarty->display('signup.tpl');

sign_up_c.php

require_once '../private/common.php';
require_once '../private/smarty/smarty.php';
require_once '../private/validation.php';

$smarty = getSmarty::getSmarty();

$userEmail = $_POST['signup_email'];
$userPassword = $_POST['signup_password'];
$userName = $_POST['signup_user_name'];
$confirmPassword = $_POST['password_cf'];

$signupValidation = Validation::signupCheck($userEmail);


if (!empty($userEmail && $userPassword && $userName && $confirmPassword) && ($userPassword == $confirmPassword) && count($signupValidation) == 0) {

$mysqli = dbProcess::getConnection();

$setUser = dbProcess::setUser($mysqli);

$mysqli->close();

} else if (count($signupValidation) > 0) {
    $smarty->assign('email_errors', $signupValidation['email']);
    $smarty->assign('password_errors', $signupValidation['password']);
    $smarty->assign('username_errors', $signupValidation['username']);
} else if (empty($userEmail || $userPassword || $userName)) {
    echo $signupAlert = "<script type='text/javascript'>alert('入力漏れがあります。もう一度ご確認ください。');</script><br />";
    echo '<a href="signup.php">戻る</a>';
    exit;
}

header('Location: ./login.php');
0

1Answer

どんな操作をしたらどんなエラーが出たかを書いてください。

貼られたコードにはデータベースに keijiban_db データベースと各テーブルを作る処理がありませんが、それは実行しましたか?

3Like

Comments

  1. @shinozaki0815

    Questioner

    エラーとしましてはブラウザ上でlocalhost:8080/login.phpやsigin.phpを開いて入力して登録ボタンを押してもボタンだけ押されて何も反応しなくて,DBの中身を確認してもデータが追加されていないのでdb接続ができていないと思いまして質問させていただきました。

    また、
    USE keijiban_db;
    DROP TABLE IF EXISTS users;

    CREATE TABLE users (
    id BIGINT AUTO_INCREMENT,
    user_name VARCHAR(30) NOT NULL,
    email VARCHAR(50) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY(id),
    UNIQUE(email)
    );これをVSCのターミナルで実行しまして作成しました。

  2. ではデータベースは正しく作られていそうですね。

    サインアップフォームに入力漏れがあるとアラートが出るようになっていますが、実際に空で送信するとアラートは出ますか?(DB 接続の直前のコードまでは正しく動いているかが知りたいです。)

  3. @shinozaki0815

    Questioner

    空で送信してもアラートは出ませんでした

  4. では DB 接続に問題があるとは限りませんね。フォームからデータを送信するところからうまく行っていないのか、アラートを出す部分だけ壊れているのか、その他の原因なのか、見ただけでは分かりませんが。

    以下のように sign_up_c.php に単純な処理を追加し、どこに原因があるか切り分けてください。(一度に全部に追加せずに、上から順に1つずつ追加しては動作確認し、 OK なら元に戻して次に進んでください。)

    • フォームから送信されたデータを無視して、適当なメッセージを出すアラートを即座に表示する
      • アラート表示がうまくいっているか確かめるため
    • フォームから送信されたメールアドレスとパスワードを(データベースに問い合わせたりせず)アラート表示する
      • フォームの送信がうまくいっているか確かめるため
    • $signupValidation = Validation::signupCheck($userEmail); の直後に $signupValidation の内容をアラート表示する
      • 正当なメールアドレスとパスワードを送信したり、不正な(空などの)値を送信したりしてみる
      • バリデーションの挙動を確かめるため

Your answer might help someone💌