質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

3回答

1409閲覧

phpとmysqlでのログイン機能が実装できず困っています。

Ryoten0513

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2020/01/27 10:51

前提・実現したいこと

phpとSQLを利用して簡単な会員サイトを作りたいです。
まだDBは空なので、未登録のエラーを吐き出したいのですが、全く機能せずです。
SQLにデータを登録してみて試したりもしたのですが、原因はそこでは無いようで、、

該当のソースコード

kaiin_login.php

<?php session_start(); require_once('database.php'); // データベースアクセスファイル読み込み require_once('auth.php'); // ログイン認証ファイル読み込み $errorMessage = ""; // エラーメッセージ初期化 // ログイン処理 if (isset($_POST['login'])) { if(!empty($_POST['email']) && !empty($_POST['password'])){ if ($account=login($_POST['email'], $_POST['password'])){ $_SESSION['account'] = $account; header("Location: kaiinn_mypage.php"); // ログイン失敗時の表示 } else { $errorMessage = "ログインに失敗しました。"; } } else { $errorMessage = "メールアドレスとパスワードを入力してください。"; } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>login</title> <link rel="stylesheet" type="text/css" href="stylesheet/log_in.css"> <link rel="stylesheet" type="text/css" href="stylesheet/log_in_suma.css"> </head> <body> <div class="style_log_in_top"> <p>log in</p> </div> <div class="form"> <?php if($login){ ?> echo "ログインしました。"; <?php } else { ?> <?php echo $errorMessage; ?> <input type="text" name="email" value="" placeholder="e-mail"><br> <input type="password" name="password" value="" placeholder="password"><br> <input class="button" type="submit" name="login" value="LOG IN"> <?php } ?> </div> </body> </html>

database.php

<?php // ログイン処理 function login($email, $password){ $db = new PDO('mysql:dbname=konasa;host=localhost;charset=utf8;root;root'); $sql = "SELECT * FROM user_id WHERE email = :email AND password = :password"; $stt = $db->prepare($sql); $stt->bindParam(':email', $email); $stt->bindParam(':password', $password); $stt->execute(); while($row=$stt->fetch()){ $result['id'] = $row['id']; $result['name'] = $row['name']; $result['email'] = $row['email']; $result['password'] = $row['password']; } if(isset($result)){ return $result; } } // ログイン認証 function authCheck($email, $password){ $db = new PDO('mysql:dbname=konasa;host=localhost;charset=utf8;root;root'); $sql = "SELECT * FROM user_id WHERE email = :email AND password = :password "; $stt = $db->prepare($sql); $stt->bindParam(':email', $email); $stt->bindParam(':password', $password); $stt->execute(); while($row=$stt->fetch()){ $result['id'] = $row['id']; $result['name'] = $row['name']; $result['email'] = $row['email']; $result['password'] = $row['password']; } if(isset($result)){ return $result; } } ?>

auth.php

<?php session_start(); require_once('database.php'); // セッションにアカウント情報がある場合 if(isset($_SESSION['account'])){ // 認証処理 $account = authCheck($_SESSION['account']['email'], $_SESSION['account']['password']); if(isset($account)){ // ログインフラグをtrueにする $login = true; // セッションにユーザー情報を格納 $_SESSION['account'] = $account; } else { // ログインフラグをfalseにする $login = false; // セッションを破棄 unset($_SESSION['account']); } // セッションにアカウント情報がない場合 } else { // ログインフラグをfalseにする $login = false; } ?>

補足情報(FW/ツールのバージョンなど)

php 7.3.8
すみません、色々調べながら学習しているのですが、分かりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/27 11:46

MAMPということはmac上で作っているのかな? var_dump($db);とかvar_dump($stt);とか適宜挟み込んで意図した内容になっているかチェックしてみるとか。 apacheのerror_logもチェックする。phpコードの冒頭に ini_set( 'display_errors', 1 ); ini_set('error_reporting', E_ALL); を置くことでphp文法エラーがない限りはwebブラウザにエラー情報を表示するようになる。
m.ts10806

