

PHPで関数の呼び出しがうまくできません。  
このように呼び出してもエラーメッセージが表示されず、  
空のデータが表示されてしまいます。  
値があるときはこのように送信されるのは正しいのですが、  
<https://i.stack.imgur.com/1SiBK.png>  
値がないときにエラーメッセージを表示させたいのに普通に空のデータとして登録されてしまいます。  
<https://i.stack.imgur.com/IQyKc.png>  
ちなみに呼び出したい関数はcheck_name()とcheck_comment()です。  
どうすれば呼び出せるようになるのでしょうか。  
ご教授お願い致します。

[code]

    ソースコード
    <?php
    
    define('DB_HOST',   ''); // データベースのホスト名又はIPアドレス
    define('DB_USER',   '');  // MySQLのユーザ名
    define('DB_PASSWD', '');    // MySQLのパスワード
    define('DB_NAME',   '');    // データベース名
    
    define('HTML_CHARACTER_SET', 'UTF-8');
    define('DB_CHARACTER_SET', 'UTF8');
    
    date_default_timezone_set('Asia/Tokyo');
    $errors = array();
    $insert_datas = [];
    $select_datas = [];
    
    //db接続
     $link = get_db_connect();
     
     $insert_datas = insert_sql($link);
     
     $select_datas = select_sql($link); 
     
     close_db_connect($link);
     
     //entity_assoc_array($datas);
     
    
    function get_db_connect() {
        //コネクション取得
        if (!$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD, DB_NAME)) {
    
            die('error: '.mysqli_connect_error());
        }
    
        //文字コードセット
        mysqli_set_charset($link, DB_CHARACTER_SET);
    
        return $link;
    }
    
    function get_as_array($link, $sql) {
     
        // 返却用配列
        $data = [];
     
        // クエリを実行する
        if ($result = mysqli_query($link, $sql)) {
     
            if (mysqli_num_rows($result) > 0) {
     
                // １件ずつ取り出す
                while ($row = mysqli_fetch_assoc($result)) {
                    $data[] = $row;
                }
     
            }
     
            // 結果セットを開放
            mysqli_free_result($result);
     
        }
     
        return $data;
     
    }
    
    function insert_sql($link) {
        if(isset($_POST['send']) === true) {
        $error1 = check_name();
        $error2 = check_comment();
        if($error1 === "" || $error2 === "") {
        $name = $_POST['name'];;
        $comment = $_POST['comment'];
        $date = date("Y-m-d H:i:s");
        $sql = 'INSERT INTO comment_table(name,comment,date) VALUES(\''.$name.'\',\''.$comment.'\',\''.$date.'\')';
        $result = mysqli_query($link, $sql);      
        return $result;
        }
    }
    
    }
    
    function select_sql($link) {
    
        $sql = 'SELECT name,comment,date FROM comment_table ORDER BY date DESC';
    
        return get_as_array($link, $sql);
    }
    
    function close_db_connect($link) {
    
        mysqli_close($link);
    }
    function check_name() { 
            if (mb_strlen($_POST['name']) === "") {
               $errors['name'] = '名前を入力してください';
            }  elseif (mb_strlen($_POST['name']) > 20){
               $errors['name'] = '名前は20文字以内で入力してください';
            } else {
                $errors = "";
            }
        return $errors;
          }
    
    
    function check_comment() {
            if (mb_strlen($_POST['comment']) === "") {
               $errors['comment'] = 'ひとことを入力してください';
            } elseif (mb_strlen($_POST['comment']) > 100){
               $errors['comment'] = 'ひとことは100文字以内で入力してください';
            } else {
                $errors = "";
            }
        return $errors;
    }
    
    /*function entity_str($str) {
        return htmlspecialchars($str, ENT_QUOTES, HTML_CHARACTER_SET);
    }
    
    function entity_assoc_array($assoc_array) {
     $assoc_array = [];
        foreach ($assoc_array as $key => $value) {
     
            foreach ($value as $keys => $values) {
                $assoc_array[$key][$keys] = entity_str($values);
            }
     
        }
     
        return $assoc_array;
     
    }*/
    
    ?>
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>ひとこと掲示板</h1>
        <form method="post">
             <?php if (count($errors) > 0) { ?>
             <ul>
              <?php foreach ($errors as $value){ ?>
            <li><?php echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); ?></li>
             <?php } ?>
             </ul>
               <?php } ?>
            <p>名前 :
                <input type="text" name="name">
                ひとこと :
                <input type="text" name="comment" size="60">
                <input type="submit" name="send" value="送信">
            </p>
        </form>
    
        <ul>
            <?php if(!empty($select_datas)){ ?>
            <?php foreach ((array)$select_datas as $hitokoto) { ?>
                <li>
                    <?php echo htmlspecialchars($hitokoto['name'],ENT_QUOTES,'UTF-8'); ?>
                    <?php echo htmlspecialchars($hitokoto['comment'],ENT_QUOTES,'UTF-8'); ?>
                    <?php echo htmlspecialchars($hitokoto['date'],ENT_QUOTES,'UTF-8'); ?>
                </li>
            <?php } ?>
            <?php } ?>
        </ul>
    </body>
    </html>
    
[/code]


CC BY-SA 4.0
2021-07-14T04:54:59.117
78177
2021-07-14T06:27:21.307
2021-07-14T06:27:21.307
3060
46886
question
php
関数の呼び出しがうまくいってない


下記のmb_strlenの条件文が仕様通りに使えていないです。

[code]

    if (mb_strlen($_POST['name']) === "") {
    
[/code]

[mb_strlen](https://www.php.net/manual/ja/function.mb-strlen.php)のマニュアルを確認すると、

[code]

    mb_strlen(string $string, string|null $encoding = null): int
    
[/code]

とありますので、返り値にはintが必ず返されます。

しかしながら、条件は `=== ""`なので空文字とintを比較しているのでこの条件に入ることはなさそうです。  
もしマルチバイトの文字の長さが０かどうか比較したいなら

[code]

    if (mb_strlen($_POST['name']) === 0) {
    
[/code]

単純に空文字かどうかのチェックをしたいなら以下でもいいでしょう。

[code]

    if ($_POST['name'] === "") {
    
[/code]


CC BY-SA 4.0
2021-07-14T06:19:22.680
78179
2021-07-14T06:19:22.680
22665
78177
answer