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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

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

PHP

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

7090閲覧

php postされた値を用いてDBからデータを取得するには

Hutax

総合スコア32

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

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

PHP

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2016/09/16 06:55

編集2016/09/16 10:35

###前提・実現したいこと
Unity、php、MySQLを用いたシステムを開発、勉強しています。
システムの概要は、Unity側からPOSTしたデータをphpで受け取り、そのデータを用い、SELECT文でMySQLに保存してあるデータを取得し、それをJSON形式にしてUnityに返す処理を行っています。

実現したいことは、UnityにJSON形式で返されたデータを用いて、動的に作成されるボタンのTextとして表示をしたいと考えています。

###発生している問題・エラーメッセージ
ここで発生している問題は、Unity側に返されたJSONデータをGetData.csで用い、作成されるはずのボタンが作成されませんでした。
ログを参照したところ、送られているはずのJSONデータが何も送られておらず、postdata.phpの表示は[]のみ表示されており、JSONで中身が取得できていな状況でした。

###該当のソースコード
postdata.php

lang

1<?php 2require_once('config.php'); 3require_once('functions.php'); 4 5 //unityから送信されてきたデータ どちらも値は1が送られてきている 6 $year = $_POST['year']; 7 $month = $_POST['month']; 8 9$dbh = connectDb(); 10 11$sth = $dbh->prepare("SELECT * FROM table WHERE year = '$year' AND month = $month"); 12$sth->execute(); 13 14$selectData = array(); 15 16while($row = $sth->fetch(PDO::FETCH_ASSOC)){ 17 $selectData[]=array( 18 'success'=>$row['success'], 19 'failed'=>$row['failed'], 20 ); 21} 22 23header('Content-type: application/json'); 24echo json_encode($selectData); 25 26

GetData.cs

lang

