
前提
・掲示板サイトを作っています。
・CREATE TETABLE
で 掲示板のタイトルを VARCHAR(100)
に指定しました。
・掲示板のタイトルはユーザーがPOSTし、絵文字などすべて入力できます。
実現したいこと
掲示板のタイトルが VARCHAR(100)
以下の文字数であることを、phpとJavaScriptで判定したいです。
発生している問題
文字数のカウント方法が、言語間にも、文字毎にも整合性がなく、VARCHAR(100)
以下と判定する正確な方法がわかりません。
該当のソースコード
こちらのthread_ttl
が対象カラムです。
SQL
1CREATE TABLE tbl_threads ( 2 `ID` INT, 3 `thread_ttl` VARCHAR(100) -- 対象カラム 4);
phpではmb_strlen
のみで問題なく数えることができるようで、以下すべて「1」です。
php
1$arr = ["1","a","あ","😃","🏴"]; 2$result = array_map( function( $str ) { 3 return mb_strlen( $str ); 4}, $arr ); 5var_export( $result );
しかしJavaScriptですが、以下最後の旗が「5」になってしまいます。
JavaScript
1const arr = ["1","a","あ","😃","🏴"]; 2const result = arr.map( function( str ) { 3 return [...str].length; 4}, arr ); 5console.log( result );
このように、言語間にも、文字毎にも整合性がないのが問題です。
試したこと
ということは、phpでは次のように検証して、
php
1// ユーザーが入力した掲示板のタイトル 2$thread_ttl = $_POST['thread_ttl']; 3 4// 掲示板のタイトルの文字数を検証 5if ( mb_strlen( $thread_ttl ) > 100 ) { 6 echo "VARCHAR(100)を超えてます"; 7 die(); 8} else { 9 // tbl_threads へ INSERT 10}
そしてJavaScriptでは次のように検証する。ということになるのでしょうか?
JavaScript
1// ユーザーが入力した掲示板のタイトル 2const threadTtl = "掲示板の🏴タイトル🏴"; 3 4// 普通に数えることができない例外文字を { 文字: 文字数 } と指定 5const excObj = { 6 "🏴": 5 7} 8 9// 掲示板のタイトルに含まれる、例外文字の数と、例外文字の文字数を取得 10let allExcCount = 0; // 例外文字の数 11let allExcLen = 0; // 例外文字の文字数 12Object.keys( excObj ).forEach( excStr => { 13 const excCount = ( threadTtl.match( new RegExp( excStr, "g" ) ) || [] ).length; 14 const exclen = excObj[excStr] * excCount; 15 allExcCount = allExcCount + excCount; 16 allExcLen = allExcLen + exclen; 17}); 18 19// 掲示板のタイトルの文字数を検証 20const threadTtlLen = [...threadTtl].length - allExcLen + allExcCount; 21if ( threadTtlLen > 100 ) { 22 alert( "VARCHAR(100)を超えてます"); 23} else { 24 // POST 25}
やや違和感を覚えますし、上記の旗みたいな例外文字を excObj
として網羅しないといけませんよね…
もっと良い方法はございませんでしょうか?
そして万が一これがベストならば、excObj
を網羅できるような一覧データというのはどこかにございますでしょうか?
バージョン
PHP 8.0
MySQL 5.7.31
jQuery 3.6.0





回答2件
あなたの回答
tips
プレビュー