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

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

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

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

HTML

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

Q&A

解決済

3回答

2769閲覧

PHP パスワードの文字数制限

Suzumi41

総合スコア19

PHP

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

HTML

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

0グッド

1クリップ

投稿2019/03/12 08:46

前提・実現したいこと

メールアドレスとパスワードを入力し登録ボタンを押すと、入力された値に問題ないか確認し、問題なければ「登録完了」、それ以外はエラーメッセージを表示するページを作成しております。

尚、パスワードの文字数制限があり、6文字以上20文字以内で入力する必要があり
また、「未入力」と「入力はあるが値に問題がある」はそれぞれ異なるエラーメッセージを用意し表示する必要があります。

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

①パスワードの問題
正規表現を用いて、6文字以上20文字以内で入力をしたのですが、
6文字以上を入力しても「パスワードは6文字以上20文字以内で入力してください」と
作成したエラーメッセージが表示されてしまいます。

②登録後の問題
正しく入力していた場合、画面が入力フォームではなく「登録完了」のみを表示させたいです。

該当のソースコード

PHP

1<?php 2$message = NULL; 3 4if($_SERVER['REQUEST_METHOD'] === 'POST') { 5 $mail = $_POST['mail']; 6 $pw = $_POST['pw']; 7 if (mb_strlen($mail) === 0){ 8 $message = 'メールアドレスを入力してください'; 9 } else if (preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/', $mail) !== 1){ 10 $message = 'メールアドレスの形式が正しくありません'; 11 } else if(mb_strlen($pw) === 0){ 12 $message = 'パスワードを入力してください'; 13 } else if(preg_match('/^[a-z][a-z0-9_]{5,19}$/i', $pw)){ 14 $message = 'パスワードは6文字以上20文字以内で入力してください'; 15 } else{ 16 $message = '登録完了'; 17 } 18} 19 20?>

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5 <title>課題中級</title> 6</head> 7<body> 8 <form method="post"> 9 <p><label for="mail">メールアドレス<br/> 10 <input type="text" name="mail" id="mail"></label></p> 11 <p><label for="pw">パスワード<br/> 12 <input type="password" name="pw" id="pw"></label></p> 13 <p><input type="submit" name="登録"></p> 14 </form> 15<?php if($message !== NULL){ ?> 16 <?php print $message; ?> 17<?php } ?> 18</body> 19</html>

試したこと

パスワードに関しましては正規表現ではなく、単純に$limit = (6 <= 20);とグローバル変数で用いて
それを比較するような形で書いてみたのですが、同様な事象となりました。

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

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

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

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

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

guest

回答3

0

if(preg_match('/^[a-z][a-z0-9_]{5,19}$/i', $pw))では、正規表現を満たした場合ifの中へ入っていってしまいます。条件が逆です。


本題ではありませんが、正規表現として条件となっている「1文字目がアルファベット小文字のみ」「2文字目以降も使える文字が限られる」というのは、そもそも制限として実装する意味が疑問ですし、少なくともその条件を書かなければ「なんでエラーになったのかわからない」事態を招いてしまいます。

投稿2019/03/12 08:54

maisumakun

総合スコア145184

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

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

Suzumi41

2019/03/15 00:40

確かに今のままでは条件が逆でした。 見直した所、正しく動きました。 有難うございます。
guest

0

if(preg_match('/^[a-z][a-z0-9_]{5,19}$/i', $pw)){

if条件がマッチしたらになっているからでしょうね

if(!preg_match('/^[a-z][a-z0-9_]{5,19}$/i', $pw)){

filter処理

PHP

1<?php 2$message = NULL; 3$mail = filter_input(INPUT_POST,'mail',FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/^(([a-z\d])+([\w.-])*@([\w-])+([\w.-]+)+|)$/i"]]); 4$pw = filter_input(INPUT_POST,'pw',FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/^([a-z]\w{5,19}|)$/i"]]); 5 6if(!is_null($mail)){ 7 $message = '登録完了'; 8 if($pw==="") $message = 'パスワードを入力してください'; 9 if($pw===false) $message = 'パスワードは6文字以上20文字以内で入力してください'; 10 if($mail==="") $message = 'メールアドレスを入力してください'; 11 if($mail===false) $message = 'メールアドレスの形式が正しくありません'; 12} 13 14var_dump([$mail,$pw,$message]); 15?> 16<form method="post"> 17<p><label for="mail">メールアドレス<br/> 18<input type="text" name="mail" id="mail"></label></p> 19<p><label for="pw">パスワード<br/> 20<input type="password" name="pw" id="pw"></label></p> 21<p><input type="submit" name="登録"></p> 22</form> 23

投稿2019/03/12 08:52

編集2019/03/12 09:17
yambejp

総合スコア114835

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

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

yambejp

2019/03/12 09:18

filter_inputでフィルタリングする方法を追記しておきました ifで条件式を色々書くより直感的に書けると思います
Suzumi41

2019/03/15 00:41

filter_inputで使ったほうが、すっきりして確かに見やすいですね。 今後活用していこうと思います。 有難うございます。
guest

0

ベストアンサー

普通文字数制限は正規表現で制御せずに、普通に文字数をカウントして制御します。今回全角文字を入力させないように正規表現を使っているようですが、以下の方法でもできます(全角文字は2バイト以上なので、文字バイト数と文字数が一致しない場合全角文字が使われていることになる)

PHP

1$pw = mb_strlen($pw); //文字数を取得 2$pw_byte = strlen($pw); //文字バイト数を取得 3 4/*中略*/ 5}elseif( $pw < 6 || $pw > 20 || $pw != $pw_byte ){ 6 $message = 'パスワードは6文字以上20文字以内の半角英数字を入力してください'; 7} 8/*後略*/

もし、頭文字がアルファベットであるなど、特殊な条件が複合した場合は正規表現を使ってもいいでしょう。

投稿2019/03/12 16:11

FKM

総合スコア3633

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

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

Suzumi41

2019/03/15 00:39

こちらの回答のelseif( $pw < 6 || $pw > 20 || $pw != $pw_byte )からヒントを得て 無事に解決致しました。 有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問