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

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

ただいまの
回答率

90.51%

  • PHP

    24042questions

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

  • MySQL

    7000questions

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

  • mysqli

    178questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 424

ijuya_yika

score 40

 前提・実現したいこと

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

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

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

 該当のソースコード

ログイン画面のコード(一部のみ表示)
<div id="login" class="tabcontent">
  <h3>Login</h3>
  <form action="login.php" method="post">
    <input type="text" name="userPassword" placeholder="UserID">
    <input type="text" name="password" placeholder="Password">
    <input type="submit" value="Submit">
  </form> 
</div>
ログイン用のボタンが押された時のコード(login.php)
<?php
/* 変数を定義 */
$host = "localhost";
$user = "root";
$pass = "1234";
$DBName = "DB1";

/* DBに接続 */
$mysqli = new mysqli($host, $user, $pass, $DBName);
if($mysqli->connect_error){
    echo $mysqli->connect_error;
    exit();
} else {
    $mysqli->set_charset("utf8");
    echo "Connect success!";
}

/* クエリを準備 */
$UID=$_POST["userPassword"];
$pass=$_POST["password"];
$query = "select exists(select * from db where userID='$UID' and password='$pass')";
echo "id : ".$UID . "<br>";
echo "pass : ".$pass . "<br>";
echo "query : ".$query . "<br>";
echo $pass. "<br>";

$result = $mysqli->query($query);
echo "result : $result"."<br>";
if(!$result){
    echo "Could not find user: $UID." . "<br>";
}
else {
    echo "User $UID have successfully logged in!!" . "<br>";
}
/* DBとの接続を解除 */
$result->close();
$mysqli->close();

?>
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)

/* query DB */
$UID=$_POST["userPassword"];
$pass=$_POST["password"];
$query = "select exists(select * from db where userID='$UID' and password='$pass')";
$result = $mysqli->query($query);
if($result->fetch_assoc()){
    echo "User $UID have successfully logged in!!" . "<br>";
}
else {
    echo "Could not find user $UID" . "<br>";
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

mysqli::queryの戻り値は

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

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

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

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

var_dump($result);


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

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

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

$query = mysqli_query($dbl, "SELECT * FROM `tblUser` WHERE email='".$email."'");

    if (!$query)
    {
        die('Error: ' . mysqli_error($dbl));
    }

if(mysqli_num_rows($query) > 0){

    echo "email already exists";

}else{

    // do something

}

質問の本論ではありませんが、提示されているコードは致命的な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/30 07:09

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    24042questions

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

  • MySQL

    7000questions

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

  • mysqli

    178questions

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

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