LoginSignup
2
0

More than 3 years have passed since last update.

51歳からのプログラミング 備忘 View->Controllerに連想配列 / cocntroller->script / controller->html / (e) htmlspecialchars() expects parameter 1 to be string, array given

Last updated at Posted at 2019-04-28

勘違いで多くの時間を無駄にすることが多々あり、今回もそのケース。

<勘違い>
ControllerからViewに連想(ハッシュ)配列を渡そうとして(勘違い)、
htmlspecialchars() expects parameter 1 to be string, array given
期待されたパラメータ1は文字なのに、配列が渡されているよ、というエラーが来た。

<正しくは>
発生したファイルはViewだったので、連想配列の受け取り時にエラーが出たのだと勘違いしていたら、ViewからControllerに連想配列を返そうとして生じたエラーだった。

ControllerからViewに配列をわたし、php-foreachやjs-echo、jq-$.echoで繰り返し処理する場合にも生じたりする。View側に連想配列を渡すときに、改行やクォテーションが文字列に変換されてしまい、配列じゃなくなったりする(のだと思う)。この場合の処理は、このページの最後に記載してます。

エラーコード

View_エラーコード
// $param=['ap'=>'apple','bn'=>'banana','rm'=>'remon']

<input type="hiddem" name="param" value="{{$param}}"/>

inputで配列を送ろうとしてのエラー。
初心者ならではの、ですね。

View_修正コード
@php 
foreach($param as $key =>$value)
{
echo '<input type="hidden" name="param['.$key.']" value="'.$value.'"/>';
}

これでControllerへのRequestに連想配列を渡せた。

エラーの発生個所やエラー内容の特定に数時間かけてしまった。
初心者って凄く時間を掛けてしまうのですね。

controller->script

//controller --------------------
$param=['param'=>$param];
return view('/',$param);

//blad.php   --------------------
<script>
$(function(){
  console.log({{$param}});
});
</script>

<body>
  {{$param}}
</body>

同一ファイル内で javascript -> php(ララベル-bladeで)

<script>
  window.onload=function(){
    var param           = 222;
        document.cookie = "sample="+param+"";
  }
</script>

<body>
@php
  $sample = COOKIE['sample'];
  echo $sample;
@endphp
</body>

// 実行結果
// 222

laravelController -> view.javascript に連想配列を送受信

どうやら、コントローラからjavascriptに連想配列を直接送受信できないらしい。送受信のステップは、

  1. Controller側で、連想配列を、Jsonコードに変換してviewに送信
  2. viewで、受信した連想配列をJSON.parse()する
  3. parseした配列を回す
Controller
$person = Person::get(['id','name','e-mail'])->toJson();
return view('top',['person'=>$person]);
<script>
   $(function(){
     var personArray = JSON.parse('<?php echo $person; ?>');
     $.each(personArray,function(key,value){
        console.log(value);
     });
   });
</script>
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0