2964


度々失礼します。

htmlspecialchars() expects parameter 2 to be long, array
givenというエラーが出たので解決策をしらべていたのですが、文字列を入れるべきところを配列を入れてしまっていることが原因だとは分かりました。

しかし、参考にさせていただいたところには「配列でも処理できるようになっています」と書かれています。

配列を入れたらエラーが出るのに、配列でも処理できるようになっているというのはどういう事なのでしょうか？

HTMLでのエスケープを処理する関数として、以下のコードを書いています。

[code]

    <?php
    //htmlでのエスケープ処理
    function h($var)
    {
        if(is_array($var)){
            return array_map('h',$var);
        }else{
            return htmlspecialchars($var,ENT_QUOTES,'UTF-8');
        }
    }
    ?>
    
[/code]

ちなみにですが、このコードの書かれたファイルを実行してもブラウザは真っ白な状態でなにも表示されません。

本体(？)もといエラーメッセージの出たコードの部分は

[code]

    <?php
    //  HTTPヘッダーで文字コードを指定
    header("Content-Type:text/html; charset=UTF-8");
    ?>
    <?php
    
    //h()関数の読み込み
    require_once 'h.php';
    //checkinput()関数の読み込み
    require_once 'checkinput.php';
    
    //POSTされたデータのチェック
    $_POST = checkinput($_POST);
    
    //三項演算子で検索文字列の有無を判定し処理
    $data = isset($_POST['data']) ? trim($_POST['data']) : '';
    //入力された検索文字列をexplode()関数で半角スペースで区切って配列に代入
    //全角スペースはmb_convert_kana()関数で半角スペースに変換
    $datalist = explode(' ', mb_convert_kana($data, 's'));
    //値が空の要素を削除
    $datalist = array_filter($datalist,function($val){
        return $val != '';
    });
    //値でソートしてキーを0から振り直す
    sort($datalist);
    
    ?>
    
[/code]

となっており、エラーメッセージにはon line 6 と書かれています。

初心者で申し訳ないですが、力を貸していただきたいです。 よろしくお願いします。

追記

checkinput.phpの中身は以下のとおりです。

[code]

    <?php
    
    //htmlでのエスケープ処理
    function checkinput($var){
        if(is_array($var)){
            return htmlspecialchars('checkinput',$var);
        }else{
            //magic_quotes_gpcへの対策
            if(get_magic_quotes_gpc()){
                $var = stripslashes($var);
            }
            //nullバイト攻撃対策
            //nullバイトを含む制御文字が含まれていないかをチェック（最大1000文字）
            if(preg_match('/\A[\r\n\t[:^cntrl:]]{0,1000}\z/u',$var) == 0){
                die('不正な入力です。');
            }
            //文字エンコードの確認
            if(!mb_check_encoding($var,'UTF-8')){
                die('不正な入力です。');
            }
    
            return $var;
        }
    }
    ?>
    
[/code]


CC BY-SA 3.0
2015-01-03T06:33:46.040
2961
2015-01-03T07:13:27.900
2015-01-03T07:00:26.623
5985
5985
question
php
htmlspecialchars() expects parameter 2 to be long, array givenというエラーについて


checkinput.phpのhtmlspecialcharsは、array_mapの間違いではないでしょうか。


CC BY-SA 3.0
2015-01-03T07:05:39.527
2963
2015-01-03T07:05:39.527
5984
2961
answer


すでにいくつかコメントでも指摘されていますが、エラーはhtmlspecialcharsに渡す引数が正しくないことが原因です。
checkinput.phpに書かれたhtmlspechailcharsの2番目の引数が原因でしょう。

正しい引数はマニュアルで確認できます。

  * <http://php.net/manual/ja/function.htmlspecialchars.php>

htmlspecialchars自体には配列で処理する機能はありません。 質問者さんが参考にしているh関数にそのような対応があるようです。

質問者さんはどういった用途でこちらのコードを書いているのでしょうか。
文字コードやセキュリティを考慮した実装をしようとしているようですが、こういった処理を自作して万全にすることはかなりの手間がかかります。

一般的にはこういった処理はフレームワークやライブラリに任せると一定のクオリティのコードをすぐに利用できて安心です。


CC BY-SA 3.0
2015-01-03T07:13:27.900
2964
2015-01-03T07:13:27.900
452
2961
answer