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

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

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

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

Q&A

解決済

2回答

2731閲覧

mysqlでクエリーのエラーを出してくれない

isacRu

総合スコア64

MySQL

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

0グッド

0クリップ

投稿2016/07/20 06:42

編集2016/07/20 07:09

PHPで受け取ったIDとパスワードで、select * from users_info where mail='petrov@t-answer.jp' AND password=''というSQL文があったとします。ANDを使っているので、クエリーのエラーがでると思ってましたが、エラーが出ませんでした。条件式が成り立っていないはずなのに、エラーがでないのはなぜ何でしょうか??また、どうしたらエラーを出してくれるのか気になります。わかる方ご教授お願いします。

ちなみに実行結果はempty set(何もでない)でした。

[追記]

PHP

1<!DOCTYPE html> 2<html> 3<head> 4 <title>ログイン画面</title> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf8"> 6 <link rel="stylesheet" type="text/css" href="css/app_style.css"> 7</head> 8<body> 9<div> 10 <h1>ログイン</h1><br> 11 <form method='POST'> 12 <input type="email" name="mail" placeholder="Email"> 13 <input type="password" name="pass" placeholder="Password"> 14 <br> 15 <input type="submit" name="login_user" value="ログイン"> 16 </form> 17 18 <form method='POST' action='user_create.php'> 19 <input type="submit" name="new" value="新規"> 20 </form> 21 <a href="reset_pass.php">パスワード忘れた場合</a> 22 23<?php 24require ('mysql_connect.php'); 25 26if (isset($_POST['login_user'])) { 27 $mail = $_REQUEST['mail']; 28 $pass = $_REQUEST['pass']; 29 $is_login = false; 30 if (!empty($mail) AND !empty($pass)) { 31 $sql_query = mysql_query("select * from users_info where mail='" . $mail . "' and password='" . $pass . "'"); 32 33 if ($sql_query)) { 34 $is_login = true; 35 } else { 36 echo "<p align='left' style='color: red;'>メールまたはパスワードが間違っています。</p>"; 37 } 38 } else { 39 if (empty($mail)) { 40 echo "<p align='left' style='color: red;'>メールが空です。</p>"; 41 } 42 if (empty($pass)) { 43 echo "<p align='left' style='color: red;'>パスワードが空です。</p>"; 44 } 45 } 46 if ($is_login == true) { 47 header("Location: ./top.php"); 48 mysql_close($sql_connect); 49 exit; 50 } 51} 52?> 53 54</div> 55</body> 56</html>

上記の部分「if ($sql_query))」の条件式でいけるかなと思ったのですが、SQL文自体にエラーがなかったので、条件式が成立してしまっている状態です。

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

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

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

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

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

tanat

2016/07/20 06:49

現在の情報だと考えられる可能性が多すぎるので ソース全文もしくは以下部分を全て提示して下さい。 POST値の取得部分、 DB接続部分、 SQLを組み立てている部分、 クエリを実行している部分、
guest

回答2

0

ベストアンサー

クエリーのエラーがでると思ってましたが、エラーが出ませんでした。

ANDは正しい文法ですので、SELECTは0件でしたの正常リターンになったのではないでしょか
プログラムの中で0件は、NOTFOUNDエラーとするのが良いかと

投稿2016/07/20 06:50

A.Ichi

総合スコア4070

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

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

isacRu

2016/07/20 07:05

確かにその方が簡単かもしれませんね!ありがとうございます
guest

0

ソースコードの提示ありがとうございます。

require ('mysql_connect.php');

はおそらく、mysql_connect()でmysqlに接続しているだけと仮定します。

回答とは関係ありませんが、重要なので先に2点、

mysql_ 系の関数は古くて非推奨になっているので、使わないほうがいいです。*

また、現在のソースコードには深刻なSQLインジェクション脆弱性を抱えているので修正の必要があります。
具体的には攻撃者は任意のユーザに成りすましてログインすることが可能なコードになっています。

おそらく古い参考書やサイトを参考にされたかと思いますので、ここ1-2年くらいのサイト/参考書を参考にしなおされるのがいいかと思います。

質問に対する回答としては

select * from users_info where mail='petrov@t-answer.jp' AND password=''

これはSQL文としては正しいので、

PHP

1$sql_query = mysql_query("select * from users_info where mail='" . $mail . "' and password='" . $pass . "'");

$sql_queryには結果セットが返却されます。
そのため、

PHP

1if($sql_query)

は常にtrueになります。
これを回避するには、$sql_queryをfetchした結果がfalseになるか、
select count(*) from
のようなSQLにして、結果をfetchして件数が一件であることを確認するというのがよくある方法です。

今回試みようとされている
「ユーザの入力によって不正なSQL文が作られてしまうことを利用してエラーハンドリングを行う」
というアプローチは、そのままSQLインジェクション脆弱性を作りこんでしまう事になってしまうため、
ユーザが完全に信頼できる場合(例えばphpMyAdminの様に管理者以外は触らないことを前提にする場合)を除いては

セキュリティ上絶対にやってはいけないアプローチ

となります。

投稿2016/07/20 07:24

編集2016/07/20 07:28
tanat

総合スコア18709

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

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

isacRu

2016/07/20 07:27

ご回答ありがとうございます。fetchしたらうまくいきました。pdoはとりあえず後で使おうかと思います。(よくわからないし…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問