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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Q&A

解決済

1回答

1029閲覧

PHPのデータベース検索で正しくJson出力ができない

shaketonori

総合スコア22

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

0グッド

0クリップ

投稿2020/06/05 03:57

PHPを使って、質問ポイントの集計プログラムを制作中です。
質問関連のデータを取得するためにデータベースにアクセスしています。
アクセスした結果はJsonで受け取る仕組みになっています。
ところがエラーになってしまいます。

コンソールに出力されJsonが以下です。

400[{"quesAnswerId":3,"studentId":1000007,"quesName":"asda masaaki","quesAnswer":"hgfhfghfghfge":" ~中略~ ","quesAnswerDatetime":"06\u670803\u65e5 09\u664203\u5206","quesPoint":null}]

長いので途中は省略しています。
Jsonですから [ で始まり、] で終わるはずですが、先頭に「400」が混入しています。
そして最後の「quesPoint」がnullになってしまっています。

実行したPHPが以下です。
今回の結果では3行の結果が得られるはずでした。3行の「quesPoint」の値は4, 0, 0 になるはずでした。
PHPの途中に別クラスに飛ぶところがあります。このクラスでポイント集計するのですが、
nll となってしまいます。

どうやら、別クラスに飛んで集計した結果が、Jsonの中に取り込まれず、外にはみ出してしまったようです。
別クラスに飛んで集計した結果をJsonに取り込むようにするにはどのように記述したらよいでしょうか。

どなたか教えてください。
よろしくお願い致します。

PHP

1<?php 2 3 //▼▼データベース接続のパターンの読み込み 4 require_once '../common/DBAccess.php'; 5 6 //▼▼ポイント集計機能の読み込み 7 require_once '../quespoint/QuespointAggregate.php'; 8 9 $quesId = 0; 10 if(isset($_POST['quesId'])) { 11 $quesId = $_POST["quesId"]; 12 } 13 14 try{ 15 $sql = "SELECT * 16 FROM tbl_ques_answer, tbl_student 17 WHERE quesId = ? 18 AND tbl_student.studentId = tbl_ques_answer.studentId 19 ORDER BY quesAnswerDatetime DESC"; 20 21 $stmt = $conn->prepare($sql); 22 23 $stmt-> bindValue(1, $quesId, PDO::PARAM_INT); 24 25 $stmt->execute(); 26 27 $data = array(); 28 29 while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 30 31 if($row != null){ 32 33 // 別クラスでこの質問のポイントを集計 34 $point = quesPointAggregate($row['quesAnswerId'], 32); 35 36 $data[]=array( 37 'quesAnswerId'=>$row['quesAnswerId'], 38 'studentId'=>$row['studentId'], 39 'studentName'=>$row['studentName'], 40 'quesAnswer'=>nl2br($row['quesAnswer']), 41 'quesAnswerImageType'=>$row['quesAnswerImageType'], 42 'quesAnswerDatetime'=>$row['quesAnswerDatetime'], 43 'quesPoint'=>$point 44 ); 45 } 46 } 47 48 header('Content-type: application/json'); 49 echo json_encode($data); 50 51 }catch (PDOException $e){ 52 print("Error:".$e->getMessage()); 53 die(); 54 } 55 $stmt = null; 56 $conn = null; 57?> 58

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

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

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

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

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

m.ts10806

2020/06/05 04:11

quesPointAggregate()の定義をご提示ください。 あと、はいっている実際のデータ、テーブル定義もご提示ください
shaketonori

2020/06/05 06:09

m.ts10806 様 遅くなって申し訳ありません。食事に出てました。 関数 quesPointAggregate の中身は以下です。 function quesPointAggregate($quesAnswerId, $category){ //▼▼データベース接続のパターンの読み込み require '../common/DBAccess.php'; try{ // $sql = "SELECT sum(quespoint) as aggregate FROM tbl_quesanswer WHERE quesAnswerId = ? AND category = ?"; $stmt = $conn->prepare($sql); $stmt-> bindValue(1, $quesAnswerId, PDO::PARAM_INT); $stmt-> bindValue(2, $category, PDO::PARAM_INT); $stmt -> execute(); if($row = $stmt -> fetch()){ $result = $row['aggregate']; } if($result == null){ echo 0; }else{ echo $result; } }catch (PDOException $e){ print("Error:".$e->getMessage()); die(); } $stmt = null; $conn = null; } 【tbl_quesanswer】 INT TINYINT INT INT INT INT DATETIME PRIMARY KEY pointId category quesAnswerId studentId_g studentId_r quespoint uesDateTime 1 21 3 1000004 1000024 1 2020/6/2 10:21 25 21 1 1000004 1000003 1 2020/6/2 10:25 26 32 3 1000007 1000024 1 2020/6/4 14:30 27 32 3 1000007 1000024 1 2020/6/4 14:30 28 32 3 1000007 1000024 1 2020/6/4 14:30 29 32 3 1000007 1000024 1 2020/6/4 14:30 わかりますでしょうか? よろしくお願い致します。
m.ts10806

2020/06/05 06:40

質問は編集できますし、コメント欄ではマークダウン使えませんので
guest

回答1

0

自己解決

自己解決しました。
#95991 と同様の問題だったようです。

ループ内でべつのSQLを放った場合、外側のSQLと内側のSQLでは別インスタンス
が発生するので、PHP内でも $stmt と $stmt2 のようにするといいようです。

まだ、完成形には至っていませんが、もう少し頑張ればできそうです。

いろいろありがとうございました。

投稿2020/06/05 07:26

shaketonori

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問