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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

1回答

6485閲覧

ログイン画面からユーザIDとパスワードを受け取り、データベースにそれらがある場合のみログインしたい

ijuya_yika

総合スコア50

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グッド

1クリップ

投稿2018/10/29 17:12

編集2018/10/29 22:13

前提・実現したいこと

PHPMySQLを使って簡単なログイン画面を作っています。
ユーザからIDとパスワードを受け取り、データベースにそれらがある場合のみログインする機能を持たせたいです。

発生している問題・エラーメッセージ

IDとパスワードに関わらずログインが成功してしまいます。

該当のソースコード

######ログイン画面のコード(一部のみ表示)

PHP

1<div id="login" class="tabcontent"> 2 <h3>Login</h3> 3 <form action="login.php" method="post"> 4 <input type="text" name="userPassword" placeholder="UserID"> 5 <input type="text" name="password" placeholder="Password"> 6 <input type="submit" value="Submit"> 7 </form> 8</div>

######ログイン用のボタンが押された時のコード(login.php)

PHP

1<?php 2/* 変数を定義 */ 3$host = "localhost"; 4$user = "root"; 5$pass = "1234"; 6$DBName = "DB1"; 7 8/* DBに接続 */ 9$mysqli = new mysqli($host, $user, $pass, $DBName); 10if($mysqli->connect_error){ 11 echo $mysqli->connect_error; 12 exit(); 13} else { 14 $mysqli->set_charset("utf8"); 15 echo "Connect success!"; 16} 17 18/* クエリを準備 */ 19$UID=$_POST["userPassword"]; 20$pass=$_POST["password"]; 21$query = "select exists(select * from db where userID='$UID' and password='$pass')"; 22echo "id : ".$UID . "<br>"; 23echo "pass : ".$pass . "<br>"; 24echo "query : ".$query . "<br>"; 25echo $pass. "<br>"; 26 27$result = $mysqli->query($query); 28echo "result : $result"."<br>"; 29if(!$result){ 30 echo "Could not find user: $UID." . "<br>"; 31} 32else { 33 echo "User $UID have successfully logged in!!" . "<br>"; 34} 35/* DBとの接続を解除 */ 36$result->close(); 37$mysqli->close(); 38 39?> 40

######MySQLのテーブル

+------------------+----------+-----------+---------------+----------+---------------+ | name | phoneNum | address | email | password | userID | +------------------+----------+-----------+---------------+----------+---------------+ | a | b | c | d | e | 5bd70d70add61 | +------------------+----------+-----------+---------------+----------+---------------+

######htmlに表示される内容(ID:5bd70d70add61, pass:XXXXXでログインするがXXXXXのパスワードはテーブルに無いにも関わらずログインに成功)

Connect success! id : 5bd70d70add61 pass : XXXXX query : select exists (select * from customers where userID='5bd70d70add61' and password='XXXXX') User 5bd70d70add61 have successfully logged in!!

試したこと

mysql"select exists(select * from db where userID='$UID' and password='$pass')"を試した所実際に機能しているみたいです。
$result変数の値を出力した所何も入っていなかったので$result = $mysqli->query($query);に問題があるのでしょうか?

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

mysql -V => mysql Ver 14.14 Distrib 5.7.23
php -V => PHP 7.0.32-0ubuntu0.16.04.1
OS => Linux 4.4.0-133-generic #159-Ubuntu

###追記
指摘を受けた後に直したコード(login.php)

PHP

1/* query DB */ 2$UID=$_POST["userPassword"]; 3$pass=$_POST["password"]; 4$query = "select exists(select * from db where userID='$UID' and password='$pass')"; 5$result = $mysqli->query($query); 6if($result->fetch_assoc()){ 7 echo "User $UID have successfully logged in!!" . "<br>"; 8} 9else { 10 echo "Could not find user $UID" . "<br>"; 11} 12

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

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

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

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

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

guest

回答1

0

ベストアンサー

mysqli::queryの戻り値は

返り値 ¶

失敗した場合に FALSE を返します。 SELECT, SHOW, DESCRIBE あるいは EXPLAIN が成功した場合は、mysqli_query() は mysqli_result オブジェクトを返します。それ以外のクエリが成功した場合は、 mysqli_query() は TRUE を返します。

困ったときはまず公式リファレンスを参照するのが解決の近道です
なので

if(!$result){
でSELECTにマッチする結果があるかどうかの判定は出来ません。

$result変数の値を出力した所何も入っていなかったので$result = $mysqli->query($query);に問題があるのでしょうか?

PHP

1var_dump($result); 2

とすれば、mysqli_resultオブジェクトが格納されていることがわかると思います。

mysqli_result
mysqli_result::fetch_assocmysqli_result::$num_rowsを使ってSQLの実行結果が期待通りかを判定する必要があります。

参考:check if row exists with mysql
参考元から引用(セキュリティ的にはやってはいけないですが、質問内容に近いコード)

PHP

1 2$query = mysqli_query($dbl, "SELECT * FROM `tblUser` WHERE email='".$email."'"); 3 4 if (!$query) 5 { 6 die('Error: ' . mysqli_error($dbl)); 7 } 8 9if(mysqli_num_rows($query) > 0){ 10 11 echo "email already exists"; 12 13}else{ 14 15 // do something 16 17} 18

質問の本論ではありませんが、提示されているコードは致命的なSQLインジェクション脆弱性があるので、
mysqil::prepare
を使って対応する方法も学習されることをお勧めします。
詳細はPHP SQLインジェクション対策 プリペアードステートメントあたりで調べてみて下さい。

(前述の参考元のYou can also use mysqli_ with a prepared statement method:Or a PDO method with a prepared statement:のコードがプリペアードステートメントを使用しています。)

投稿2018/10/29 17:43

tanat

総合スコア18713

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

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

ijuya_yika

2018/10/29 22:09

ご回答ありがとうございます。おかげで直せました。公式レファレンスも今後参考にいたしますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問