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

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

ただいまの
回答率

90.48%

  • PHP

    20813questions

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

PHP switch文 breakの飛び先について

解決済

回答 3

投稿

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

sakura123

score 3

前提・実現したいこと

phpでswitch文中のbreak;の飛び先がどこに行くのか知りたくて質問させて頂きました。

現在、ログインする際にユーザーIDとパスワードをデータベースに問い合わせて(テーブル名:members)、ユーザIDもしくわパスワードが一致すれば、test.phpに飛び、ユーザIDもしくわパスワードが一致しなければ、エラー文を表示するphpを作っています。(正式には、このサイト→http://www.webcyou.com/?p=4455 のlogin.phpを少しだけ変更しています。ちなみに、このサイトの別のファイルは少しだけ変更して、うまく動きました。login.phpが動きません。)

そこで下記に示すswitch文中のbreak;の飛び先がどこに行くのか知りたいのです。

//エラー表示関数
function error($errorType) {

  switch($errorType) {
    case 1:
    $errorMsg = "IDとパスワードを入力してください。";
    break;

    case 2:
    $errorMsg = "IDが違います";
    break;

    case 3:
    $errorMsg = "パスワードが違います";
    break;
}

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

エラーメッセージは以下です。プログラムに問題があると思うのですが、どこなのかわかりません。

Web サイトはページを表示できません
  HTTP 500    
可能性のある原因:
•Web サイトがメンテナンス中である。
•Web サイトに、プログラム上の問題がある。

該当のソースコード

login.phpの全文を以下に記載します。

<?php
//セッション作成
session_start();

if(!isset($_POST['login'])) {
  //ログインフォームを表示
  inputForm();
} else {

  //フォームの値を取得
  $formUserId = $_POST['formUserid'];
  $formPassword = $_POST['formPassword'];

  //ID, PASWORDが未入力の場合
  if(($formUserId == "") || ($formPassword == "")) {

  //エラー関数の呼び出し
  error(1);

  } else {
  //ID,PASSWORD 入力アリ
  //データベースへ接続
  require_once('regist/db.php');

  //memberテーブルのデータを取得

  $sql="SELECT * FROM members";
  $result = $dbh->query($sql);
  //フォームから取得したUSERIDとデータベース内のUSERIDが一致したらデータベースのPASSWORDを変数に格納
  while($data = $result->fetch(PDO::FETCH_ASSOC)){
    if($data['userid'] == $formUserId) {  //フォームから取得したUSERIDとデータベースのUSERIDが一致
      $dbPassword = $data['password'];
      break;
    }
  }

  //MySQLデータベースを閉じる
  $dbh = null;

  //$dbPasswordという変数に値が格納されていない場合→formUserIdとデータベースのIDが不一致
  if(!isset($dbPassword)) {
    error(2);
  } else {
  //formUserIdとデータベースのIDが一致
  //フォームのパスワードとデータベース内のパスワードが不一致
    if($dbPassword != $formPassword){
      error(3);
    } else {
      //ID,パスワードどちらも一致
      //セッション変数を作成→セッション変数に $formUserID を登録
      $_SESSION['loginUser'] = $formUserId;
      header("Location:test.php");
      }
    }
  }
}
?>
<?php
  //入力画面表示画面
  function inputForm() {
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ログイン</title>
</head>
<body>
  <h1>ログインページ</h1>
  <form action="login.php" method="post">
  <label for="userid">ユーザーID</label>:
  <input type="text" name="formUserid" id="userid"/>
  <br />
  <label for="password">パスワード</label>:
  <input type="text" name="formPassword" id="password"/>
  <br />
  <input type="submit" name="login" value="ログイン" />
</form>
</body>
</html>
<?php
}

//エラー表示関数
function error($errorType) {

  switch($errorType) {
    case 1:
    $errorMsg = "IDとパスワードを入力してください。";
    break;

    case 2:
    $errorMsg = "IDが違います";
    break;

    case 3:
    $errorMsg = "パスワードが違います";
    break;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ログイン</title>
</head>
<body>
<h1>エラーページ</h1>
<?php
  var_dump($result);
  print $errorMsg;
?>
</body>
</html>
<?php
}
?>

試したこと

①ユーザーIDとパスワードを入力しなかった場合、エラー1の $errorMsg = "IDとパスワードを入力してください。"が表示されます。
②データベースに登録してあるユーザーIDとパスワードを入力しても、上記エラーメッセージ(プログラムに問題があるとのメッセージ)が表示されます。
③データベースに登録していないユーザーIDとパスワードを入力しても、上記エラーメッセージ(プログラムに問題があるとのメッセージ)が表示されます。

switch文のcase 1は正常に動作しますが、case 2・case 3が動きません。
どうしたらいいのでしょうか?

だれかわかる方がいましたら、すみませんが教えてください。

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

PHPバージョン5.5です。

前提・実現したいこと

phpでswitch文中のbreak;の飛び先がどこに行くのか知りたくて質問させて頂きました。

現在、ログインする際にユーザーIDとパスワードをデータベースに問い合わせて(テーブル名:members)、ユーザIDもしくわパスワードが一致すれば、test.phpに飛び、ユーザIDもしくわパスワードが一致しなければ、エラー文を表示するphpを作っています。(正式には、このサイト→http://www.webcyou.com/?p=4455 のlogin.phpを少しだけ変更しています。ちなみに、このサイトの別のファイルは少しだけ変更して、うまく動きました。login.phpが動きません。)

そこで下記に示すswitch文中のbreak;の飛び先がどこに行くのか知りたいのです。

//エラー表示関数
function error($errorType) {

  switch($errorType) {
    case 1:
    $errorMsg = "IDとパスワードを入力してください。";
    break;

    case 2:
    $errorMsg = "IDが違います";
    break;

    case 3:
    $errorMsg = "パスワードが違います";
    break;
}

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

エラーメッセージは以下です。プログラムに問題があると思うのですが、どこなのかわかりません。

Web サイトはページを表示できません
  HTTP 500    
可能性のある原因:
•Web サイトがメンテナンス中である。
•Web サイトに、プログラム上の問題がある。

該当のソースコード

login.phpの全文を以下に記載します。

<?php
//セッション作成
session_start();

if(!isset($_POST['login'])) {
  //ログインフォームを表示
  inputForm();
} else {

  //フォームの値を取得
  $formUserId = $_POST['formUserid'];
  $formPassword = $_POST['formPassword'];

  //ID, PASWORDが未入力の場合
  if(($formUserId == "") || ($formPassword == "")) {

  //エラー関数の呼び出し
  error(1);

  } else {
  //ID,PASSWORD 入力アリ
  //データベースへ接続
  require_once('regist/db.php');

  //memberテーブルのデータを取得

  $sql="SELECT * FROM members";
  $result = $dbh->query($sql);
  //フォームから取得したUSERIDとデータベース内のUSERIDが一致したらデータベースのPASSWORDを変数に格納
  while($data = $result->fetch(PDO::FETCH_ASSOC)){
    if($data['userid'] == $formUserId) {  //フォームから取得したUSERIDとデータベースのUSERIDが一致
      $dbPassword = $data['password'];
      break;
    }
  }

  //MySQLデータベースを閉じる
  $dbh = null;

  //$dbPasswordという変数に値が格納されていない場合→formUserIdとデータベースのIDが不一致
  if(!isset($dbPassword)) {
    error(2);
  } else {
  //formUserIdとデータベースのIDが一致
  //フォームのパスワードとデータベース内のパスワードが不一致
    if($dbPassword != $formPassword){
      error(3);
    } else {
      //ID,パスワードどちらも一致
      //セッション変数を作成→セッション変数に $formUserID を登録
      $_SESSION['loginUser'] = $formUserId;
      header("Location:test.php");
      }
    }
  }
}
?>
<?php
  //入力画面表示画面
  function inputForm() {
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ログイン</title>
</head>
<body>
  <h1>ログインページ</h1>
  <form action="login.php" method="post">
  <label for="userid">ユーザーID</label>:
  <input type="text" name="formUserid" id="userid"/>
  <br />
  <label for="password">パスワード</label>:
  <input type="text" name="formPassword" id="password"/>
  <br />
  <input type="submit" name="login" value="ログイン" />
</form>
</body>
</html>
<?php
}

//エラー表示関数
function error($errorType) {

  switch($errorType) {
    case 1:
    $errorMsg = "IDとパスワードを入力してください。";
    break;

    case 2:
    $errorMsg = "IDが違います";
    break;

    case 3:
    $errorMsg = "パスワードが違います";
    break;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ログイン</title>
</head>
<body>
<h1>エラーページ</h1>
<?php
  var_dump($result);
  print $errorMsg;
?>
</body>
</html>
<?php
}
?>

試したこと

①ユーザーIDとパスワードを入力しなかった場合、エラー1の $errorMsg = "IDとパスワードを入力してください。"が表示されます。
②データベースに登録してあるユーザーIDとパスワードを入力しても、上記エラーメッセージ(プログラムに問題があるとのメッセージ)が表示されます。
③データベースに登録していないユーザーIDとパスワードを入力しても、上記エラーメッセージ(プログラムに問題があるとのメッセージ)が表示されます。

switch文のcase 1は正常に動作しますが、case 2・case 3が動きません。
どうしたらいいのでしょうか?

だれかわかる方がいましたら、すみませんが教えてください。

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

PHPバージョン5.5です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

ログイン画面が表示されるってことは、全体的に見て致命的なミスはなさそげ。
気になるのはデータベースをアクセスする部分かなあ。
あの方法でデータを取得できた実績はありますか?

あと、下記を先頭に追加してなんか出ないスかね。
ini_set( 'display_errors', 1 );

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/27 20:00

    ini_set( 'display_errors', 1 );を先頭に追加してみると、データベースにアクセスする部分が悪いと指摘するエラーが書かれてました!!
    (このコマンド知らなかったです。ありがとうございます。)
    それで、データベース接続をする箇所を変更したところ、login.phpが正常な動作をしました!!!!本当にありがとうございます!!!!!!
    ベストアンサーにしたいのですが、二人は無理なんですよね?
    見事に解決しました。ありがとうございました。
    またの機会がありましたら、よろしくお願い致します。

    キャンセル

checkベストアンサー

+1

<?php

function error($errorType)
{

    echo "1\n";
    switch ($errorType) {
        case 1:
            $errorMsg = "IDとパスワードを入力してください。";
            echo "2\n";
            break;

        case 2:
            $errorMsg = "IDが違います";
            echo "3\n";
            break;

        case 3:
            $errorMsg = "パスワードが違います";
            echo "4\n";
            break;
    }
    echo "5\n";
}

こんな感じでコード書いて実行すれば、わかるでしょう。

蛇足ですが…
ログイン失敗時に、IDがちがうとか、パスワードが違うとかヒントを出すのは設計としてNGです…。
わざわざ不正ログインをしやすくしているようなもの。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

<?php
  //入力画面表示画面
  function inputForm() {
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ログイン</title>
</head>
<body>
  <h1>ログインページ</h1>
  <form action="login.php" method="post">
  <label for="userid">ユーザーID</label>:
  <input type="text" name="formUserid" id="userid"/>
  <br />
  <label for="password">パスワード</label>:
  <input type="text" name="formPassword" id="password"/>
  <br />
  <input type="submit" name="login" value="ログイン" />
</form>
</body>
</html>
<?php
}//←ここです


最後の行の括弧があやまりではないですか?^^

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/27 19:18

    ご回答ありがとうございました。
    最後の行の括弧を削除してみましたが、login.phpは動きませんでした。(プログラムに問題がありますエラーがでました。)
    質問を最後まで読んでいただき、ありがとうございました。
    またの機会がありましたら、よろしくお願い致します。

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    20813questions

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