どんな操作をしたらどんなエラーが出たかを書いてください。
貼られたコードにはデータベースに keijiban_db
データベースと各テーブルを作る処理がありませんが、それは実行しましたか?
DB接続ができずに掲示板のユーザー名やパスワードなどのデータをDBに保存できない
例)
PHP,HTML,CSS,Docker,Smartyを使用しています。
解決方法を教えて下さい。
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
require_once '../private/common.php';
require_once '../private/smarty/smarty.php';
$smarty = getSmarty::getSmarty();
$smarty->display('login.tpl');
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;
}
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;
}
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;
}
}
require_once '../private/common.php';
require_once '../private/smarty/smarty.php';
$smarty = getSmarty::getSmarty();
$smarty->display('signup.tpl');
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');
どんな操作をしたらどんなエラーが出たかを書いてください。
貼られたコードにはデータベースに keijiban_db
データベースと各テーブルを作る処理がありませんが、それは実行しましたか?
@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のターミナルで実行しまして作成しました。
ではデータベースは正しく作られていそうですね。
サインアップフォームに入力漏れがあるとアラートが出るようになっていますが、実際に空で送信するとアラートは出ますか?(DB 接続の直前のコードまでは正しく動いているかが知りたいです。)
@shinozaki0815
Questioner空で送信してもアラートは出ませんでした
では DB 接続に問題があるとは限りませんね。フォームからデータを送信するところからうまく行っていないのか、アラートを出す部分だけ壊れているのか、その他の原因なのか、見ただけでは分かりませんが。
以下のように sign_up_c.php に単純な処理を追加し、どこに原因があるか切り分けてください。(一度に全部に追加せずに、上から順に1つずつ追加しては動作確認し、 OK なら元に戻して次に進んでください。)
$signupValidation = Validation::signupCheck($userEmail);
の直後に $signupValidation
の内容をアラート表示する