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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1438閲覧

PHP elseifの使い方

erp

総合スコア46

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/02/11 04:41

編集2020/02/11 05:45

初心者です。PHPを実行したところ思ったような結果になりませんでした。調べても何が間違っているのか分からないのでお力をお貸しいただければと思います。どうぞよろしくお願いいたします。

作りたいもの、問題点

作りたいものはpass.phpでパスワードを入力すると特別ページtest.phpに飛び、間違えるとmiss.phpにエラーメッセージが出る仕組みです。今のところ正しいパスワードを入れると問題なく動きます。
問題点は、どう間違えてもelseifの一番上の文字がechoされることです。やりたいのは、空欄ではmissと出、半角英数字以外、4字以上でそれぞれのエラーメッセージを個別に出したいです。なぜ一番目しかechoされないのでしょうか?

###pass.php

html

1<form action="./miss.php" method="post"> 2 <input type="text" name="pass"> 3 <input type="submit" value="Enter"> 4</form>

miss.php

php

1<?php 2// パスワードを設定する。 3$pass = 1234; 4// パスワードを受け取る 5$form_pass = $_REQUEST["pass"]; 6// 値が$form_passと等しいか評価する 7if($form_pass == $pass){ 8 header("location: /test.php");} 9?> 10<html> 11<body> 12 <main> 13<?php 14if($form_pass == $pass){ 15}else if(empty($data['pass'])){ 16 echo"<p class=\"align-center\">miss!&ensp;Try again.</p><br>", 17 "<ul class=\"actions special\"> 18 <li><a id=\"btn_home\" href=\"javascript:history.back()\" class=\"button\">Back</a></li></ul>"; 19 } else if(!preg_match( '/^[0-9a-z-]+$/', $data['pass'])) { 20 echo "<p class=\"align-center\">Please type using half-width characters.</p><br>", 21 "<ul class=\"actions special\"> 22 <li><a id=\"btn_home\" href=\"javascript:history.back()\" class=\"button\">Back</a></li></ul>"; 23 } elseif( 4 < mb_strlen($data['pass']) ) { 24 echo "<p class=\"align-center\">Please input 4 characters.</p><br>", 25 "<ul class=\"actions special\"> 26 <li><a id=\"btn_home\" href=\"javascript:history.back()\" class=\"button\">Back</a></li></ul>"; 27 }else{ 28 echo"<p class=\"align-center\">miss!&ensp;Try again.</p><br>", 29 "<ul class=\"actions special\"> 30 <li><a id=\"btn_home\" href=\"javascript:history.back()\" class=\"button\">Back</a></li></ul>"; 31 } 32?> 33</main> 34</body> 35</html>

ご教授いただけますと大変助かります。よろしくお願いいたします。

補足情報(ツールのバージョンなど)

chrome最新版、

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/11 05:23 編集

回答する方々は、ここに示されたコードの情報のみで検証するため、もしも晒していないコード部分などがあるなら、当たり障りのない範囲ですべて開示していただけるとよろしいかと。miss.phpでphpとhtmlを区切って掲載しているのが、ちょっと混乱を招くなぁと感じます。
退会済みユーザー

退会済みユーザー

2020/02/11 05:29

$data を誰が詰めていることやら。
m.ts10806

2020/02/11 05:39

1ファイルなら同じブロックにしてください。 見ている側は別ファイルとして認識します。
erp

2020/02/11 05:57

ありがとうございます。ひとつの.phpなのでまとめました。分かりづらくてすみません。
m.ts10806

2020/02/11 06:00

で、結局 $data はどこで値が入るんですか?
erp

2020/02/11 06:08

$dataはユーザーが入力した値にしたいんですがそのやり方が分からにいんです。
m.ts10806

2020/02/11 06:13

調べても何も出ない情報ではないですよ。
Zuishin

2020/02/11 06:26

$data['pass'] を全て $form_pass に書き換えるとどうなりますか?
erp

2020/02/11 06:26

すみません。勉強不足でした。
erp

2020/02/11 06:28

それでできました!
mari.rinn

2020/02/11 06:34 編集

>pass.phpでパスワードを入力すると特別ページtest.phpに飛び、間違えるとmiss.phpにエラーメッセージが出る仕組みです という質問の文ですが、pass.phpのform のactionはmiss.phpになってるのですが、test.phpというのはどこですか?実際の流れがよくわかりませんが。 追記  あ、質問書いてたら、同じ時に質問者様がコメント書かれたみたいですね。 解決されたならこの質問は無視してください。
guest

