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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

2959閲覧

php if文 1部の並行処理によって上書きされた変数を、条件分岐に従って出力したい

earnest_gay

総合スコア615

PHP

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2016/09/28 15:28

編集2016/09/30 17:17

条件分岐のエラーの出し方についてです。

下記コードだと
$errorMsg = "入力された部署コードは権限がありません";
が上書きされて困っています。

自分で一から作ったものですが、構造自体が悪いのかどう改良していいのかわからずです。

コメント部分のソースは改良しようとしたけど、できなかったところです。

php

1<?php 2 3require_once(dirname(__FILE__).'/LoginModel.php'); 4 5$departmentCode = filter_input(INPUT_GET, 'departmentCode'); 6$staffCode = filter_input(INPUT_GET, 'staffCode'); 7$password = filter_input(INPUT_GET, 'password'); 8 9if(isset($_GET['submit'])) { 10 if($departmentCode){ 11 //下記メソッドでは部署コードが存在するかをチェック 12 //returnには該当レコードをセットしている 13 $singleLoginCheck = LoginModel::singleLoginCheck($departmentCode); 14 15 if($singleLoginCheck) { 16 //ページ遷移の処理 17 } else { 18 $errorMsg = "入力された部署コードは権限がありません"; 19 //$errorMsgSub = "入力された部署コードは権限がありません"; 20 } 21 //ログイン方法は2通りある。 22 //部署コードで使っているメソッド名の通り1つの入力値のみでログインできるのが部署コード 23 //もう1パターンは全てのフォームを使ってログインする方法 24 25 //①部署コード or 社員コード+パスワード ならわかるけど 26 //②部署コード or 部署コード+社員コード+パスワード っておかしくない? 27 //②なら①にするか、そもそも部署コードだけのログインでいいじゃん 28 //って思うけどそういう仕様だから今は気にせず 29 //ということで仕様通りに行くと、次のif文はここから始まる。と思う。 30 if($staffCode) { 31 if($password) { 32 //下記メソッドでは 33 //社員コードとパスワードが一致するか判定して 34 //部署コードのカラムを含むレコードをreturnしている 35 $doubleLoginCheck = LoginModel::doubleLoginCheck($staffCode,$password); 36 if($doubleLoginCheck) { 37 //下記でその部署コードのカラムと入力した部署コードが一致するかも確認 38 if($doubleLoginCheck['departmentCode'] === $departmentCode) { 39 //ようやく画面遷移 40 } else { 41 $errorMsg = "部署が一致しません"; 42 } 43 } else { 44 $errorMsg = "社員コードとパスワードが一致しません"; 45 } 46 } else { 47 $errorMsg = "パスワードを入力してください"; 48 } 49 } else { 50 $errorMsg = "社員コードを入力してください"; 51 } 52 } else { 53 $errorMsg = "部署コードを入力してください"; 54 } 55} 56?> 57<省略> 58<body> 59 <header class=""> 60 61 </header> 62 <article> 63 <form action="" method="get" accept-charset="utf-8"> 64 <table> 65 <tbody> 66 <tr> 67 <th>部署コード</th> 68 <td><input type="text" name="departmentCode" value="<?php $departmentCode ?>" ></td> 69 </tr> 70 <tr> 71 <th>社員コード</th> 72 <td><input type="text" name="staffCode" value="<?php $staffCode ?>" ></td> 73 </tr> 74 <tr> 75 <th>パスワード</th> 76 <td><input type="text" name="password" value="<?php $password ?>" ></td> 77 </tr> 78 </tbody> 79 </table> 80 <input type="submit" name="submit" value="ログイン"> 81 </form> 82 <?php 83 echo $errorMsg; 84 /* 85 if($errorMsgSub) { 86 echo "<br>" . $errorMsgSub; 87 } 88 */ 89 ?> 90 </article> 91</body>

最下部の$errorMsg出力箇所ですが、2段(2個表示)ではなく
何かしらのエラー文の出力は1つのみになるようにしなければなりません。

夕方ぐらいに別質問しましたが、
$errorMsg[] = "入力された部署コードは権限がありません";
のように配列に入れてけば上書きは防げますが
条件分岐に従った出力ができなくなってしまいます。

というところで悩んでいます。

イメージ説明

要件としては下記です。

イメージ説明

自分で造っておいてなんなんですが、

php

1if($doubleLoginCheck['departmentCode'] === $departmentCode) { 2 //ようやく画面遷移 3 } else { 4 $errorMsg = "部署が一致しません"; 5 }

このうち、下記に到達することがあっても

php

1else { 2 $errorMsg = "部署が一致しません"; 3}

下記に到達することはありません。

php

1if($doubleLoginCheck['departmentCode'] === $departmentCode) { 2 //ようやく画面遷移 3 }

部署コードを入力するということは、下記の処理になります。

php

1if($singleLoginCheck) { 2 //ページ遷移の処理 3 } else { 4 $errorMsg = "入力された部署コードは権限がありません"; 5 //$errorMsgSub = "入力された部署コードは権限がありません"; 6 }

部署コードが正しいものを入力していた場合、

php

1if($doubleLoginCheck['departmentCode'] === $departmentCode) { 2 //ようやく画面遷移 3 }

ではなく

php

1if($singleLoginCheck) { 2 //ページ遷移の処理 3 }

の処理をするのでこれでは結局は1通りのログインしか実装できていません。

要件をパッと見そんな複雑そうな内容ではなさそうなんですが
本当に困っています。宜しくお願いします。

//////////

色々模索した結果やりたかったことが実現できました。
仕様書はシンプルに見えても案外悩みました。

php

1<?php 2 3$departmentCode = filter_input(INPUT_GET, 'departmentCode'); 4$staffCode = filter_input(INPUT_GET, 'staffCode'); 5$password = filter_input(INPUT_GET, 'password'); 6 7function singleLoginCheck($storecd) { 8 9 if($storecd === "test") { 10 $result = $storecd; 11 } 12 return $result; 13} 14 15function DoubleLoginCheck($userCode, $password) { 16 17 if($userCode === "0001" && $password === "test001") { 18 $result =array( 19 "usercode" => $userCode, 20 "password" => $password 21 ); 22 } 23 return $result; 24} 25 26if(isset($_GET['submit'])) { 27 if(!empty($departmentCode)) { 28 $singleLogincheck = singleLogincheck($departmentCode); 29 if(empty($staffCode) && empty($password)) { 30 if($singleLogincheck) { 31 $errorMsg = "部署は存在します。部署情報で遷移します"; 32 } else { 33 $errorMsg = "そんな部署ありません"; 34 } 35 } else if(!empty($staffCode) && !empty($password)) { 36 $doubleLogincheck = doubleLogincheck($staffCode,$password); 37 if($doubleLogincheck) { 38 if($departmentCode === $singleLogincheck) { 39 $errorMsg = "3点締めOKです。ユーザー情報で遷移します。"; 40 } else { 41 $errorMsg = "社員コードとパスワードは合ってますが部署が違うようです"; 42 } 43 } else { 44 $errorMsg = "社員コードかパスワードが間違っています"; 45 } 46 } else { 47 if(empty($staffCode)) { 48 $errorMsg = "社員コードを入力してください"; 49 } 50 if(empty($password)) { 51 $errorMsg = "パスワードを入力してください"; 52 } 53 } 54 } else { 55 $errorMsg = "部署コードを入力してください"; 56 } 57} 58?> 59<!DOCTYPE html> 60<html> 61<head> 62 <meta http-equiv="content-language" content="ja"> 63 <meta charset="UTF-8"> 64 <meta name="robots" content="noindex,nofollow"> 65 <meta name="description" content=""> 66 <meta name="keywords" content=""> 67 <meta name="author" content=""> 68 <title></title> 69 <link rel="stylesheet" href="" /> 70 <script type="text/javascript" src=""></script> 71</head> 72<header class=""> 73 74</header> 75<body> 76 <header class=""> 77 78 </header> 79 <article> 80 <form action="" method="get" accept-charset="utf-8"> 81 <table> 82 <tbody> 83 <tr> 84 <th>部署コード</th> 85 <td><input type="text" name="departmentCode" value="<?php $departmentCode ?>" ></td> 86 </tr> 87 <tr> 88 <th>社員コード</th> 89 <td><input type="text" name="staffCode" value="<?php $staffCode ?>" ></td> 90 </tr> 91 <tr> 92 <th>パスワード</th> 93 <td><input type="text" name="password" value="<?php $password ?>" ></td> 94 </tr> 95 </tbody> 96 </table> 97 <input type="submit" name="submit" value="ログイン"> 98 </form> 99 <?php 100 var_dump($errorMsg); 101 ?> 102 </article> 103</body> 104<footer> 105 <nav> 106 </nav> 107</footer> 108</html> 109

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

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

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

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

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

KaedeKazane

2016/09/29 00:22

例えば「AAA」という部署コードだけでログインできる場合、社員コードとパスワードが必要なログインは「部署コードAAA以外のみ」という認識でよろしいですか?
earnest_gay

2016/09/29 05:20

仕様通りだと 社員コードとパスワードが必要なログインは 部署コードAAAを含めたものなので3点締めです。
kei344

2016/09/30 17:30

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況をお教えください。
guest

回答3

0

設計上のツッコミはスルーしました。

9割までは書いたので、残りの1割はご自身で。

きれいなコードを書くための鉄則 単行本

php

1<?php 2ini_set('display_errors', true); 3error_reporting(E_ALL); 4 5function h($string) 6{ 7 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 8} 9 10/** 11 * 部署コードでログイン(仮実装) 12 * @param string $unitCode 13 * @return bool 14 */ 15function loginUnitCode($unitCode) 16{ 17 return ($unitCode === 'U001'); 18} 19 20/** 21 * 社員コードとパスワードでログイン(仮実装) 22 * @param string $staffCode 23 * @param string $password 24 * @return bool 25 */ 26function loginStaffCodeAndPassword($staffCode, $password) 27{ 28 return ($staffCode === 'staff' && $password === 'password'); 29} 30 31/** 32 * ログイン 33 */ 34function login() 35{ 36 // 外部からのデータの検証 37 $unitcode = filter_input(INPUT_POST, 'unitcode'); 38 $staffcode = filter_input(INPUT_POST, 'staffcode'); 39 $password = filter_input(INPUT_POST, 'password'); 40 41 $errMsg = ''; 42 if (empty($unitcode) && empty($password) && empty($staffcode)) { 43 $errMsg = '部署コードを入力してください。'; 44 throw new Exception($errMsg); 45 } 46 47 if (loginUnitCode($unitcode)) { 48 return true; 49 } 50 51 if (!empty($unitcode) && !empty($staffcode) && empty($password)) { 52 $errMsg = 'パスワードを入力してください。'; 53 throw new Exception($errMsg); 54 } 55 if (!empty($unitcode) && empty($staffcode) && !empty($password)) { 56 $errMsg = '社員コードを入力してください。'; 57 throw new Exception($errMsg); 58 } 59 60 if (loginStaffCodeAndPassword($staffcode, $password)) { 61 return true; 62 } else { 63 $errMsg = '社員コードまたはパスワードが間違っています。'; 64 throw new Exception($errMsg); 65 } 66} 67 68if (filter_input_array(INPUT_POST)) { 69 try { 70 login(); 71 } catch (Exception $e) { 72 $errMessage = $e->getMessage(); 73 } 74} 75?> 76<!DOCTYPE HTML> 77<html lang="en-US"> 78 <head> 79 <meta charset="UTF-8"> 80 <title></title> 81 </head> 82 <body> 83 84 <?php if (isset($errMessage)): ?> 85 <p><?= h($errMessage); ?></p> 86 <?php endif; ?> 87 88 <form action="" method="post"> 89 <p> 90 <label for="unitcode">部署コード</label> 91 <input type="text" name="unitcode" id="unitcode" /> 92 </p> 93 94 <p> 95 <label for="staffcode">社員コード</label> 96 <input type="text" name="staffcode" id="staffcode" /> 97 </p> 98 99 <p> 100 <label for="password">パスワード</label> 101 <input type="password" name="password" id="password" /> 102 </p> 103 104 <p> 105 <button>ログイン</button> 106 </p> 107 </form> 108 </body> 109</html>

投稿2016/09/28 17:44

編集2016/09/28 18:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2016/09/29 05:21

ありがとうございます! 使わせていただきます。
退会済みユーザー

退会済みユーザー

2016/10/01 07:03

追記された最終形コードにはセキュリティ上の脆弱性がありますね。
guest

0

ベストアンサー

「入力された部署コードは権限がありません」を上書きしたくない → 以降の処理は不要
ということになりますね。
なるべく今のコードを活かしたままにするのであれば、チェック処理を関数化していまうのが楽かと思います。
個人的には1関数内で複数returnするのは好みではないですけど、とりあえずの対処法ということで。

PHP

1<?php 2 3require_once(dirname(__FILE__).'/LoginModel.php'); 4 5$departmentCode = filter_input(INPUT_GET, 'departmentCode'); 6$staffCode = filter_input(INPUT_GET, 'staffCode'); 7$password = filter_input(INPUT_GET, 'password'); 8$errorMsg = ''; 9 10if(isset($_GET['submit'])) { 11 $errorMsg = check($departmentCode, $staffCode, $password); 12} 13 14function check($departmentCode, $staffCode, $password) 15{ 16 if($departmentCode){ 17 $singleLoginCheck = LoginModel::singleLoginCheck($departmentCode); 18 19 if($singleLoginCheck) { 20 //ページ遷移の処理 21 } else { 22 return "入力された部署コードは権限がありません"; 23 } 24 if($staffCode) { 25 if($password) { 26 $doubleLoginCheck = LoginModel::doubleLoginCheck($staffCode,$password); 27 if($doubleLoginCheck) { 28 if($doubleLoginCheck['departmentCode'] === $departmentCode) { 29 return ''; 30 } else { 31 return "部署が一致しません"; 32 } 33 } else { 34 return "社員コードとパスワードが一致しません"; 35 } 36 } else { 37 return "パスワードを入力してください"; 38 } 39 } else { 40 return "社員コードを入力してください"; 41 } 42 } else { 43 return "部署コードを入力してください"; 44 } 45 46 return ''; 47} 48?> 49<省略> 50<body> 51 <header class=""> 52 53 </header> 54 <article> 55 <form action="" method="get" accept-charset="utf-8"> 56 <table> 57 <tbody> 58 <tr> 59 <th>部署コード</th> 60 <td><input type="text" name="departmentCode" value="<?php $departmentCode ?>" ></td> 61 </tr> 62 <tr> 63 <th>社員コード</th> 64 <td><input type="text" name="staffCode" value="<?php $staffCode ?>" ></td> 65 </tr> 66 <tr> 67 <th>パスワード</th> 68 <td><input type="text" name="password" value="<?php $password ?>" ></td> 69 </tr> 70 </tbody> 71 </table> 72 <input type="submit" name="submit" value="ログイン"> 73 </form> 74 <?php 75 echo $errorMsg; 76 /* 77 if($errorMsgSub) { 78 echo "<br>" . $errorMsgSub; 79 } 80 */ 81 ?> 82 </article> 83</body> 84

投稿2016/09/30 01:18

ttyp03

総合スコア16996

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

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

0

問題が発生しているのは、以下の入力で部署コードに権限がない場合ですよね。

部署コード:入力済
社員コード:未入力
パスワード:未入力

if($singleLoginCheck) { //ページ遷移の処理 } else { $errorMsg = "入力された部署コードは権限がありません"; //$errorMsgSub = "入力された部署コードは権限がありません"; }

上記の部分でエラーメッセージが設定されています。
しかしその後、社員コードとパスワードによる判定を行う部分

if($staffCode) { if($password) { .... } else { $errorMsg = "パスワードを入力してください"; } } else { $errorMsg = "社員コードを入力してください"; }

ここで社員コードが未入力であることだけを見てエラーメッセージを上書きしています。
この部分は社員コードとパスワードのいずれか、あるいは両方が入力されている場合に行う処理を記述しているんですよね?
つまり、社員コードとパスワードの両方が未入力の場合は通ってはいけない場所のはずです。

解決策としては、以下のいずれかになると思います。
(1)両方が未入力の場合は処理を行わないようにif文を追加する。
(2)1つ目に引用した部分を以下のように修正する。

if(社員コードとパスワードが未入力である) { if($singleLoginCheck) { //ページ遷移の処理 } else { $errorMsg = "入力された部署コードは権限がありません"; //$errorMsgSub = "入力された部署コードは権限がありません"; } }else{ //社員コードとパスワードのチェック処理 }

追記

追加情報を依頼した部分が反映されていませんでした・・・
質問文のコードでは社員コード・パスワードが入力されているかどうかにかかわらず部署コードのみのチェックを行っています。
「権限のある部署コード + 一致しない社員コード・パスワードのセット」でも画面遷移してしまうので、それの対応も必要です。

投稿2016/09/29 05:51

編集2016/09/29 06:01
KaedeKazane

総合スコア408

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問