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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

jQuery

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

Q&A

1回答

533閲覧

MySQLのデータを配列に格納し、jQueryUIのオートコンプリートで表示したい

reFX_Nexus

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

jQuery

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

0グッド

0クリップ

投稿2018/09/25 03:21

編集2018/09/25 05:00

前提・実現したいこと

お世話になります。
MySQLからデータを取得し、その内の1列を取り出して配列に格納後、
JQuery UIのautocompleteメソッドを使用したオートコンプリート機能で表示させたいと考えております。
イメージ説明

今回の場合は、name_jaの全項目をテキスト入力欄の候補として表示したいです。
しかし、一通りコードを組んでみても、候補が1つも表示されません。

該当のソースコード

以下PHPはautocomplete-datasource.php内の記述となります。

PHP

1<?php 2$mysqli = new mysqli($sql_hostname, $sql_username, $sql_password, $sql_userdb_name); 3if( $mysqli->connect_errno ) { 4 echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error; 5} 6$query = "SELECT `name_ja` FROM `class`"; 7$mysqli->set_charset('utf8'); 8$result = $mysqli->query($query); 9while($ls = $result->fetch_array(MYSQLI_ASSOC)) { 10 $list[] = $ls; 11} 12$mysqli->close(); 13 14$b = array(); 15 16if(isset($_POST['param1'])){ 17 $w = $_POST['param1']; 18 foreach($list as $i){ 19 if(stripos($i, $w) !== FALSE){ 20 $b[] = $i; 21 } 22 } 23 echo json_encode($b); 24} 25else{ 26 echo json_encode($b); 27}

HTML

1<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script> 2<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script> 3<script type="text/javascript"> 4 $(document).ready( function() { 5 $("#ac2").autocomplete({ 6 source: function(req, resp){ 7 $.ajax({ 8 url: "./autocomplete-datasource.php", 9 type: "POST", 10 cache: false, 11 dataType: "json", 12 data: { 13 param1: req.term 14 }, 15 success: function(o){ 16 resp(o); 17 }, 18 error: function(xhr, ts, err){ 19 resp(['']); 20 } 21 }); 22 23 } 24 }); 25 }); 26 </script> 27 28(中略) 29 30<input type="text" id="ac2" name="class" class="form-control">

試したこと

var_dump($list);を実行してみたところ、以下のように表示されました。

array(3) { [0]=> array(1) { ["name_ja"]=> string(11) "授業名01" } [1]=> array(1) { ["name_ja"]=> string(11) "授業名02" } [2]=> array(1) { ["name_ja"]=> string(11) "授業名03" } }

$listをMySQLから取得したものではなく、array("01","02","03");などに変更すると、オートコンプリートが正常に動作するため、配列の問題であることまではわかりました。しかし、どこが問題なのかがわかりません…。
上記の01,02,03の場合のvar_dump($list);の出力結果は以下になります。

[]array(3) { [0]=> string(2) "01" [1]=> string(2) "02" [2]=> string(2) "03" }

補足情報(FW/ツールのバージョンなど)

PHP Version 7.2.7

初歩的な質問で恐縮ですが、何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

似たようなことを考えてほぼほぼ似たような作りで作ったことがあるのですが、
以下の形で取れないですかね?

jQuery

1~前略 2success: function(o){ 3 resp(o); 4}, 5~後略

jQuery

1~前略 2success: function(o){ 3 resp(o.success); 4}, 5~後略

何れにせよoの中身を見てみると良いかもです。

######追記
参考までに当方の方で動作が確認できているソースを記載しておきます。(MySQL、FuelPHP)

見当違いの回答だったっぽいので不要なコードは消し消し。
恐らく以下が問題になっているのではないかと。

PHP

1if(isset($_POST['param1'])){ 2 $w = $_POST['param1']; 3 foreach($list as $i){ 4 if(stripos($i, $w) !== FALSE){ //←ここ 5 $b[] = $i; 6 } 7 } 8 echo json_encode($b); 9} 10else{ 11 echo json_encode($b); 12}

$listから取り出した要素$iarrayなので、
ここで$w(=$_POST['param1'])との比較に失敗してしまっていると考えられます。

コメントにも書きましたが以下のように変更すれば解消できるのではないでしょうか。

PHP

1if(isset($_POST['param1'])){ 2 $w = $_POST['param1']; 3 foreach($list as $i){ 4 if(stripos($i['name_ja'], $w) !== FALSE){ //←ここ 5 $b[] = $i['name_ja']; 6 } 7 } 8 echo json_encode($b); 9} 10else{ 11 echo json_encode($b); 12}

投稿2018/09/25 04:18

編集2018/09/25 08:24
madoka9393

総合スコア992

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

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

reFX_Nexus

2018/09/25 05:01

ありがとうございます。 頂いたアドバイス通りに実行してみましたが、やはりダメでした…。 オートコンプリートリスト自体が表示されなくなってしまい、resp(o);に戻した次第でございます。
madoka9393

2018/09/25 05:03

そうだったのですね…。 因みにですが「o」の中身は確認できている(=successには来ている)のですよね?
reFX_Nexus

2018/09/25 05:28

そうですね。success自体には来ております。 バックグラウンドを見てみましたが、autocomplete-datasource.phpとのデータのやり取りも問題なくできているようです。
madoka9393

2018/09/25 05:43

レコードを取得する部分については恐らく問題なく、といったところですかね…。 「console.log(o)」等で「o」の中身は確認されていますか?
reFX_Nexus

2018/09/25 05:56 編集

console.log(o)を実行したところ、 MySQLで取り出した配列で自動補完をしようとする場合にのみ、「Uncaught ReferenceError: o is not defined」が表示されました。 $list = array( "授業名01", "授業名02", "授業名03" ); のように、PHPファイル内にarray()を使用し配列を格納するとエラーは発生しないのですが…。 not definedなので、やはり配列の形式に関するエラーなのでしょうか…。
madoka9393

2018/09/25 06:06

「o is not defined」ということはレコードの取得部分を返す部分で何か悪さをしているかもしれませんね…。 該当部分以下のように変更して成功が出るようなら「autocomplete-datasource.php」自体は上手く言ってると思われます。 success: function (o){ if(!o.error){ console.log("成功"); resp(o); } }
reFX_Nexus

2018/09/25 06:17

ありがとうございます。参照元をMySQLのデータにした上で試したところ、「成功」は表示されませんでした…。 先ほどと同じように参照元をarray()配列で試すと、表示されました。
madoka9393

2018/09/25 06:40

今更ながら「var_dump($list)」取れている≒レコードの取得はできているようですので、 「$list」を「$b」に詰め替えるところで問題が発生していると考えられますね。 以下の部分が怪しいです。 if(stripos($i, $w) !== FALSE){  $b[] = $i; } 「$i」が「$i['name_ja']」とかだったりしないですかね…? 「$i」と「$w」をそれぞれ出力させて一致しているかどうか目視で確認してみるというのはどうでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問