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

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

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

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

2回答

3191閲覧

ログインフォームがウンともスンとも言いません。

YukaSaku

総合スコア52

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

0クリップ

投稿2017/05/12 15:42

編集2017/05/12 16:07

汚いソースですみません。
ネットで調べながらmysqliを使って、ログインフォームを作っています。
ログインフォームの入力項目はusernameとpasswordのみです。

(registerの入力項目はusername, phone, email, password, gender(ラジオボタン)で、DBにはこの5項目以外にIDとDateが追加されます。)

PHPエラーは無いようなのですが、DBにあるユーザー名を入れても反応が無いので色んな箇所にechoを入れてみたのですがそれでも反応がありません。
sqlにつながらなかったらエラーが出るようにもしてるのですが、それも出ません。

何が悪いのでしょうか?

php

1<?php 2session_start(); 3ini_set("display_errors","on"); 4error_reporting(E_ALL | E_STRICT); 5ini_set("include_path","./includes"); 6include("dbinfo.inc"); 7 8// initialize error msg 9$errorMessage = ""; 10$cust_id = ""; 11$status = "none"; 12// when pressed login button 13if (isset($_POST['login'])) { 14 $mysqli = new mysqli($host,$user,$passwd,$dbname); 15 // $cxn = mysqli_connect($host,$user,$passwd,$dbname); 16 if ($mysqli->connect_error) { 17 echo $mysqli->connect_error; 18 exit(); 19} else { 20 //$mysqli->set_charset("utf8"); 21 if(isset($_SESSION["username"])){ 22 $status = "loggedin"; 23 echo $status; 24 echo $_SESSION["username"]; 25 //$username = $mysqli->real_escape_string($_POST['username']); 26 //password = $mysqli->real_escape_string($_POST['password']); 27 // check user ID 28 if (empty($_POST['username'])) { 29 $errorMessage = 'It is empty the User name'; 30 } else if (empty($_POST['password'])) { 31 $errorMessage = 'It is empty the Password'; 32 } 33 if (!empty($_POST['username']) && !empty($_POST['password'])) { 34 $sql = "SELECT user_id, username FROM login WHERE user_id=? AND username=?"; 35 if ($stmt = $mysqli->prepare($sql)) { 36 // 条件値をSQLにバインドする(補足参照) 37 $user_id = $row["user_id"]; 38 $username = $row["username"]; 39 $stmt->bind_param("is", $user_id, $username); 40 41$stmt->execute(); 42 43$stmt->bind_result($user_id, $username); 44 while ($stmt->fetch()) { 45 echo "ID=$user_id, NAME=$username<br>"; 46 } 47 $stmt->close(); 48 49 $stmt->store_result(); // これ忘れるとnum_rowsは0 50echo "rows=" . $stmt->num_rows; 51} 52 53 54 //結果の行数が1だったら成功 55 if($stmt->num_rows == 1){ 56 $stmt->bind_result($password); 57 while ($stmt->fetch()) { 58 if(password_verify($_POST["password"], $password)){ 59 $status = "ok"; 60 echo $status; 61 header("Location: loggedin.php"); 62 //セッションにユーザ名を保存 63 $_SESSION["username"] = $_POST["username"]; 64 break; 65 }else{ 66 $status = "failed"; 67 echo $status; 68 $errorMessage = 'Wrong User ID or Password.'; 69 break; 70 } 71 } 72 }else 73 $status = "failed"; 74 $errorMessage = 'Wrong User ID or Password.'; 75} 76}$mysqli->close(); 77 } 78} 79?> 80 81<!doctype html> 82 <head> 83 <meta charset="UTF-8"> 84 <title>Login</title> 85 </head> 86 <body> 87 <h1>Login</h1> 88 <form id="loginForm" name="loginForm" action="" method="POST"> 89 <fieldset style="border:1px dashed #66FFCC;"> 90 <legend>LoginForm</legend> 91 <div><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></div> 92 <label for="username">User ID</label> 93 <input type="text" id="username" name="username" value="<?php if (!empty($_POST["username"])) { 94 echo htmlspecialchars($_POST["username"], ENT_QUOTES);} ?>"> 95 <br> 96 <label for="password">Password</label><input type="password" id="password" name="password" value=""> 97 <br> 98 <input type="submit" id="login" name="login" value="login"> 99 </fieldset> 100 </form> 101 <br> 102 <form action="register.php"> 103 <fieldset style="border:1px dashed #66FFCC;"> 104 <legend>Registration</legend> 105 106 <input type="submit" value="Register"> 107 </fieldset> 108 </form> 109 </body> 110</html>

