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

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

ただいまの
回答率

90.51%

  • PHP

    24038questions

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

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

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,345

star24star

score 109

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

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

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

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

<?php
// セッション開始
session_start();

/*
if(!isset($_POST['name'])){
    $_POST['name'] = null;
}
$_SESSION['a_mail'] = $_POST['a_mail'];
unset($_SESSION['error_mail']);
if(!isset($_SESSION['a_mail'])){
    $_SESSION['a_mail'] = null;
}
$_SESSION['a_mail'];
unset($_SESSION['error_mail']);
//名前
if($_POST['a_mail']==""){
    $_SESSION['error_mail']=1;
}
*/
require_once("db_class.php");
if(isset($_POST['a_mail']))
{
    $a_mail = $_POST['a_mail'];
}
if(isset($_POST['a_pass']))
{
    $a_pass = $_POST['a_pass'];
}
if(isset($_POST['a_no']))
{
    $a_no = $_POST['a_no'];
}
$a_no="";

//DBクラスの読み込み
if (isset($_SESSION['a'])){
    // セッションにユーザIDがある=ログインしている
    // トップページに遷移する
    header('Location: db.php');
}
    // IDとPWが送信されたときDBに接続
if (isset($_POST['a_mail']) && isset($_POST['a_pass']))
{
    // データベースに接続
    $SQL = new DB();
    $select_query = "SELECT * FROM admin_tbl WHERE a_mail='{$a_mail}' AND a_pass='{$a_pass}'";
    // クエリの取得と実行
    $login = $SQL->QueryEx($select_query);

    // 【正】SESSIONへ格納・一覧画面へ遷移 【誤】ログインフォームへ遷移
     if ($row = $select_query)
    {
        //【正】のとき
        $_SESSION['a'] = $row['a'];
        header('Location: db.php');
        exit();
    } else {
        //【誤】のとき
        //メールアドレスの未入力メッセージ
        if (isset($_SESSION['error_mail']) && $_SESSION['error_mail'] == 1) {
            $error_mail = "名前にエラーがあります<br>";
        } else {
            $error_name = "";
        }
        //パスワードの未入力メッセージ
        if (isset($_SESSION['error_pass']) && $_SESSION['error_pass'] == 1) {
            $error_pass = "名前にエラーがあります<br>";
        } else {
            $error_pass = "";
        }

        //メールアドレスが未記入のとき
        if($_POST['a_mail']==""){
            $_SESSION['error_message']=1;
        }
        //パスワードが未記入のとき
        if($_POST['a_pass']==""){
            $_SESSION['error_message']=1;
        }
        if($_POST['a_mail']==""||$_POST['a_pass']==""){
            header("location: http://localhost/kadai4/log001.php");
        exit;
        }
    }
}

//データベースの切断
//$SQL->Close();

?>
<html>
<body>
<h3>お問い合わせ</h3>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>ログイン</title>
</head>
<body>
  <h1>ログインフォーム</h1>
  <form action="log001.php" method="post">
    <p>ユーザ名:</p>
    <?php print($error_mail); ?><br>
    <input type="text" name="a_mail" value="<?php echo $a_mail=$_SESSION['a_mail']; ?>"></p>
    <p>パスワード:</p>
    <?php print($error_pass); ?><br>
    <input type="password" name="a_pass" value="<?php echo $a_mail=$_SESSION['a_mail']; ?>">
    <p><input type="submit" value="ログイン">

    </form>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

0

ぱっと見ただけでもおかしい箇所が多いので、致命的な部分だけを・・・
if($row = $select_query)
の部分について、$select_queryはただの文字列ですので、上の条件は常に満たされてしまいます。

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/12 14:41

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

    キャンセル

  • 2015/05/12 14:49

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

    キャンセル

0

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

$login = $SQL->QueryEx($select_query);
の実行結果がどのような形式(配列?オブジェクト?)なのか分からないのですが
SQLの条件にあてはまっていればDBに存在するということになるので
if (! empty($login)) { // DBから情報は取得できたら
とか判定になると思います。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

<?php
require_once("db_class.php");

session_start();

if(isset($_POST)) {
    
    $SQL = new DB();
    $select_query = "SELECT * FROM admin_tbl WHERE a_mail='{$a_mail}' AND a_pass='{$a_pass}'";

    $login = $SQL->QueryEx($select_query);
    if($login) {
        $_SESSION['user'] = $login;
        header('Location: db.php');
    }
    $_SESSION['error'] = "IDまたはパスワードが違います";
    header("location: http://localhost/kadai4/log001.php");
}

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

1つ1つやっていきましょう。
ID・PASSが送信されており、それが間違いの場合ですね。
    //【誤】のとき
    //メールアドレスの未入力メッセージ
    if (isset($_SESSION['error_mail']) && $_SESSION['error_mail'] == 1) {
        $error_mail = "名前にエラーがあります<br>";
    } else {
        $error_name = "";    //ここはなぜ$error_nameという変数名? おそらく$error_mailの間違いではないでしょうか
    }
    //パスワードの未入力メッセージ
    if (isset($_SESSION['error_pass']) && $_SESSION['error_pass'] == 1) {
        $error_pass = "名前にエラーがあります<br>";
    } else {
        $error_pass = ""; 
    }
ここで未入力の場合のメッセージを設定していますが、最初の送信時には、$_SESSION['error_mail']は存在しないので、必ず後ろの条件になります。したがって、$error_mailは空になります。さらにこれ以降に$_SESSION['error_mail']をセットしている箇所がないため、常に$error_mailは空になります。$_SESSION['error_pass']についても同様です。
$_SESSION['error_mail']および$_SESSION['error_pass']へのセットは
        //メールアドレスが未記入のとき
        if($_POST['a_mail']==""){
            //$_SESSION['error_message']=1;
            $_SESSION['error_mail']=1;
        }
        //パスワードが未記入のとき
        if($_POST['a_pass']==""){
            //$_SESSION['error_message']=1;
            $_SESSION['error_pass']=1;
        }
        if($_POST['a_mail']==""||$_POST['a_pass']==""){
            header("location: http://localhost/kadai4/log001.php");
        exit;
        }
    }
}
とすれば、いいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • PHP

    24038questions

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