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

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

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

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

Q&A

解決済

1回答

1651閲覧

ユーザー登録画面にて半角英数字6文字以上を実装したい

abrt29

総合スコア12

PHP

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

0グッド

0クリップ

投稿2020/11/12 06:20

preg_match関数にて半角英数字6文字以上のユーザー名、パスワードを実装したいのですが
ユーザ名やパスワードに一部の記号(アンダースコア(_)など)を含めることができてしまいます。
含まれる原因と半角英数字以外含まれない記述の仕方を教えてください。
なお、MVCモデルにて実装しております。

PHP

1<?php 2 3// 設定ファイル読み込み 4require_once '../../include/conf/const.php'; 5// 関数ファイル読み込み 6require_once '../../include/model/ec_common.php'; 7require_once '../../include/model/ec_new_signup.php'; 8 9$user_name = ''; 10$password = ''; 11$date = date('Y-m-d H:i:s'); 12 13$err_msg = []; 14$msg = []; 15 16$link = get_db_connect(); 17 18if (get_request_method() === 'POST') { 19 $user_name = get_post_data('user_name'); 20 $password = get_post_data('password'); 21 22 check_user_name($user_name); 23 check_password($password); 24 check_same_user_name($link, $user_name); 25 26 if (count($err_msg) === 0) { 27 insert_user_table($link, $user_name, $password, $date); 28 } 29 30} 31 32close_db_connect($link); 33 34 35include_once '../../include/view/ec_new_signup.php';

以下model側となります

php

1<?php 2function check_user_name($user_name) { 3 global $err_msg; 4 if($user_name === '') { 5 $err_msg[] = 'ユーザ名を入力してください'; 6 } elseif (preg_match('/^[0-9a-zA-z]{6,}$/', $user_name) !== 1) { 7 $err_msg[] = 'ユーザ名は半角英数字6文字以上で入力してください'; 8 } 9} 10 11function check_password($password) { 12 global $err_msg; 13 if ($password === '') { 14 $err_msg[] = 'パスワードを入力してください'; 15 } elseif (preg_match('/^[0-9a-zA-z]{6,}$/', $password) !== 1) { 16 $err_msg[] = 'パスワードは半角英数字6文字以上で入力してください'; 17 } 18} 19function check_same_user_name($link, $user_name) { 20 global $err_msg; 21 $sql = 'SELECT user_id 22 FROM user_table 23 WHERE user_name = \'' . $user_name . '\''; 24 25 $data = get_as_array($link, $sql); 26 27 if (count($data) > 0) { 28 $err_msg[] = '同一ユーザーが登録されています'; 29 } 30} 31 32function insert_user_table($link, $user_name, $password, $date) { 33 global $err_msg, $msg; 34 $data = [ 35 $user_name, 36 $password, 37 $date, 38 $date 39 ]; 40 41 $sql = 'INSERT INTO user_table (user_name, password, created_date, updated_date) 42 VALUES (\'' . implode('\',\'' , $data) . '\')'; 43 44 if (insert_db($link, $sql) === FALSE) { 45 $err_msg[] = 'INSERT user_table 追加失敗'; 46 } else { 47 $msg[] = '新規登録完了'; 48 } 49}

commonのmodel側

PHP

