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

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

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

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1816閲覧

ajaxのGETでMySQLのデータから特定の値を取得する方法

hiro-chan

総合スコア18

MySQL

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/01/29 06:23

表題の通り、GETでデータを取得するさいに以下のようなエラーが出て困っています。

<br /> <b>Fatal error</b>: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'yamada' in 'where clause' in /var/www/html/.vscode/DB_write_test/get_latlng_test.php:52 Stack trace: #0 /var/www/html/.vscode/DB_write_test/get_latlng_test.php(52): PDOStatement-&gt;execute() #1 {main} thrown in <b>/var/www/html/.vscode/DB_write_test/get_latlng_test.php</b> on line <b>52</b><br />

main_test.php

php

1 <script> 2345 $(function() { 6 78910 $('#btn2').click(function(){ 11 function get_latlng(){ 12 $.ajax({ 13 url: "get_latlng_test.php", 14 type: "GET", 15 datatype: "json", 16 data: { 17 get_name : 'yamada' 18 }, 19 }).done(function(data){ 20 //$('#result').html(data.lng + ' ' + data.lat); 21 $('#result').html(data.latlng); 22 //console.log("名前" + data[0].user_name + "の経度は" + data[0].lng + "で、緯度は" + data[0].lat+"です"); 23 console.log("DB通信完了_GET"); 24 console.log(data); 25 }).fail(function(data){ 26 console.log("DB通信失敗_GET"); 27 console.log(data); 28 }); 29 }; 30 get_latlng(); 31 }); 32 }); 33 </script>

get_latlng_test.php

php

1<?php 2ini_set('display_errors',1); 3session_save_path('/home/*****/session'); 4session_start(); 5require 'database_test.php'; 6$get_name = (string)$_GET['get_name']; 7$pdo = connect(); 8$stmt_get = $pdo->prepare("SELECT latlng FROM User3 where 'user_name' = $get_name"); 9$stmt_get->execute(); 10$mapping_list = array(); 11while($row = $stmt_get->fetch(PDO::FETCH_ASSOC)){ 12 $mapping_list[] = array( 13 'latlng' => $row['latlng'] 14 #'lat' => $row['ST_Y(latlng)'] 15 ); 16} 17header('Content-type: application/json'); 18echo json_encode($mapping_list,JSON_UNESCAPED_UNICODE); 19?> 20

table内容(テーブル名:User3)

mysql

1mysql> select * from User3; 2+----+------------+--------------------------------------------------------------+---------------------------+ 3| id | user_name | password | latlng | 4+----+------------+--------------------------------------------------------------+---------------------------+ 5| 1 | ashial.Ltd | pass | `? fxa@伀{摶攸@ | 6| 2 | minase | $2y$10$Yui/2sBgOTAKO9O3Qr/n2e2U69z9mopEu73iNAx0RYSuolEPIp9Om | : 7 ?糢a@_O*俚卅@ | 8| 3 | uchida | $2y$10$.lb2b7InyUYQ2yzfCr1AD.8aKb9y5rN2dRQQFb2jEEjSiXC4vhL8y | (@ 9@ | 9| 4 | yamada | $2y$10$easFTwRXddoVepx4ojct8u.7Fdzljv47XfDBWXZAFA1Mj1/VUvbVq | ]u?囓a@?w⊥卅@ | 10| 5 | toriyama | $2y$10$iYMCbJtlGFTAy2/X73WVguq3IKH4ibHBAnGSI2VpaAshbQxZAXcLu | `? fxa@伀{摶攸@ | 11+----+------------+--------------------------------------------------------------+---------------------------+ 125 rows in set (0.00 sec) 13latlngカラムはgeometry型のため、文字化けがする仕様のようです。

尚、User3は以下のコマンドで作成しました

mysql

1CREATE TABLE `User3` ( 2 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'AI', 3 `user_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '氏名', 4 `password` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'パスワード', 5 `latlng` geometry NOT NULL, 6 PRIMARY KEY (`id`), 7 UNIQUE KEY `user_name` (`user_name`), 8 SPATIAL KEY `spot_latlng_index` (`latlng`) 9) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

プログラムの説明
main_test.phpのボタンbtn2をクリックすると、変数get_nameでyamadaが送られます。
get_latlng.phpで受け取り、$get_nameに格納、この$get_nameをwhere句に挿入して、yamadaさんのlatlngカラムのデータを取得して、$mapping_list[]にlatlngとして格納し、$mapping_listをmain_test.phpに返します。main_test.phpでは「$('#result').html(data.latlng);」のように、ブラウザ画面に表示するようにしています。

しかし以下のようにエラーが出ております。

イメージ説明

エラーメッセージに記載のget_latlng.phpの53行目は
$stmt_get->execute();
の箇所です。

切り分け等含め何かしらの解決方法があればご教示の程よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

実際にSQL直に 'user_name' = yamadaで実行してみるとわかると思います。
クォーテーションなければカラムと認識されます。

ただ、今のままで値にクォーテーションつけても想定通りの結果にはならない思います。
シングルクォーテーションつけたら「文字列」とみなすので
'user_name' = 'yamada'としても、user_nameという文字列がyamadaという文字列のデータをSELECTというわけのわからない指示をしてることになります。
MySQLにもドキュメントがあるので文法を確認してください。

で、あとこのままではSQLインジェクションの脆弱性がありますので、SQLのエスケープ掛けるか、できればプリペアドステートメント利用して安全に外部からの入力値をDBに渡しましょう。
PHPでデータベースに接続するときのまとめ

投稿2020/01/29 06:32

編集2020/01/29 06:39
m.ts10806

総合スコア80850

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

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

yambejp

2020/01/29 06:33

> yamadaという文字列のデータ ちょっと違います、yamadaという「カラム」を参照します エラーメッセージもそうなってますね
m.ts10806

2020/01/29 06:36 編集

書き方が悪かったかもしれませんが "今のままで値にクォーテーションつけても想定通りの結果にはならない思います"から入ってるので「yamadaにシングルクォーテーションつけた前提」です。
yambejp

2020/01/29 06:36

あ、そういうことですか、失礼しました
m.ts10806

2020/01/29 06:37

いえいえ。誤解する人がいてはいけないので、コードつけときます。
hiro-chan

2020/01/29 06:56

ご教示ありがとうございます。
m.ts10806

2020/01/29 06:59

あとはPHPのほう、try-catchでPDOExeption拾うのは必須ですね。そこでMySQL側のエラーもきちんと拾えるはずです
hiro-chan

2020/01/29 07:38 編集

解決いたしました。早急にご回答いただき感謝申し上げます。 PHPの”いろは”等もご教示いただき、参考になりました。 またご縁がございましたらよろしくお願いいたします
m.ts10806

2020/01/29 08:18

構文エラーでたら基本はドキュメント、マニュアルを確認してください。 どこかの誰かが書いた記事を鵜呑みにするよりずっと良いです
guest

0

ベストアンサー

$stmt_get = $pdo->prepare("SELECT latlng FROM User3 where 'user_name' = $get_name");

$stmt_get->execute();

が変です

投稿2020/01/29 06:29

yambejp

総合スコア114829

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

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

yambejp

2020/01/29 06:30

こうですかね $stmt_get = $pdo->prepare("SELECT latlng FROM User3 where `user_name` = ?"); $stmt_get->execute([$get_name]);
yambejp

2020/01/29 06:31 編集

・カラム名をシングルクォーテーションでくくってはいけません ・prepareで処理するなら疑問符かラベルをつけてください
hiro-chan

2020/01/29 06:40

シングルクォーテーションの件、承知しました。ご回答ありがとうございます。 編集後、chromeの開発ツールのコンソール上には「DB通信失敗_GET」と出てしまいました。 $stmt_get = $pdo->prepare("SELECT latlng FROM User3 where `user_name` = ?");ではなく、 $stmt_get = $pdo->prepare("SELECT latlng FROM User3 where user_name = ?"); の場合もテストしましたが、同様の「DB通信失敗_GET」が表示されました。
yambejp

2020/01/29 07:01 編集

.fail()のところを .fail(function(xhr,err){ console.log(err); }) としてみてください、parsererrorが返ってきませんか? datatype: "json"のところを別の形式で返ってきたらfailに流れます とりあえずはdataType: "text"で切り分けることができます
hiro-chan

2020/01/29 06:56

おっしゃるとおり、parsererrorが返ってきました。 text、jsonともparsererrorとなっており、この先どうすればよいか。。
yambejp

2020/01/29 07:00

まずは header('Content-type: application/json'); を外してみてください あと、datatypeはdataType:"text" ※大文字注意 です
hiro-chan

2020/01/29 07:09 編集

ありがとうございます。 chromeのコンソール上には"DB通信完了_GET"という表示に変わりました。 エラーっぽいところは表示されていません。 しかし、ブラウザ画面にdata.latlngが表示されないため、 切り分け自体は先に進んだ感じです。
yambejp

2020/01/29 07:13

成功の方にながれるのでしたら .done()を .done(function(data){ console.log(data); }) で確認してください 想定したデータが戻ってきていますか? そのデータは.latlngが参照できる形式ですか?
hiro-chan

2020/01/29 07:29

値が返ってきませんでした。chromeのコンソールには空白が表示されました。 $stmt_get = $pdo->prepare("SELECT ST_X(latlng) as lng, ST_Y(latlng) as lat FROM User3 where user_name = ?"); に変えると、[{"lng":"139.7362198","lat":"35.647384599999995"}]が表示されました。 .latlngが参照されないことが原因とわかりました。 元々、文字化けしたgeometry型のデータではなく、このような読めるデータの取得が目的でしたので、解決いたしました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問