1using UnityEngine; 2using System.Collections; 3using MiniJSON; 4using UnityEngine.UI; 5 6public class GetData : MonoBehaviour 7{ 8 9 [SerializeField] 10 RectTransform prefab = null; 11 12 void Start() 13 { 14 StartCoroutine("GetJSON"); 15 } 16 17 IEnumerator GetJSON() 18 { 19 // webサーバへアクセス 20 WWW www = new WWW("http://localhost/postdata.php"); 21 22 // webサーバから何らかの返答があるまで停止 23 yield return www; 24 // もし、何らかのエラーがあったら 25 if (!string.IsNullOrEmpty(www.error)) 26 { 27 // エラー内容を表示 28 Debug.LogError(string.Format("Fail Whale!\n{0}", www.error)); 29 yield break; // コルーチンを終了 30 } 31 // webサーバからの内容を文字列変数に格納 32 string json = www.text; 33 // JSONデータは最初は配列から始まるので、Deserialize(デコード)した直後にリストへキャスト 34 IList List = (IList)Json.Deserialize(json); 35 36 // リストの内容はオブジェクトなので、辞書型の変数に一つ一つ代入しながら、処理 37 foreach (IDictionary list in List) 38 { 39 string success = (string)list["success"]; 40 string failed = (string)list[failed"]; 41 42 43 var item = GameObject.Instantiate(prefab) as RectTransform; 44 item.SetParent(transform, false); 45 46 var text = item.GetComponentInChildren<Text>(); 47 text.text = "成功 " + success.ToString() + "失敗 " + failed.ToString(); 48 } 49 50 } 51 52} 53

Post.cs

lang

1using UnityEngine; 2using System.Collections; 3 4public class Post : MonoBehaviour { 5 6 void Start () 7 { 8 StartCoroutine(Connect()); 9 } 10 11 private IEnumerator Connect() 12 { 13 string url = "http://localhost/postdata.php"; 14 15 //WWWForm:WWWクラスを使用してwebサーバにポストするフォームデータを生成するヘルパークラス 16 WWWForm wwwForm = new WWWForm(); 17 18 //AddFieldでfieldに値を格納 19 wwwForm.AddField("year", CntrlBtn.Instance.Postyear); 20 wwwForm.AddField("month", CntrlBtn.Instance.Postmonth); 21 22 //WWWオブジェクトにURL,WWWFormをセットすることでPOST,GETを行える。 23 WWW form = new WWW(url, wwwForm); 24 25 //実行 26 yield return form; 27 Debug.Log(form.text); 28 } 29}

###試したこと
postdata.phpのPOSTされたデータ
$year = $_POST['year'];
$month = $_POST['month'];

を用いず、

$year = 1;
$month = 1;
と値を指定して実行すると、Unity側で正常に動作します。

phpにpostされたデータを用いて取得してきたデータは、JSONに変換することはできないのでしょうか?

まだUnity、php等プログラミングに関して、始めたばかりですので、至らない点が多く、皆様のお力をお借りしたいと思い投稿しました。
拙い説明ではあると思いますが、ご教授お願いできませんでしょうか。
よろしくお願い致します。

###補足
ご回答がありましたように、Unity側から、phpへデータをPOSTしているソースコード Post.csを載せました。
このソースでは、Unityで、ボタンを押したとき、そのボタンについてるTextの値を取得し、それをphpにpostしています。

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

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

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

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

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

guest

回答2

0

とりあえずPOSTデータをfilterするところから

PHP

1$year = filter_input(INPUT_POST,'year'); 2$month = filter_input(INPUT_POST,'month') 3

prepare処理がおかしいので調整

PHP

1$sth = $dbh->prepare("SELECT * FROM table WHERE year = ? AND month = ?"); 2$sth->execute([$year,$month]);

ただし普通のデータの持ち方ならyear=1だとfetchしてもデータは1個もヒットしないのでは?
何もないデータの戻り値を返すには変数の初期化が必要です

PHP

1$selectData=[];//初期化してから追加していく 2while($row = $sth->fetch(PDO::FETCH_ASSOC)){ 3$selectData[]=・・・ 4}

投稿2016/09/16 07:07

yambejp

総合スコア114572

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

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

Hutax

2016/09/16 15:01 編集

yambejp様 ご回答ありがとうございます。 ご教授いただきました、 POSTデータをfilter、 prepare処理 を参考に、変更させていただきました。 DBから取得した値を配列に格納する際、 http://php.net/manual/ja/language.types.array.php を参考に、$selectData = array();で一度初期化しています。 しかし、filter処理、prepare処理を変更してみても、JSON形式でデータを送れていないようです… もう少し考えてみます ありがとうございました
guest

0

ベストアンサー

unityが良く分かりませんがPOST送信する必要が有るのではないでしょうか?

get送信

WWW www = new WWW("http://localhost/postdata.php");

POST送信

c#

1WWWForm form = new WWWForm(); 2form.AddField("year", "1"); 3form.AddField("month", "1"); 4string url = "http://localhost/postdata.php"; 5WWW www = new WWW(url, form);

すみません環境が無くテストできておりません。

投稿2016/09/16 08:41

A.Ichi

総合スコア4070

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

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

Hutax

2016/09/16 08:59

A.Ichi様 ご回答ありがとうございます。 こちらの説明不足もあり、Unity側からphpへPOST送信するソースコードを載せるのを忘れていました。 丁寧にソースコードまで教えていただいたにも関わらず、私のミスでお手数をおかけしてしまい、申し訳ございませんでした。
Hutax

2016/09/16 09:31

A.Ichi様 申し訳ございません こちらのミスです。 お手数をおかけしました…
A.Ichi

2016/09/16 10:31

何度も修正すみません。受取りPOSTを1に設定するとOKであれば、送信の状態をみたいので CntrlBtn.Instance.Postyear、CntrlBtn.Instance.Postmonthを”1”としてテストしてみるのは、いかがでしょうか?
Hutax

2016/09/16 10:45

A.Ichi様 先ほど、こちらでも送信がしっかりできていないのではと考え、 postdata.phpの $dbh = connectDb();の前に、 echo "$year "; echo "$month "; を加え、 Post.csの yield return form;の後に Debug.Log(form.text); を加え実行したところ、 押したボタンに書かれた数値のデータをしっかりと送ることができていました。 ご指摘いただきました、 CntrlBtn.Instance.Postyear、CntrlBtn.Instance.Postmonthを”1”としてテストも行いましたが、しっかりと1を送れていたため、送信には問題はないかと考えています。
A.Ichi

2016/09/16 14:28

強引ですが$year = (int)$_POST['year'];とすれば、$year = 1;としたのと同等になると思います。(manthも) あと気になっているのはWHERE句のyearとmonthのタイプが違う事くらいです。
Hutax

2016/09/16 15:07

A.Ichi様 キャストして文字列から数値にするということですね。 参考にさせていただき、変更したところ、無事行いたい処理ができました。 多くの助言、本当に助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問