PHP switch文 breakの飛び先について
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,840
前提・実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
ログイン画面が表示されるってことは、全体的に見て致命的なミスはなさそげ。
気になるのはデータベースをアクセスする部分かなあ。
あの方法でデータを取得できた実績はありますか?
あと、下記を先頭に追加してなんか出ないスかね。
ini_set( 'display_errors', 1 );
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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
}//←ここです
最後の行の括弧があやまりではないですか?^^
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/27 20:00
(このコマンド知らなかったです。ありがとうございます。)
それで、データベース接続をする箇所を変更したところ、login.phpが正常な動作をしました!!!!本当にありがとうございます!!!!!!
ベストアンサーにしたいのですが、二人は無理なんですよね?
見事に解決しました。ありがとうございました。
またの機会がありましたら、よろしくお願い致します。