1<?php 2function entity_str($str) { 3 return htmlspecialchars($str, ENT_QUOTES, HTML_CHARACTER_SET); 4} 5 6 7function entity_assoc_array($assoc_array) { 8 9 foreach ($assoc_array as $key => $value) { 10 11 foreach ($value as $keys => $values) { 12 // 特殊文字をHTMLエンティティに変換 13 $assoc_array[$key][$keys] = entity_str($values); 14 } 15 16 } 17 18 return $assoc_array; 19} 20 21 22function get_db_connect() { 23 if (!$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD, DB_NAME)) { 24 die('error: ' . mysqli_connect_error()); 25 } 26 mysqli_set_charset($link, DB_CHARACTER_SET); 27 28 return $link; 29} 30 31 32function close_db_connect($link) { 33 34 mysqli_close($link); 35} 36function get_as_array($link, $sql) { 37 38 39 $data = []; 40 41 if ($result = mysqli_query($link, $sql)) { 42 43 if (mysqli_num_rows($result) > 0) { 44 45 while ($row = mysqli_fetch_assoc($result)) { 46 $data[] = $row; 47 } 48 49 } 50 51 mysqli_free_result($result); 52 53 } else { 54 $err_msg[] = 'sql実行エラー' . $sql; 55 } 56 57 return $data; 58 59} 60function get_request_method() { 61 return $_SERVER['REQUEST_METHOD']; 62} 63 64function get_post_data($key) { 65 $str = ''; 66 if (isset($_POST[$key]) === TRUE) { 67 $str = trim($_POST[$key]); 68 } 69 return $str; 70} 71 72function insert_db($link, $sql) { 73 if (mysqli_query($link, $sql) === TRUE) { 74 return TRUE; 75 } else { 76 return FALSE; 77 } 78} 79 80function get_login_user_id() { 81 if (isset($_SESSION['user_id']) === TRUE) { 82 $user_id = $_SESSION['user_id']; 83 } else { 84 header('Location: ec_login.php'); 85 exit; 86 } 87 return $user_id; 88} 89function check_login_admin() { 90 if (isset($_SESSION['user_id']) === TRUE) { 91 if ($_SESSION['user_id'] !== 'admin') { 92 header('Location: ec_login.php'); 93 exit; 94 } 95 } else { 96 header('Location: ec_login.php'); 97 exit; 98 } 99} 100function get_user_name($link, $user_id) { 101 $sql = 'SELECT user_name 102 FROM user_table 103 WHERE user_id = ' . $user_id; 104 $data = get_as_array($link, $sql); 105 106 if (isset($data[0]['user_name'])) { 107 $user_name = $data[0]['user_name']; 108 } else { 109 close_db_connect($link); 110 header('Location: ec_logout.php'); 111 exit; 112 } 113 return $user_name; 114} 115 116function check_item_id($item_id) { 117 global $err_msg; 118 if ($item_id === '') { 119 $err_msg[] = '商品が選択されてません'; 120 } elseif (preg_match('/^[1-9][0-9]*$/', $item_id) !== 1) { 121 $err_msg[] = '商品が正しくありません'; 122 } 123} 124 125function get_cart_item($link, $user_id) { 126 $sql = 'SELECT cart_table.item_id, amount, item_name, price, img, status, stock 127 FROM cart_table 128 JOIN item_table 129 ON cart_table.item_id = item_table.item_id 130 JOIN item_stock_table 131 ON item_table.item_id = item_stock_table.item_id 132 WHERE user_id = ' . $user_id; 133 return get_as_array($link, $sql); 134} 135 136function get_cart_user_id($link, $user_id, $item_id) { 137 $sql = 'SELECT user_id, item_id, amount, created_date, updated_date 138 FROM cart_table 139 WHERE user_id = ' . $user_id . ' 140 AND item_id = ' . $item_id; 141 142 return get_as_array($link, $sql); 143} 144 145function get_total_sum($data) { 146 $total = 0; 147 foreach ($data as $value) { 148 $price = (int)$value['price']; 149 $amount = (int)$value['amount']; 150 $total += $price * $amount; 151 } 152 return $total; 153} 154 155 156function transaction_start($link) { 157 mysqli_autocommit($link, false); 158} 159 160function transaction_commit($link) { 161 mysqli_commit($link); 162} 163 164function transaction_rollback($link) { 165 mysqli_rollback($link); 166} 167

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

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

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

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

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

guest

回答1

0

ベストアンサー

preg_match()で指定されている文字範囲に関する記述が間違ってそうな気がします。

現状されてる記述: /^[0-9a-zA-z]{6,}$/
多分やりたいこと: /^[0-9a-zA-Z]{6,}$/

最後のzが大文字になっていないため、意図せず広範囲な文字を許容しています。

投稿2020/11/12 06:34

attakei

総合スコア2740

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

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

abrt29

2020/11/12 06:46

attakeiさん!ご指摘頂いた通り記述してみたら解決しました!!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問