2020/01/27 11:47

>ログイン機能が実装できず 起きている現象が「未登録のエラーを吐き出したい」ならログイン機能ではないのでは? タイトルはなるべく要件・起きている問題に寄せてください。
m.ts10806

2020/01/27 11:48

>すみません、色々調べながら学習しているのですが、分かりません。 学習教材をご提示ください。 またPHPマニュアルはどういうときに確認されてますか?
Ryoten0513

2020/01/31 00:47

申し訳ありません。 冒頭にエラーチェックを欠かさ内容心がけます。 以後、タイトルには気をつけます。 phpマニュアルに関しては、調べていく中で使ったことのない関数を調べるのに使っています!
m.ts10806

2020/01/31 00:57

いえ、質問は編集できるので「以後」ではなく「今」対応するようにしてください。
guest

回答3

0

mysql接続まわりは、
PHPでデータベースに接続するときのまとめ - Qiita
を参考に必ずtry~catchを駆使しつつ、例外発生を捕まえてエラー情報を捕獲するようにしたいです。

それと、bindParam()使っている箇所、bindValue()に書き換えてみたらどうだろうか。

投稿2020/01/27 11:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryoten0513

2020/01/27 12:49

有り難うございます!try~catchを関数外で記述し、bindValue()に書き換えたのですが現状変わらず、 try{ $dbh=new PDO('mysql:dbname=mydb;host=localhost;charset=utf8','root','root'); }catch(PDOException $e){ echo "DBerror:".$e->getMessage(); } でエラーも出なかったので、DBの接続エラーではないみたいです。。
m.ts10806

2020/01/31 00:17

記事読んだならそれだけになるわけがないのですけど。
退会済みユーザー

退会済みユーザー

2020/01/31 00:29

おそらくget
退会済みユーザー

退会済みユーザー

2020/01/31 01:23

form要素のないフォーム・・
guest

0

$db = new PDO('mysql:dbname=konasa;host=localhost;charset=utf8;root;root');

そもそもこれではPDOすら通らないのでは。

PDO::__construct

public PDO::__construct ( string $dsn [, string $username [, string $passwd [, array $options ]]] )

[]内は「任意」という意味ですが、MySQLはユーザー名、パスワードは$dsnではなくそれ以降の引数で設定するような仕様になっています。守りましょう。
※PostgreSQLなどはDSNでもユーザー名、パスワードが設定できるようになっています。各DBで違うので仕様を適宜確認してください。

あとは「絶対にエラーが出ない」とは言い切れませんし、
DBはPHPからすると外部の仕組みであるため、別途エラーを取得する仕組みを実装しなければなりません。
それがtry-catchによるExceptionの捕捉です。

今回はPDOによるDB接続なのでPDOExceptionを捕捉するように実装しましょう。

そこできっとDB側のエラーが見れるようになるはずです。

投稿2020/01/27 12:19

編集2020/01/27 12:19
m.ts10806

総合スコア80842

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryoten0513

2020/01/27 12:50

ありがとうございます! try{ $dbh=new PDO('mysql:dbname=mydb;host=localhost;charset=utf8','root','root'); }catch(PDOException $e){ echo "DBerror:".$e->getMessage(); } を関数外に記述したのですがエラー表示がされませんでした。
m.ts10806

2020/01/27 13:04

正しい記述に直したならエラーは出ません。元のPDOの接続記述なら出るはずです。目的はExceptionを出力することではないですよね。
guest

0

自己解決

<?php if($login){ ?>
echo "ログインしました。"; <?php } else { ?> <?php echo $errorMessage; ?> <input type="text" name="email" value="" placeholder="e-mail"><br> <input type="password" name="password" value="" placeholder="password"><br> <input class="button" type="submit" name="login" value="LOG IN">
<?php } ?>

<p><?php if(!empty($errorMessage)){echo $errorMessage;}?></p> で出るようになりました。

投稿2020/01/31 00:52

Ryoten0513

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問