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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

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

Q&A

1回答

4873閲覧

【laravel】検索フォームでPOSTした文字が化けるバグを改修したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

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

0グッド

0クリップ

投稿2017/07/14 07:23

編集2022/01/12 10:55

laravelで、検索フォームで検索をしようとしても検索が全くできません。
(具体的には、検索結果が引っかかりません。)

その原因が、入力された文字が文字化けを起こしているというところまでは判明しております。
mysqlの文字コードが「UTF8」なので、入力された文字もそれにあわせれば検索ができるようになるというところまではわかっているのですが、どこにどのように記載すればよいかご教授いただけますでしょうか。

現状の設定は、

【php.ini】↓

mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = pass mbstring.http_output = pass mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none;

としており、laravelの各viewファイルは特に文字コードの設定をしておりません。

よろしくお願いいたします。

public static function searchCommon($where = null, $sortFunc = null) { $input = request()->all(); $validator = \Validator::make($input, [ 'q' => 'string|max:255', 'page' => 'integer|not_in:0,1', 'search' => 'integer' ]); if ($validator->fails()) return app()->abort(404); $page = isset($input['page']) ? (int)$input['page'] : 1; $search = isset($input['search']) ? (int)$input['search'] : 0;dd($input['search']); if ($search) { $data = Search::select('result', 'query')->where('id', $search)->first(); $ids = $data ? $data['result'] : []; $q = isset($data['query']['q']) ? $data['query']['q'] : ''; } else { $q = isset($input['q']) ? $input['q'] : ''; $query = Fulltext::where('type', '<>', 'job'); if ($q !== '') $query->whereIndex($q); if (!is_null($where)) $query->where($where); $ids = NULL; if ($sortFunc) { $query = $query->select('id', 'type', 'main_id')->get()->toArray(); usort($query, $sortFunc); $ids = array_pluck($query, 'id'); } else { $ids = array_map('intval', $query->orderBy('time','DESC')->lists('id')->toArray()); } $search = new Search(); $search['result'] = $ids; $search['query'] = ['q' => $q];dd($search); $search->save(); $search = $search['id']; } }

下の方にある「$search['query'] = ['q' => $q];」にてdd($search);をかけたところ
下記のような表示がなされます。

Search {#304 ▼ #table: "searches" #casts: array:3 [▶] #connection: null #primaryKey: "id" #perPage: 15 +incrementing: true +timestamps: true #attributes: array:2 [▼ "result" => "[]" "query" => "{"q":"\u91d1\u5c71"}" ] #original: [] #relations: [] #hidden: [] #visible: [] #appends: [] #fillable: [] #guarded: array:1 [▶] #dates: [] #dateFormat: null #touches: [] #observables: [] #with: [] #morphClass: null +exists: false +wasRecentlyCreated: false }

上記は「会計」で検索しようとして表示された文字化けとなります。

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

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

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

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

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

guest

回答1

0

php.iniの設定はまずはLaravelを介さずに、素のPHPファイルをtest.phpなどで作って$_POSTのデータを確認するとPHPで設定が正しいかどうか確認できると思います。

postされた文字列がMySQLに受け渡す前にLaravelで文字化けしていないか確認する場合は、ルータのクロージャかコントローラで、dd($request->all())でダンプするか、logger($request->all())でlaravel.logを見るとよいかと思います。

また、データベース・アクセスのコードの手前で

\DB::enableQueryLog();

を行い、データベース・アクセス後に

dd(\DB::getQueryLog())l

を行うと、Laravelで発行したSQL文が確認できます

LaravelからMySQLへの接続への文字コード設定は、config/database.phpのmysqlの部分のcharsetで定義されています
それでも文字化けする場合は、MySQL側で実際のクエリのログを取る設定などで確認すると良いかと思います。

投稿2017/07/14 07:55

aro10

総合スコア4106

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

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

退会済みユーザー

退会済みユーザー

2017/07/14 08:20

ご回答ありがとうございます。 質問内容に追加をさせていただきましたが、 「 "query" => "{"q":"\u91d1\u5c71"}"」 で文字化けが起こっていることがわかると思います。 ddの箇所といたしましては、mysqlにクエリが投げられた後と思いますが、前と後とではどういった違いがあるのでしょうか?
aro10

2017/07/14 08:48

\u91d1という\uが先頭つくもののが、ユニコードエスケープ形式というUTF-8にデコード前の文字形式なので、何か変換がうまくいっていないようですが、実際に動くシステムが分からないのでこれ以上はちょっとなんとも言えませんね・・ 原因究明としては、ユニコードエスケープ形式に関わる情報まわりを調査してみてください。 またコードが複雑なので、どこかで不正な変換や2重変換等がされているかもしれないので、これを機会にコードを一度リファクタリングして整理してもよいかもしれません。
退会済みユーザー

退会済みユーザー

2017/07/14 09:05

ありがとうございます。 ちなみにですが、 上記のfunctionの最後にreturnをしていまして、その手前でddをかけたところ「会計」を表示させます。 returnは下記のようになります。 return [ 'q' => $q, 'count' => $count, 'search' => $search, 'page' => $page, 'perPage' => self::PER_PAGE, 'mains' => $mains, ]; この場合ですが、入力文字の変換がなされていないということになりますでしょうか?
aro10

2017/07/14 09:11

functionの最後のreturnでは、 $qの値がユニコードエスケープ形式でなく意図した入力の「会計」になるという事であれば、問題の範囲はクライアントからのPOSTとPHP、LaravelまではOKで、DBアクセス部分に絞れるかと思います。
退会済みユーザー

退会済みユーザー

2017/07/14 09:18

aro10様の仰るように、意図した入力の「会計」となります。 質問ばかりで大変申し訳ございませんが、DBへのアクセスがフリーワードでの検索でのみうまくっていないということになるのですが、文字コードが一致しているにも関わらず検索ができないというのはどういった場合が想定できるのでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/14 09:30

aro10様 失礼いたしました。 見落としがありました。 mysqlのDBの「query」カラムを見たところ、ユニコードエスケープ形式で保存されていました。
aro10

2017/07/14 09:55

調査方法としては、問題範囲を最小化するためにroutes/console.phpにDBアクセス用の最小限のテストプログラムを書いて、 ``` $data = Search::select('result', 'query')->where('id', 1)->first(); ``` 簡単にartisanコマンドで確認できるようにしたあとに、関連すると思われる各種設定や別環境等での組み合わせを一つ一つ検証して潰していくしかないですね。 ここまで問題が絞れれば、もう少しでできると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問