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

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

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

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

Q&A

4回答

3002閲覧

【PHP】ログインフォームとDBに関しての質問

star24star

総合スコア115

PHP

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

0グッド

0クリップ

投稿2015/05/12 04:23

ログイン成功→db.php
ログイン失敗→log001.phpをリダイレクト
というプログラムを書いています。

問題点
1.空欄のままでもログイン成功してしまう
2.未入力のエラーメッセージが表示できない
3.if ($row = $select_query)をif ($row = $login)に変えると質問1は免れるが
IDかPWどちらかを入力してログインボタンを押しリダイレクトされた場合、入力したデータが消えてしまう
(SESSIONが上手く使えていないのが原因?)

ご指摘、ご教授のほど宜しくお願い致します

ID=メールアドレス(a_mail)
PW=(apass)

lang

1<?php 2// セッション開始 3session_start(); 4 5/* 6if(!isset($_POST['name'])){ 7 $_POST['name'] = null; 8} 9$_SESSION['a_mail'] = $_POST['a_mail']; 10unset($_SESSION['error_mail']); 11if(!isset($_SESSION['a_mail'])){ 12 $_SESSION['a_mail'] = null; 13} 14$_SESSION['a_mail']; 15unset($_SESSION['error_mail']); 16//名前 17if($_POST['a_mail']==""){ 18 $_SESSION['error_mail']=1; 19} 20*/ 21require_once("db_class.php"); 22if(isset($_POST['a_mail'])) 23{ 24 $a_mail = $_POST['a_mail']; 25} 26if(isset($_POST['a_pass'])) 27{ 28 $a_pass = $_POST['a_pass']; 29} 30if(isset($_POST['a_no'])) 31{ 32 $a_no = $_POST['a_no']; 33} 34$a_no=""; 35 36//DBクラスの読み込み 37if (isset($_SESSION['a'])){ 38 // セッションにユーザIDがある=ログインしている 39 // トップページに遷移する 40 header('Location: db.php'); 41} 42 // IDとPWが送信されたときDBに接続 43if (isset($_POST['a_mail']) && isset($_POST['a_pass'])) 44{ 45 // データベースに接続 46 $SQL = new DB(); 47 $select_query = "SELECT * FROM admin_tbl WHERE a_mail='{$a_mail}' AND a_pass='{$a_pass}'"; 48 // クエリの取得と実行 49 $login = $SQL->QueryEx($select_query); 50 51 // 【正】SESSIONへ格納・一覧画面へ遷移 【誤】ログインフォームへ遷移 52 if ($row = $select_query) 53 { 54 //【正】のとき 55 $_SESSION['a'] = $row['a']; 56 header('Location: db.php'); 57 exit(); 58 } else { 59 //【誤】のとき 60 //メールアドレスの未入力メッセージ 61 if (isset($_SESSION['error_mail']) && $_SESSION['error_mail'] == 1) { 62 $error_mail = "名前にエラーがあります<br>"; 63 } else { 64 $error_name = ""; 65 } 66 //パスワードの未入力メッセージ 67 if (isset($_SESSION['error_pass']) && $_SESSION['error_pass'] == 1) { 68 $error_pass = "名前にエラーがあります<br>"; 69 } else { 70 $error_pass = ""; 71 } 72 73 //メールアドレスが未記入のとき 74 if($_POST['a_mail']==""){ 75 $_SESSION['error_message']=1; 76 } 77 //パスワードが未記入のとき 78 if($_POST['a_pass']==""){ 79 $_SESSION['error_message']=1; 80 } 81 if($_POST['a_mail']==""||$_POST['a_pass']==""){ 82 header("location: http://localhost/kadai4/log001.php"); 83 exit; 84 } 85 } 86} 87 88//データベースの切断 89//$SQL->Close(); 90 91?> 92<html> 93<body> 94<h3>お問い合わせ</h3> 95<head> 96 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 97 <title>ログイン</title> 98</head> 99<body> 100 <h1>ログインフォーム</h1> 101 <form action="log001.php" method="post"> 102 <p>ユーザ名:</p> 103 <?php print($error_mail); ?><br> 104 <input type="text" name="a_mail" value="<?php echo $a_mail=$_SESSION['a_mail']; ?>"></p> 105 <p>パスワード:</p> 106 <?php print($error_pass); ?><br> 107 <input type="password" name="a_pass" value="<?php echo $a_mail=$_SESSION['a_mail']; ?>"> 108 <p><input type="submit" value="ログイン"> 109 110 </form> 111</body> 112</html> 113

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

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

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

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

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

guest

回答4

0

お問い合わせフォームなどでしたら詳細なバリデーション必須ですが、今回はログインできるかどうか、認証機能なのでもう少しシンプルでもいいのかなと思いサンプルを書いてみました。
※テストしてないのであくまでもイメージだと思って下さい。

lang

