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

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

ただいまの
回答率

90.76%

  • PHP

    19189questions

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

  • MySQL

    5516questions

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

  • Unity

    3585questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Raspberry Pi

    711questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

UNITYとPHPとMySQLの通信について

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 255

234

score 2

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

Catchable fatal error:  Object of class PDOStatement could not be converted to string in /var/www/html/dir/loginsys.php on line 15<br />

って出力されているとおりPHPプログラムのloginsys.php 15行目でエラーになってます。

まずはブラウザやcurlを利用してPHP側が動くまでをやったほうが良いですよ。
($pdo->queryは PDOStatement を返しますがそれをstring変換することは出来ませんよっていう感じのエラーです)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    MySQLでUPDATEが実行できない

    前提・実現したいこと PHPとMySQLで記事を「投稿」「編集」「削除」するシステムを作っています。   投稿と削除は完成したのですが、UPDATE文で実装しようと思っている編

  • 解決済

    パーティクルシステムの再生位置をスクリプトで制御したい。

    前提・実現したいこと シーン上のパーティクルシステムの再生時間をスクリプトで制御したいと思っています。 シーン上にパーティクルシステムを置いた場合、そのシミュレートとして、

  • 解決済

    パーティクルを一瞬だけ表示させたい。

    前提・実現したいこと キー入力とUpdateとLateUpdateを利用して、パーティクルを一瞬だけ表示したいと考えています。 仕様: Fキーを押した瞬間だけ、指定した再

  • 受付中

    [Unity5.6]スプライトをOnTriggerでフェードイン・フェードアウトしたい

    前提・実現したいこと Unity・C#初心者です。 あるスプライトにプレイヤーが接触したらそのスプライトの透明度が変わるコードを書いています。 下記のようなコードで、OnTri

  • 解決済

    Unityのhttp通信の完了を待って次の処理ができない

    Unityにてhttp通信でテキストファイルを取得して変数に書き込みたいのですが、UnityWebRequestを使ってGETしてみると非同期処理になってしまうようで,ソースの一番

  • 受付中

    Unity PHP MySQL 間でのサーバ通信

    前提・実現したいこと 現在アンドロイドアプリの開発にいそしんでいます。開発の途中で発生した問題についてご回答いただきたく、質問させていただきます。 現在、Unityにてアンドロ

  • 受付中

    UnityのSystemInfo.deviceUniqueIdentifierについて

    UnityのSystemInfo.deviceUniqueIdentifierって中はどうやってidを取得しているのですか? UnityでiOSアプリを作っています。ユーザid

  • 解決済

    Unityのvideoclip切り替え

    Unityで、動画1から動画2へとキーを押したら切り替わるようなコードを書きたいです。Videoplayerで再生する動画をどのようにしたら次の動画へと切り替えられるのでしょうか。

同じタグがついた質問を見る

  • PHP

    19189questions

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

  • MySQL

    5516questions

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

  • Unity

    3585questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Raspberry Pi

    711questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。