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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

5475閲覧

LaravelでPOSTで日本語利用について

yamayamak

総合スコア131

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2017/09/09 12:04

編集2017/09/09 15:09

Laravelでスマホ向けサーバプログラムを作っているのですが以下の点を教えてください。

別サーバから以下のようにPOSTで日本語利用してRequestします。
Laravelでみるとエンコードされているので、SQLで正常に検索できません。
データが”テレビ”で入っているので、検索されないようです。

PHP.iniで念のため、mbstring.http_inputやmbstring.encoding_translationをOffにしてみても同じでした。そもそもエンコードされて送信されるのが普通のような気がします。
LaravelのControllerでデコードするのも違う気がするのですが、全てのInputをデコードするのでしょうか?

そもそも、どのように解決すべきかご教授願います。

別サーバのCurlでPOSTリクエスト

php

1$params = array( 2 's_syubetu' => 'テレビ' 3); 4$curl = curl_init($url); 5curl_setopt($curl, CURLOPT_POST, TRUE); 6curl_setopt($curl, CURLOPT_POSTFIELDS, $params); // パラメータをセット 7$response = curl_exec($curl); 8curl_close($curl);

Laravelで故意にエラーを出してSQLを出力していますがエンコードされてる「%\u30c6\u30ec\u30d3%」ので正常にselectできません。

sql

1select * from `tests` where `syubetu_name` LIKE '%\u30c6\u30ec\u30d3%'

Route

php

1Route::post('/search', 'testController@search');

Controller

php

1use Input; 2use Illuminate\Http\Request; 3use Illuminate\Support\Facades\DB; 4 5class testController extends Controller 6{ 7 public function search(Request $request) 8 { 9 $listpart = DB::table('tests'); 10 $s_syubetu = $request->input('s_syubetu'); 11 $listpart->where('syubetus.syubetu_name', 'LIKE', '\'%'.$s_syubetu.'%\''); 12 $listpart = $listpart->orderBy('updated_at', 'desc') 13 ->take(30) 14 ->get(); 15 } 16}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fagai

2017/09/09 13:16

試しにcurl_setoptのCURLOPT_POSTFIELDSの値をhttp_build_query($params)に変えてみてください。
yamayamak

2017/09/09 13:49

これは私も記載していませんでしたが、最初にやってみましたが同じでした。。。
aro10

2017/09/09 13:55

POST値がUnicodeエスケープ形式になっている様ですが、Guzzleを使った場合はどうでしょうか
yamayamak

2017/09/09 14:00

別サーバからの接続もあるので、どちらにしても解決しないといけない壁になってるので質問しました。よろしくお願いします。
aro10

2017/09/09 14:02

手順としてはとりあえずLaravelを介さずに、素のPHPでテストでPOSTを受け取ってそれがエスケープされていないかをPHP設定調整等で切り分けていくと解決していけるかと思います。
fagai

2017/09/09 14:28 編集

まずはcurlで送っているサーバーが問題なのか、受け取ってるサーバーが問題なのか切り分けましょうか。postmanのようなRESTツールを利用してPOSTをやってみて、同じエラーになるか確認してはどうでしょう?
yamayamak

2017/09/09 15:11

Laravelを使わずにPHPで受けてPrintしたら普通の日本語でした。Laravelでエンコードしているということですか???RouteとControllerを追加しましたが特に気になるようなところがないですが、設定があるのでしょうか?よろしくお願いします。
guest

回答1

0

ベストアンサー

ControllerのSQL文(LIKE)が間違っているので修正します。あと、すべてのPHPファイルのエンコードがUTF-8になっているか必ず確認してください。

下記コードのdd($s_syubetu)箇所で既に日本語がユニコードエスケープされている場合は、他のオーバーライトクラスが影響している可能性があります。app/configで必要最低限のみのソースを残してあとはコメントアウトしてみてください。

php

1//test Controller 2... 3class testController extends Controller 4{ 5 public function search(Request $request) 6 { 7 $s_syubetu = $request->input('s_syubetu'); 8 //dd($s_syubetu); //ブラウザにデバッグ出力(ここでexitします!) 9 10 //デバッグ出力有効にする 11 \DB::enableQueryLog(); 12 13 $listpart = DB::table('tests') 14 ->where('syubetus.syubetu_name', 'LIKE', "%{$s_syubetu}%"); //修正 15 ->orderBy('updated_at', 'desc') 16 ->take(30) 17 ->get(); 18 19 //storage/logs/laravel.logにデバッグ出力 20 \Log::debug('SQL Debug : ', ['tests' => \DB::getQueryLog()]); 21 //dd(\DB::getQueryLog()); //ブラウザにデバッグ出力(ここでexitします!) 22 23 //デバッグ出力無効にする 24 \DB::disableQueryLog(); 25 } 26}

curl_setopt($curl, CURLOPT_POSTFIELDS, POST値)のPOST値に配列を渡すとmultipart/form-dataでPOSTされます。ですので、あらかじめURLエンコードした文字列を渡さなくてはなりません。

php

1$params = array( 2 's_syubetu' => 'テレビ' 3); 4 5$curl = curl_init($url); 6 7curl_setopt($curl, CURLOPT_POST, TRUE); 8curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params)); //POST値(修正) 9curl_setopt($curl, CURLOPT_FRESH_CONNECT, TRUE); //キャッシュ無効(追加) 10curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); //リダイレクト対応(追加) 11//curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); //$responseにPOST先ページの結果を取得 12 13$response = curl_exec($curl); 14curl_close($curl); 15 16//必ず確認してください 17echo http_build_query($params);

上記すべてを修正しても問題が発生する場合は、苦肉の策としてControllerを下記のようにjson_decode()を入れてユニコードエスケープをデコードします。

php

1$s_syubetu = $request->input('s_syubetu'); 2$s_syubetu = json_decode('["'.$s_syubetu.'"]', true); 3echo $s_syubetu = $s_syubetu[0]; //テレビ

投稿2017/09/09 13:18

編集2017/09/09 20:43
Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamayamak

2017/09/09 13:54

Viewは使ってないのでBladeは関係ない?と思ってますが違いましたか。。。
Tomak

2017/09/09 14:16

ということは、想像してた方法とは違うようです。curl_init($url);←この$urlのPOST先のPHPコードを公開してください。特にPOST値をどのように受け取って、その値をどのようにSQLにセットしているのかが肝心なとことです。
yamayamak

2017/09/09 15:11

Laravelを使わずにPHPで受けてPrintしたら普通の日本語でした。Laravelでエンコードしているということですか???RouteとControllerを追加しましたが特に気になるようなところがないですが、設定があるのでしょうか?よろしくお願いします。
yamayamak

2017/09/10 00:04

こちらの確認ミスでした。別サーバの戻ってくる内容を確認していて、SQL自体は問題なく日本語が発行されていました。 別の問題で正常なSQL結果が確認できていなかったです。 いろいろありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問