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

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

ただいまの
回答率

90.47%

  • PHP

    24528questions

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

  • Java

    16163questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7406questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4361questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • JSON

    1487questions

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

Androidとphpの連携について

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,332

d_suke

score 1

前提・実現したいこと

ログイン機能作成のためphpとAndroidの連携をしようとしており、idとpassのデータをphpに送り、ログイン結果を返そうとしているのですが、結果が帰ってこないようで困っています。開発はAndroidStudioでしています。

phpはunityの今回のプログラムとは別のものではPC上でもAndroid上でも正常に動作しました。

ソースコード

Title.java

public class Title extends Activity {

    public static TextView err;

    SpannableStringBuilder id,pass;

    public static String result = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_title);

        ImageView imageView2 = (ImageView) findViewById(R.id.imageView);
        imageView2.setImageResource(R.drawable.title);


        // ボタンを設定
        Button button = (Button) findViewById(R.id.login);

        // TextView の設定
        err = (TextView) findViewById(R.id.err);

        // リスナーをボタンに登録
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText edit = (EditText) findViewById(R.id.user_id);
                id = (SpannableStringBuilder) edit.getText();

                EditText edit2 = (EditText) findViewById(R.id.pass);
                pass = (SpannableStringBuilder) edit2.getText();

                String id2 = id.toString();
                String pass2 = pass.toString();

                asynctask_job(id2,pass2,"example.com");
            }
        });
    }
    // 非同期処理を開始する
    private void asynctask_job(String id, String pass, String base_url){
        final MyAsync Asynctask = new MyAsync(this);
        //実行
       Asynctask.execute(id,pass, base_url);

        if(result != null && result.equals("[]")){
            String tmp = "ID,パスワードが違います。";

            // TextView の設定
            err = (TextView) findViewById(R.id.err);
            err.setText(tmp);
        }

    }
}

MyAsync.java

public class MyAsync extends AsyncTask<String,String,String>  {

    private Title _main;

    public MyAsync(Title main) {
        super();
        _main = main;
    }


    @Override
    protected String doInBackground(String...value) {

        android.os.Debug.waitForDebugger();

        String  id = value[0];
        String  pass = value[1];
        String  base_url = value[2];

        BufferedReader reader = null;
        OutputStream os = null;
        HttpURLConnection urlCon = null;

        try {

            URL url = new URL(base_url);

            urlCon = (HttpURLConnection) url.openConnection();
            urlCon.setReadTimeout(10000);
            urlCon.setConnectTimeout(20000);
            urlCon.setRequestMethod("POST");
            urlCon.setDoInput(true);
            urlCon.setDoOutput(true);
            urlCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            urlCon.setUseCaches(false);

            urlCon.connect();

            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", id);
            jsonObject.put("pass", pass);

            // データを送信する
            os = urlCon.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            writer.write(String.valueOf(jsonObject));
            writer.flush();
            writer.close();
            os.close();

            int status = urlCon.getResponseCode();

            switch (status) {
                case HttpURLConnection.HTTP_OK:
                    InputStream is = urlCon.getInputStream();
                    reader = new BufferedReader(new InputStreamReader(is));

                    String httpSource = new String();
                    String str;
                    while (null != (str = reader.readLine())) {
                        httpSource = httpSource + str;
                    }

                    is.close();
                    break;
                case HttpURLConnection.HTTP_UNAUTHORIZED:
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
                if (os != null) {
                    os.close();
                }
                if (urlCon != null) {
                    urlCon.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try {
            BufferedInputStream inputStream = null;
            inputStream = new BufferedInputStream(urlCon.getInputStream());
            ByteArrayOutputStream responseArray = new ByteArrayOutputStream();
            byte[] buff = new byte[1024];

            int length;
            while((length = inputStream.read(buff)) != -1) {
                if(length > 0) {
                    responseArray.write(buff, 0, length);
                }
            }

            // JSONをパース
            StringBuilder viewStrBuilder = new StringBuilder();
            JSONObject jsonObj = new JSONObject(new String(responseArray.toByteArray()));
            JSONArray result = jsonObj.getJSONArray("result");
            for(int i = 0; i < result.length(); i++) {
                JSONObject tweet = result.getJSONObject(i);
                viewStrBuilder.append(tweet.getString("id"));        // result
            }

            Title.result = viewStrBuilder.toString();

        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

login.php

<?php
header('Content-type:application/json;charset=UTF-8');
define('DB_USERNAME', '???');
define('DB_PASSWORD', '???');
define('DB_DATABASE', '???');
define('PDO_DSN', 'mysql:host=???;dbname='.DB_DATABASE.';charset=utf8');
error_reporting(0);

$user_id =$_POST["id"];
$pass = $_POST["pass"];


try{
    $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    $sql = "select user_id from users where user_id = :user_id and user_pass = :pass";
    $stmt = $db->prepare($sql);
    $stmt->bindParam(":pass",$pass);
    $stmt->bindParam(":user_id",$user_id);
    $stmt->execute();

        $result= array();

    while($row = $stmt->fetch()){
        $result[] = array(
            'id'=>$row["user_id"]
        );        
    }
    echo json_encode($result);

    $db = null;
}catch(PDOException $e){
    exit;
}
?>

補足情報(言語/FW/ツール等のバージョンなど)

AndroidStudio2.2
Nexus5(Android 6.0 Marshmallow)
windows10

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • d_suke

    2016/10/10 17:35

    PC上、Android上どちらでも動作しました。Unityのプロジェクトとは別の新しいプロジェクトでphpのみ使い回そうとしたら、なかなかうまく行きませんでした。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/10/10 17:41

    shi_ue すでに投稿した以上、履歴に残るから消しても無駄ぽ・・・

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/10/10 17:47

    常に login php は 200OK が返る設計に見えますが login.php 側でエラーが出てる可能性が高いですね。

    キャンセル

回答 2

0

エラーメッセージを読みましょう。Title.javaの61行目でエラーが発生しています。

エラーの発生理由を特定する十分なデバッグを行なっていないと思います。
ログ出力を使ってどこまで処理が進んでいるかを確認したり、通信のレスポンスコード等を出力してからエラーに対処しましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/09 23:06

    すみません。こちらの質問ミスです。
    エラーは一切出てきません。
    ログ出力なども試しては見ましたが、もう一度試します。

    キャンセル

  • 2016/10/09 23:36

    エラーログを貼っていてエラーは一切出ていないとはなんでしょうか?

    また、コードはコード用の記述に修正してください。

    キャンセル

0

PHP単体で動作しているんでしょうか?
PHPと同じ場所に以下のHTMLを作って、そこからPOSTした結果はちゃんと返って来ますか?

<form method="post" action="login.php">
  <input type="text" name="id"><br>
  <input type="text" name="pass"><br>
  <button type="submit">submit</button>
</form>

返って来ているとしたら、Android側ですし、返って来ていないのでしたらPHP側です。
まずは不具合の発生場所を切り分けましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • PHP

    24528questions

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

  • Java

    16163questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7406questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4361questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • JSON

    1487questions

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