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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

解決済

MySQLで VARCHAR(100) のとき、それをphpとJavaScriptで検証する方法

nikuatsu
nikuatsu

総合スコア172

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

2回答

1リアクション

1クリップ

415閲覧

投稿2022/09/13 18:21

編集2022/09/13 19:01

前提

・掲示板サイトを作っています。
CREATE TETABLE で 掲示板のタイトルを VARCHAR(100) に指定しました。
・掲示板のタイトルはユーザーがPOSTし、絵文字などすべて入力できます。

実現したいこと

掲示板のタイトルが VARCHAR(100)以下の文字数であることを、phpとJavaScriptで判定したいです。

発生している問題

文字数のカウント方法が、言語間にも、文字毎にも整合性がなく、VARCHAR(100) 以下と判定する正確な方法がわかりません。

該当のソースコード

こちらのthread_ttlが対象カラムです。

SQL

CREATE TABLE tbl_threads ( `ID` INT, `thread_ttl` VARCHAR(100) -- 対象カラム );

phpではmb_strlenのみで問題なく数えることができるようで、以下すべて「1」です。

php

$arr = ["1","a","あ","😃","🏴"]; $result = array_map( function( $str ) { return mb_strlen( $str ); }, $arr ); var_export( $result );

しかしJavaScriptですが、以下最後の旗が「5」になってしまいます。

JavaScript

const arr = ["1","a","あ","😃","🏴󠁧󠁢󠁥󠁮"]; const result = arr.map( function( str ) { return [...str].length; }, arr ); console.log( result );

このように、言語間にも、文字毎にも整合性がないのが問題です。

試したこと

ということは、phpでは次のように検証して、

php

// ユーザーが入力した掲示板のタイトル $thread_ttl = $_POST['thread_ttl']; // 掲示板のタイトルの文字数を検証 if ( mb_strlen( $thread_ttl ) > 100 ) { echo "VARCHAR(100)を超えてます"; die(); } else { // tbl_threads へ INSERT }

そしてJavaScriptでは次のように検証する。ということになるのでしょうか?

JavaScript

// ユーザーが入力した掲示板のタイトル const threadTtl = "掲示板の🏴󠁧󠁢󠁥󠁮タイトル🏴󠁧󠁢󠁥󠁮"; // 普通に数えることができない例外文字を { 文字: 文字数 } と指定 const excObj = { "🏴󠁧󠁢󠁥󠁮": 5 } // 掲示板のタイトルに含まれる、例外文字の数と、例外文字の文字数を取得 let allExcCount = 0; // 例外文字の数 let allExcLen = 0; // 例外文字の文字数 Object.keys( excObj ).forEach( excStr => { const excCount = ( threadTtl.match( new RegExp( excStr, "g" ) ) || [] ).length; const exclen = excObj[excStr] * excCount; allExcCount = allExcCount + excCount; allExcLen = allExcLen + exclen; }); // 掲示板のタイトルの文字数を検証 const threadTtlLen = [...threadTtl].length - allExcLen + allExcCount; if ( threadTtlLen > 100 ) { alert( "VARCHAR(100)を超えてます"); } else { // POST }

やや違和感を覚えますし、上記の旗みたいな例外文字を excObj として網羅しないといけませんよね…
もっと良い方法はございませんでしょうか?

そして万が一これがベストならば、excObjを網羅できるような一覧データというのはどこかにございますでしょうか?

バージョン

PHP 8.0
MySQL 5.7.31
jQuery 3.6.0

kemusi👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

SurferOnWww

2022/09/13 22:27

ユーザー入力の検証(文字数制限) をまずクライアント側で (JavaScript で) 行い、さらにサーバー側で (PHP で) 行って、検証 NG ならユーザーにエラーメッセージを表示して再入力を促すという話なのですか?
m.ts10806

2022/09/13 22:51 編集

>echo "VARCHAR(100)を超えてます"; 通常このようなメッセージは出しません。 実際に使うのは一般のユーザー。開発者でないのにこのように出されても困るでしょう? そもそも要件がおかしいと思います。 「100字超過をチェックする」ことはあっても、それはDBの型にあわせてチェックするわけではなく、 あくまで「入力内容がシステム側が許可するものか確認する」です。 「バイト」と「字数」を正確に理解・定義したうえで型も用意し、入力内容のチェックをする必要があります。
SurferOnWww

2022/09/13 23:06 編集

JavaScript の方は「javascript サロゲートペア 文字数」などをキーワードにググって見ると以下のような記事がヒットします。 JavaScriptで正確に文字数をカウントする https://blog.solunita.net/posts/count-string-accurately-in-javascript/ 自分は未検証・未確認なのでホントにそれでできるかは分かりませんが、試してみては? 特定の文字とかはやっぱりダメそうな気がしますが。
matukeso

2022/09/13 23:03

そもそも旗の絵文字にたいしてmb_strlenで1を返したといっても、MySQLのVARCHAR(100)に旗を100個入れれるかといえば、入らないのでは。VARCHARって基本バイト数でしょ。
SurferOnWww

2022/09/13 23:20

utf8mb4 を使用しているとすると、varchar(100) は 100 x 4 = 400 バイトになるのでは? utf8 なら 100 x 3 = 300 バイト。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。