###前提・実現したいこと
Androidアプリを開発しています。そこで発生した問題を質問させていただきます。
今、Unityから送信したデータをPHPに送り、PHPからPDOを使ってMySQLと通信し、MYSQLからPHPに帰ってきたデータをまたUnityに返すという、機能的に言うと、いわゆるログインシステムを作りたいと思っています。
しかし、Unityで動作確認をしてみるとCatchable fatal error というものが出て動作が成功しません。送る文字型が悪いのかと、該当部分をint型やstring型に直しても動作しませんでした。誰か、この問題の解決策を教えてもらえないでしょうか?
###発生している問題・エラーメッセージ
<br /> Catchable fatal error: Object of class PDOStatement could not be converted to string in /var/www/html/dir/loginsys.php on line 15<br /> UnityEngine.Debug:Log(Object) <Post>c__Iterator1:MoveNext() (at Assets/1.program/接続/Catch.cs:53) UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
###該当のソースコード
◆◆◆PHPとMySQLの橋渡しをするコード(ファイル名:mysql_connect.php)◆◆◆ <?php function connectDB(){ $dsn = 'mysql:host=localhost;dbname=db;charset=utf8'; $username = 'us'; $password = 'ps'; try{ $pdo = new PDO($dsn,$username,$password); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ exit(''.$e->getMessage()); } return $pdo; } ?> ◆◆◆Unityが読み取るコード(ファイル名:loginsys.php)◆◆◆ <?php //MySQLに登録されてあるデータからユーザー情報を呼び出し、そのユーザー情報が一致したらログインできます。 require_once('mysql_connect.php'); $pdo = connectDB(); //Unity側からデータを受け取る $ID = ( int ) $_POST['ID']; $password = $_POST['password']; try{ $name = (string) $pdo->query ("SELECT name FROM Login WHERE ID='".$ID."' AND password='".$passwor d."'"); if(empty($name)){ print_r("データが間違っています"); }else{ print_r($name); } }catch(PDOException $e){ var_dump($e->getMessage()); } $pdo = null; ◆◆◆Unity側のログインボタンに埋め込んであるコード(ファイル名:Catch.cs)◆◆◆ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Catch : MonoBehaviour { public Text ResultText_; //結果を格納するテキスト public string str; public Text InputText_; //idを入力するインプットフィールド public Text InputText3_; public string ServerAddress = "192.168.2.111/dir/loginsys.php"; //SendSignalボタンを押した時に実行されるメソッド public void SendSignal_Button_Push() { StartCoroutine("Access"); //Accessコルーチンの開始 } private IEnumerator Access() { Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("ID", InputText_.GetComponent<Text>().text); //インプットフィールドからidの取得); dic.Add("password", InputText3_.GetComponent<Text>().text); //複数phpに送信したいデータがある場合は今回の場合dic.Add("hoge", value)のように足していけばよい StartCoroutine(Post(ServerAddress, dic)); // POST yield return 0; } private IEnumerator Post(string url, Dictionary<string, string> post) { WWWForm form = new WWWForm(); foreach (KeyValuePair<string, string> post_arg in post) { form.AddField(post_arg.Key, post_arg.Value); } WWW www = new WWW(url, form); yield return StartCoroutine(CheckTimeOut(www, 3f)); //TimeOutSecond = 3s; if (www.error != null) { Debug.Log("HttpPost NG: " + www.error); //そもそも接続ができていないとき ResultText_.GetComponent<Text>().text = "not setuzoku"; } else if (www.isDone) { //送られてきたデータをテキストに反映 ResultText_.GetComponent<Text>().text = www.text; Debug.Log(www.text); str = www.text; if (str == "") { Application.LoadLevel("3"); } } } private IEnumerator CheckTimeOut(WWW www, float timeout) { float requestTime = Time.time; while (!www.isDone) { if (Time.time - requestTime < timeout) yield return null; else { Debug.Log("TimeOut"); //タイムアウト //タイムアウト処理 // // break; } } yield return null; } } ?>
###プログラムコード説明
Unityに用意してあるインプットフィールド1にIDを打ち込み、
インプットフィールド3にpasswordを打ち込みます。(インプットフィールド2は、諸事情により存在しません)
打ち込んだIDとpasswordをloginsys.phpに送り、loginsys.php内でPDOを呼び出し、送られてきた値をMySQLでSELECTする値に用いる。MySQLから帰ってきた値を$nameに格納し、それをunityに送信する
###MySQLに格納されている値
No(INT型)が「1」、ID(INT型)が「123」、password(text型)が「abc」、name(text型)が「花子」です。
###補足情報(言語/FW/ツール等のバージョンなど)
mysqlとapacheのログを見てみたところ、どちらにも接続できているのは確認できたので、僕自身は、phpがうまくデータをUnity側に返せていないか、Unityがphpから送られてきたデータをうまく受け取れていないかのどちらかだと思います。
バージョンはそれぞれ、
・Unity5.6.3f1
・apache2
・php5.6
・MySQL5.2

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。