こちらがデータベースの構造になります。
cust_ID int(5)
username varchar(15)
phone varchar(15)
email varchar(50)
password varchar(60)
gen varchar(6)
date datetime

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

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

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

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

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

s8_chu

2017/05/12 15:54

データベースの構造を追記していただけませんか?
YukaSaku

2017/05/12 16:09

ありがとうございます。データベース構造を追加しました。最初のDBの説明も説明不足だったので少し変更しました。
guest

回答2

0

ログインフォームって、いろいろな基礎要素が詰まっていて面白いのですが、結構難しいです。
直接の回答ではないのですが、初学者向けの注意点を網羅的に説明してくれている記事があるので紹介します。

PHPでログイン機能を実装するチュートリアル #1

ちょっと難しい箇所もありますが、ログインフォームってサイトの要になるんで、そこそこスキルと知識が必要です。
記事に記述されている内容を理解して、コードを見直してみてはいかがでしょうか?

投稿2017/05/12 22:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YukaSaku

2017/05/13 03:53

ほんと難しいですよね。 リンク、ありがとうございます。じっくり見てみようと思います。
guest

0

ベストアンサー

データベースを以下のようにして、

SQL

1CREATE TABLE `login`( 2 `cust_ID` int(5) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 `username` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 4 `phone` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 5 `email` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 6 `password` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 7 `gender` varchar(6) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 8 `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP 9) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci

以下のデータを入れました

SQL

1INSERT INTO `login` (`cust_ID`, `username`, `phone`, `email`, `password`, `gender`, `date`) VALUES (NULL, 'user1', '0123456789', 'example@example.com', '$2y$10$3N3CA20gllPFdF7iTAaEXe8hUXEskBN0cMUkwAdf4A36UJeBPvcgq', 'man', CURRENT_TIMESTAMP)

そのとき、質問者さんが実現したいことは以下のように行えると思いますが、いかがでしょうか?

PHP

1<?php 2session_start(); 3ini_set("display_errors", "on"); 4error_reporting(E_ALL | E_STRICT); 5 6$errorMessage = ""; 7$cust_id = ""; 8$status = "none"; 9$rows = 0; // 追加。 10$username_result = ""; // 追加。 11 12if (isset($_POST['login'])) { 13 14 $mysqli = new mysqli("host", "username", "password", "sample01"); 15 16 if ($mysqli->connect_error) { 17 echo $mysqli->connect_error; 18 exit(); 19 } else { 20 $mysqli->set_charset("utf8"); // 追加。 21 22 /* 何がしたいかわからなかったのでコメントアウト。 23 if (isset($_SESSION["username"])) { 24 $status = "loggedin"; 25 26 if (empty($_POST['username'])) { 27 $errorMessage = 'It is empty the User name'; 28 } else { 29 if (empty($_POST['password'])) { 30 $errorMessage = 'It is empty the Password'; 31 } 32 } 33 } 34 */ 35 36 if ( 37 !empty($_POST['username']) && 38 !empty($_POST['password']) 39 ) { // 入力されたユーザーネームがあるかどうかを確認したいのではないかと推測して変更、追記をした。 40 $sql = "SELECT `username` FROM `login` WHERE `username`=?"; 41 if ($stmt = $mysqli->prepare($sql)) { 42 $stmt->bind_param("s", $_POST['username']); 43 $stmt->execute(); 44 45 $stmt->bind_result($username); 46 while ($stmt->fetch()) { 47 $username_result = $username; 48 } 49 50 $stmt->store_result(); // これ忘れるとnum_rowsは0 51 $rows = $stmt->num_rows; 52 $stmt->close(); 53 } 54 55 56 if ($rows === 1) { 57 $sql = "SELECT `password` FROM `login` WHERE `username`=?"; 58 if ($stmt = $mysqli->prepare($sql)) { 59 $stmt->bind_param("s", $username_result); 60 $stmt->execute(); 61 62 $stmt->bind_result($password_result); 63 while ($stmt->fetch()) { 64 if (password_verify($_POST["password"], $password_result)) { 65 $status = "ok"; 66 echo $status; 67 $_SESSION["username"] = $_POST["username"]; 68 header("Location: loggedin.php"); 69 } else { 70 $status = "failed"; 71 $errorMessage = 'Wrong User ID or Password.'; 72 } 73 } 74 75 $stmt->close(); 76 } 77 } else { 78 $status = "failed"; 79 $errorMessage = 'Wrong User ID or Password.'; 80 } 81 // $errorMessage = 'Wrong User ID or Password.'; 不要。 82 } else { 83 $errorMessage = "IDもしくはパスワードが未入力。"; // 追加。 84 } 85 } 86 $mysqli->close(); 87} 88?> 89<!doctype html> 90<html><!-- htmlタグの開始タグがなかった。 --> 91<head> 92 <meta charset="UTF-8"> 93 <title>Login</title> 94</head> 95<body> 96<h1>Login</h1> 97<form id="loginForm" name="loginForm" action="" method="POST"> 98 <fieldset style="border:1px dashed #66FFCC;"> 99 <legend>LoginForm</legend> 100 <div> 101 <?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?> 102 </div> 103 <label for="username">User ID</label> 104 <input type="text" id="username" name="username" value="<?php if (!empty($_POST["username"])) { 105 echo htmlspecialchars($_POST["username"], ENT_QUOTES); 106 } ?>"> 107 <br> 108 <label for="password">Password</label><input type="password" id="password" name="password" value=""> 109 <br> 110 <input type="submit" id="login" name="login" value="login"> 111 </fieldset> 112</form> 113<br> 114<form action="register.php"> 115 <fieldset style="border:1px dashed #66FFCC;"> 116 <legend>Registration</legend> 117 118 <input type="submit" value="Register"> 119 </fieldset> 120</form> 121</body> 122</html>

投稿2017/05/12 17:19

s8_chu

総合スコア14731

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

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

YukaSaku

2017/05/12 18:11 編集

追加コメントまで入れていただきまして、本当にありがとうございます。すごくわかりやすいです。 今、DBとプログラムを直して実行したのですが以下のエラーが出ました。 Warning: mysqli::__construct(): (HY000/2002): Connection timed out in **********************login.php on line 14 Connection timed out 名前は私が設定している名前"host", "user", "passwd", "dbname"に変えました。 しかし、DBに繋がって無い感じです。。。コードも名前も間違ってないと思うのですが、なぜでしょうか。
s8_chu

2017/05/12 18:18

MySQLを起動しているか、設定した項目は合っているかをもう一度確認してみていただけませんか?
YukaSaku

2017/05/12 18:37

Mysql 起動してます。設定した項目も何度も見返し、他のプログラムで利用してたdbinfo.phpから名前をコピーしてきて貼り付けましたがダメでした。 他に考えられることはありますか?
s8_chu

2017/05/12 18:42

現在の状況で考えられる原因は見当たりません。一度単純にデータベースに接続するだけのコードを記述してちゃんとデータベースと接続ができるか、といったところから確認していくと良いかと思います。
YukaSaku

2017/05/12 18:42

プログラムでは、 $mysqli = new mysqli("host", "user", "passwd", "dbname");に書いてあり、dbinfo.incの中身は <?php $host = "***ホストネーム*****.com"; $user = "*****ユーザー*******"; $passwd = "****パスワード******"; $dbname = "******DB名*********"; ?> となっています。
YukaSaku

2017/05/12 18:44

了解しました。このデータベースにつなげるためのプログラムは以前に何度も試したので、また試してみようと思います。ありがとうございます。
s8_chu

2017/05/12 18:46 編集

> プログラムでは、 $mysqli = new mysqli("host", "user", "passwd", "dbname");に書いてあり、dbinfo.incの中身は(省略) 一応確認ですが、mysqli関数の引数は"host", "user", "passwd", "dbname"としているのでしょうか?
YukaSaku

2017/05/12 19:16

よくわからないので、このように書き換えて見ました。 $mysqli = new mysqli('$host', '$user', '$passwd', '$dbname'); すると、以下のような新しいエラーが出てきました。 Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in **** Warning: mysqli::__construct(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in****** php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
YukaSaku

2017/05/12 19:19

以前同じ内容のプログラムをPDOで書いた時にはこのようなコードで接続してます。 $dsn = "mysql:dbname=".$dbname.";host=".$host; try { $pdo = new PDO($dsn, $user, $passwd, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); で、現在もきちんと動きます。
YukaSaku

2017/05/13 03:51

$mysqli = new mysqli("host", "user", "passwd", "dbname");のダブルコーテーションを取って、$host, $user...と書き直し、シングルコーテーションが、なぜか母音に付けるアクセントの点だったので、それをシングルコーテーションに書き直したところ、他のエラーが沢山出てきましたが、とりあえずプログラム上で何が起きてるのかが見えるようになったのでこの度は解決としようと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問