回答3

0

ベストアンサー

$form_pass = $_REQUEST["pass"]; はハリボテですか。

$data['pass']として利用したいのであれば、自分でコードを書いて詰めますよふつうは。

php

1$data = []; // 初期化 2// ... 3if (isset($_POST['pass'])) { // 存在確認 4 $data['pass'] = $_POST['pass']; 5} 6else { 7 $data['pass'] = ''; // データがないときにどうするかは自分で決める 8}

で、全部書き改めてみた。あくまで机上のコードで動かしてないので、
突っ込みどころがあればコメントよろしく。

php

1<?php 2$data = []; 3$err_msg = []; 4// パスワードを設定する。 5$pass = '1234'; // 文字列として持つことを意識する 6// パスワードを受け取る 7//$form_pass = $_REQUEST["pass"]; 8if (isset($_POST["pass"])) { 9 $form_pass = $_POST["pass"]; 10} 11else { 12 $form_pass = ''; 13 14} 15// 値が$form_passと等しいか評価する 16if ($form_pass === $pass) { // 文字列として比較して一致したら 17 header("Location: /test.php"); 18 exit; 19} 20$data['pass'] = $form_pass; 21?> 22<html> 23<body> 24 <main> 25<?php 26if (empty($data['pass'])) { // ほんとうにemptyでいいのか? 0 でも empty なんだけどな 27 $err_msg[] = 'miss!&nbsp;Try again.'; 28} 29elseif (!preg_match( '/^[0-9a-z-]+$/', $data['pass'])) { 30 $err_msg[] = 'Please type using half-width characters.'; 31} 32elseif (4 < mb_strlen($data['pass'])) { 33 $err_msg[] = 'Please input 4 characters.'; 34} 35else { 36 $err_msg[] = 'miss!&nbsp;Try again.'; 37} 38 39if (count(err_msg) >= 1) { 40 $msg = implode('<br />', $err_msg); 41 echo <<<EOT; 42<p class="align-center">{$msg}</p> 43<ul class="actions special"> 44 <li><a id="btn_home" href="javascript:history.back();" class="button">Back</a></li> 45</ul> 46EOT; 47} 48?> 49</main> 50</body> 51</html>

投稿2020/02/11 06:12

編集2020/02/11 06:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

erp

2020/02/11 06:24

すみません。やっとなにが分からないかわかりました。無事できました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/02/11 06:35

echo文でhtmlコードを出力するのは、いちいち\でエスケープするのが面倒だし見づらくなるだけなので、 ヒアドキュメント構文を使うと変数も展開できて楽ですよっと。 https://www.php.net/manual/ja/language.types.string.php
退会済みユーザー

退会済みユーザー

2020/02/11 06:41

これ、$pass が int なのよ。
退会済みユーザー

退会済みユーザー

2020/02/11 06:47 編集

おおっと。コードを見直ししときました。ご指摘ありがとう。
guest

0

$dataがどこにも定義されていないので、最初のempty($data['pass'])が必ずtrueになるからでは。

投稿2020/02/11 04:44

kei344

総合スコア69407

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

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

kei344

2020/02/11 05:13

低評価をされるのはかまいませんが、どの部分に問題があるかはコメントくださいね。当回答および次回以降の回答の改善につながる可能性もあるので、よろしくおねがいします。
erp

2020/02/11 05:53

ありがとうございます。 ちょっと初心者には定義が難しかったようです。$dateに片っ端から入れてみましたが結果は変わりませんでした。
kei344

2020/02/11 06:12

文字列が入っているのは「$form_pass」で定義されていない(無関係な)「$data['pass']」と比較しても意味は無いです。
erp

2020/02/11 06:25

やっと気づきました。ありがとうございます。
guest

0

あんまりちゃんと読んでないけど、多分コレ。
PHP 型の比較表

緩やかな比較のせいで、型変換が発生していると思います。
初心者は厳密な比較を使用したほうが良いです。

投稿2020/02/11 04:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

erp

2020/02/11 05:56

ありがとうございます。ちょっと難し過ぎて分からなかったのですが、厳密な比較について調べてみようと思います。
退会済みユーザー

退会済みユーザー

2020/02/11 06:43 編集

スマン。ハズレでしたね。 リンク先のは当面理解できないと思うので、理解できるようになるまでは、厳密な比較(===)を使用するようにしたほうが良いです。
退会済みユーザー

退会済みユーザー

2020/02/11 06:46

何が問題かと言うと、緩やかな比較だと'1234hoge' がパスワードとして通ってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問