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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

15613閲覧

Cakephp3とjQueryでajaxのjson形式での通信

yajin

総合スコア75

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

3クリップ

投稿2016/07/08 07:17

検索フォームに文字を入力しはじめると、
MySQLのテーブルに登録された用語をlike句で検索して、検索候補になるような仕組みを作ろうと考えています。

jQueryでkeyupイベント時に通信し始めるものを作っているのですが、datatypeがhtmlの場合は(.doneの方が使われる)のですが、
jsonの場合はerrorが返ってきます。json形式でやるべきことは何でしょうか。

したこと

AppController.php

public function initialize() { parent::initialize(); $this->loadComponent('RequestHandler');//追加 //略 }

route.php

Router::extensions(['json', 'xml']);//追加

jsファイル

$(function() { $('.search').on("keyup",function(){//keyup $.ajax({ url: "/words/registered", type: "post", dataType: "json",//ここがhtmlの時は.doneが使われる data: { words : $(".search").val() } }).done(function (data) { alert("success"); }).fail(function (data) { alert("error"); }); }); });

コントローラ

class WordsController extends AppController { public function beforeFilter(Event $event) { if (in_array($this->request->action, ['registered'])) { $this->eventManager()->off($this->Csrf); } } public function registered(){ $this->autoRender = false;//json形式で返すため、レンダー機能を無効化 if ($this->request->is("ajax")) { $texts = ["hoge","piyo","huga"]; $this->response->charset('UTF-8'); $this->response->type('json'); return json_encode($texts); } }

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

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

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

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

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

guest

回答2

0

単純に出力したい場合は、returnではなくechoを使います。

PHP

1// コントローラー 2echo json_encode($texts);

もしくはCakePHP3の機能を使ってjsonを返すことができます。

PHP

1// コントローラー 2$this->set('texts', $texts); 3$this->set('_serialize', ['texts']);

この場合$this->autoRender = false;は必要ありません。
またechoで出力するときと違いtextsという階層が1つ増えます。

表示を確認したい場合は、$this->viewBuilder()->className('Json');を加えると、URLで直接アクセスしたときにjsonを確認することができます。
($this->viewClass = 'Json';はバージョン3.1.0でDeprecated)

なお、質問文中のroutes.phpでjsonを指定するのは、~~/hoge.jsonという形でアクセス(取得)することができるようにするためです。
routes.phpを設定せずに~~/hogeとアクセスしても構いません。

投稿2016/07/08 17:55

編集2016/08/03 11:55
coba-coba

総合スコア1409

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

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

yajin

2016/07/09 02:18 編集

ありがとうございます。実装できました。 アルゴリズム的に以下になってるのですが、もうちょっと良い方法はありますか? 方法は、 1、keyup時に検索窓の文字のvalをjsonで送信。 2、ajax判定をして、ajaxならlike句で検索。 3、5件~6件ほど取得 4、jqueryにてdatalistの子要素optionをempty()で初期化、for文でapendで追加していく。 です。レンダリングがすこしぎこちないというか、文字をうったらすぐ反応してくれることもあれば、ちょっと待つこともあったりします。 開発環境がvagrantだからでしょうか? 最後の、echoの意味がよくわからないので、echoの使い方について補足説明していただければ幸いです。
coba-coba

2016/07/09 11:09 編集

実装できてよかったです! アルゴリズムとしては問題ないと思います。 ただ、気になる点はあるので、すでにご存じの場合は聞き流して頂きたいのですが、思い当たることを書いてみます。 長くなります。すみません。 [echo] echoを使う理由は、サーバーサイドのPHPからクライアントサイドのJavaScriptに変数を直接渡すことはできないため、echoでデータを出力する必要があるためです。 反応速度が遅いのはいくつか原因がありそうですね。 [vagrant] 1.vagrant おっしゃる通り開発環境がvagrantであることも原因の1つかもしれません。 リソースや設定次第ですので、これはなんとも言えませんね。 [データベース] あと、データベースからのデータ取得の方法も原因かもしれません。 データの数やデータの量、検索方法で速度は大きく変わります。 そのあたりどういう構成でしょうか。 1.データベース(検索方法) データの取得は一般的に完全一致か前方一致(例:'query%')でないと、データの取得に時間がかかります。 検索候補を取得するのに、後方一致(例:'%query')や中間一致(例:'%query%')を 使っていたら、かなり遅くなります。 中間一致で取得したい場合は、データベースに全文検索を導入するという手もあります。 私はSQLite3でしか試したことがありませんが、SQLite3ならFTSという全文検索用モジュールを使います。 全文検索を使うと、体感でわかるくらいかなり早くなります。 2.データベース(インデックス) データによって変わりますが、インデックスを作成すると速くなる可能性があります。 ただし、レコード数が数万件くらいならあまり関係ありません。 検索候補は全て異なるものを登録していると思うので、インデックスを作成すると効果は出そうです。 ただし、検索には完全一致か前方一致である必要があります。後方一致や中間一致では意味がありません。 3.データベース(取得のタイミング) 検索フォームに文字を入力する時に、入力イベントがあるたびに毎回データベースにアクセスするのではなく、入力後に一定時間経過後(0.5秒後など)に検索するのもよさそうです。 データベースにアクセスする回数を減らせば、それだけ通信の負担が減らせますし。 4.データベース(先に全てのデータを取得) データの数が少なかったり、セキュリティ的に問題なければ、ページを表示する際に検索候補を全て先に取得してしまう方法もあります。
yajin

2016/07/09 12:20

ありがとうございます! 1,2は対策済です。前方一致です。 3、取得のタイミング これは確かに検討の余地がありそうですね。かしこまりました。 4、数万種類ありますのでちょっと難しいと思います。 意外と時間がかからず解決できてよかったです。ありがとうございました。
guest

0

ベストアンサー

returnで返すんじゃなくてjson_encodeしたものを$this->setして、
URLを"/words/registered.json"とかにしてみてはいかがでしょう?

投稿2016/07/08 08:42

Yasha_Wedyue

総合スコア830

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

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

yajin

2016/07/08 10:08 編集

ありがとうございます! http://192.168.33.10:8888/コントローラ名/メソッド.json でアクセスしたところ、エラーを吐いていたので、 use Cake\Event\Event; を追加してみたところ、エラーを吐かなくなりました。 これは送信できてるということでよろしいのでしょうか?
yajin

2016/07/09 02:17 編集

粘り続けたところ、無事実装できました。 ありがとうございます。 しかし、いざ動かして見るとちょっとぎこちない感じもします。 アルゴリズム的にこうしたほうがよいとのご指摘はありますか? 方法は、 1、keyup時に検索窓の文字のvalをjsonで送信。 2、ajax判定をして、ajaxならlike句で検索。 3、5件~6件ほど取得 4、jqueryにてdatalistの子要素optionをempty()で初期化、for文でapendで追加していく。 です。レンダリングがすこしぎこちないというか、文字をうったらすぐ反応してくれることもあれば、ちょっと待つこともあったりします。 開発環境がvagrantだからでしょうか?
yajin

2016/07/11 02:47

デバッグの仕方が一番効果的だったのでこちらにさせていただきました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問