1<?php 2require_once("db_class.php"); 3 4session_start(); 5 6if(isset($_POST)) { 7 8 $SQL = new DB(); 9 $select_query = "SELECT * FROM admin_tbl WHERE a_mail='{$a_mail}' AND a_pass='{$a_pass}'"; 10 11 $login = $SQL->QueryEx($select_query); 12 if($login) { 13 $_SESSION['user'] = $login; 14 header('Location: db.php'); 15 } 16 $_SESSION['error'] = "IDまたはパスワードが違います"; 17 header("location: http://localhost/kadai4/log001.php"); 18}

こんなんでほぼ同じようなことができると思います。

ただ、気になることがところどころありますので書いておきます。

・POST値やGET値などを直接DBに保存することはヤってはいけない。
これは皆様がご指摘している通りなのでSQLインジェクションの攻撃を防ぐことができません。
PDOなどを利用すると便利だと思われます。

・if ($row = $select_query)
これをみると代入になってしまいます。

・header();の後のexit;あまり意味が無いように思えます。
header('Location: db.php');exit();
合って困るもんではないですが、exitがなくてもheader();が機能してそれ移行の処理が走ることはないと思います。

投稿2015/05/12 07:06

bushi

総合スコア44

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

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

0

1つ1つやっていきましょう。
ID・PASSが送信されており、それが間違いの場合ですね。

lang

1 //【誤】のとき 2 //メールアドレスの未入力メッセージ 3 if (isset($_SESSION['error_mail']) && $_SESSION['error_mail'] == 1) { 4 $error_mail = "名前にエラーがあります<br>"; 5 } else { 6 $error_name = ""; //ここはなぜ$error_nameという変数名? おそらく$error_mailの間違いではないでしょうか 7 } 8 //パスワードの未入力メッセージ 9 if (isset($_SESSION['error_pass']) && $_SESSION['error_pass'] == 1) { 10 $error_pass = "名前にエラーがあります<br>"; 11 } else { 12 $error_pass = ""; 13 } 14

ここで未入力の場合のメッセージを設定していますが、最初の送信時には、$_SESSION['error_mail']は存在しないので、必ず後ろの条件になります。したがって、$error_mailは空になります。さらにこれ以降に$_SESSION['error_mail']をセットしている箇所がないため、常に$error_mailは空になります。$_SESSION['error_pass']についても同様です。
$_SESSION['error_mail']および$_SESSION['error_pass']へのセットは

lang

1 //メールアドレスが未記入のとき 2 if($_POST['a_mail']==""){ 3 //$_SESSION['error_message']=1; 4 $_SESSION['error_mail']=1; 5 } 6 //パスワードが未記入のとき 7 if($_POST['a_pass']==""){ 8 //$_SESSION['error_message']=1; 9 $_SESSION['error_pass']=1; 10 } 11 if($_POST['a_mail']==""||$_POST['a_pass']==""){ 12 header("location: http://localhost/kadai4/log001.php"); 13 exit; 14 } 15 } 16}

とすれば、いいでしょう。

投稿2015/05/12 06:11

orange0190

総合スコア1698

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

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

0

lang

1if ($row = $select_query) {

は代入です、比較演算子は「==」「===」になります。
また$rowにはSQL文が代入されるのでログインは100%成功する事になります。

lang

1$login = $SQL->QueryEx($select_query);

の実行結果がどのような形式(配列?オブジェクト?)なのか分からないのですが
SQLの条件にあてはまっていればDBに存在するということになるので

lang

1if (! empty($login)) { // DBから情報は取得できたら

とか判定になると思います。

そもそも、提示されてるPHP&htmlは、db.php?log001.php?
それとも別ファイルでログイン画面用なのでしょうか?

投稿2015/05/12 06:03

icham

総合スコア559

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

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

0

ぱっと見ただけでもおかしい箇所が多いので、致命的な部分だけを・・・

lang

1if($row = $select_query)

の部分について、$select_queryはただの文字列ですので、上の条件は常に満たされてしまいます。

また、次がかなり致命的なのですが、POSTで渡ってきた値をSQLの中に直接使うのは絶対にしてはいけません。SQLインジェクションという攻撃にあってしまいます。
プリペアドステートメントを利用するか、エスケープするかといった処理が必要になります。

追記
ある程度の直しがほしい場合には、コメントにその旨を書いてください。少しずつで良ければ、修正を手伝います。

追記2
直しは別回答とします。

投稿2015/05/12 04:33

編集2015/05/12 05:51
orange0190

総合スコア1698

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

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

star24star

2015/05/12 05:41

"SELECT * FROM admin_tbl WHERE a_mail='{$a_mail}' AND a_pass='{$a_pass}'"を$select_queryへ格納し、クエリの実行を$loginへ格納・・・というつもりで書きました。 POSTをSQLの中へというのはどの文でしょうか? SESSIONへ渡せられれば良いのですかね・・・? まずは未入力メッセージとデータの引継ぎ(リダイレクト時)についての直しをお願いできますでしょうか  何度も申し訳ございません!
star24star

2015/05/12 05:49

>>$select_queryはただの文字列ですので、上の条件は常に満たされてしまいます。 満たされてしまっているのですね。読み間違えてしまいました。 mailとpassを呼び出して入力されたデータと照らし合わせていないプログラムになっているという解釈でよろしいでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問