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

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

ただいまの
回答率

91.35%

  • PHP

    15214questions

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

  • Java

    10497questions

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

  • Android Studio

    2728questions

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

  • JSON

    779questions

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

  • 配列

    403questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Androidとphpのやりとり

解決済

回答 3

投稿 2017/11/30 10:10 ・編集 2017/12/01 13:17

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

HW_

score 1

前提・実現したいこと

AndroidStudioでサーバーのデータベースと接続してデータを保存するアプリを作っています。
android側のデータをphpを介してサーバーのデータベースに保存します。
一度に多数のデータを送信したいです。

発生している問題・エラーメッセージ

配列に格納されているデータを全て送りたいのですが、for文で回してjsonデータに格納していくと、最後のものしか保存されません。
どのようにすれば一度に配列のデータ全てを送信できますでしょうか。

該当のソースコード

public class PhpSend extends AsyncTask<String, String, String> {
    private MainActivity activity;

    public PhpSend(MainActivity activity) {
        super();
        this.activity = activity;
    }

    @Override
    protected String doInBackground(String... values) {
        final StringBuilder result = new StringBuilder();
        Globals globals =(Globals)syukkaActivity.getApplication();
        URL url = null;
        String urlSt = "http://10.0.2.2/phpbook/QRsystemSendTest.php";
        String readSt = null, str = null;
        HttpURLConnection con = null;
        OutputStream os = null;
        try {
            url = new URL(urlSt);
            con = (HttpURLConnection) url.openConnection();
            con.setReadTimeout(10000);
            con.setConnectTimeout(15000);
            con.setRequestMethod("POST");
            con.setRequestProperty("Accept-Language", "ja");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.connect();

            JSONObject jsonObject = new JSONObject();
            for (int i = 0; i < globals.ArrayNum; i++) {
                jsonObject.put("bango_1", globals.bango_1[i]);
                jsonObject.put("bango_2", globals.bango_2[i]);
                jsonObject.put("h_code", globals.h_code[i]);
                jsonObject.put("h_name", globals.h_name[i]);
                jsonObject.put("nyusu", globals.nyusu[i]);
                jsonObject.put("syomi_date", globals.syomi_date[i]);
            }
            os = con.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            bufferedWriter.write(String.valueOf(jsonObject));
            bufferedWriter.flush();
            bufferedWriter.close();

            os.close();
            int status = con.getResponseCode();

            switch (status) {
                case HttpURLConnection.HTTP_OK:
                    InputStream is = con.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                    String httpSource = new String();
                    String string;
                    while (null != (string = reader.readLine())) {
                        httpSource = httpSource + string;
                    }
                    is.close();
                    break;
                case HttpURLConnection.HTTP_UNAUTHORIZED:
                    break;
                default:
                    break;
            }
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (ProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
        return readSt;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        //

    }

    @Override
    protected void onPostExecute(String result) {
    }
}
<?php
$dsn = 'mysql:host=localhost;dbname=qrsystemtest;charset=utf8mb4';
$username = 'root';
$password = '';

try{
    $pdo = new PDO($dsn,$username,$password);
    $input_str = file_get_contents("php://input");
    $input_json = json_decode($input_str,true);
    $bango_1 = $input_json["bango_1"];
    $bango_2 = $input_json["bango_2"];
    $h_code = $input_json["h_code"];
    $h_name = $input_json["h_name"];
    $nyusu = $input_json["nyusu"];
    $syomi_date = $input_json["syomi_date"];

    // データを取得
    $stmt = $pdo->prepare("INSERT INTO t_kari_send_his (bango_1, bango_2, h_code, h_name, nyusu, syomi_date)
             VALUES(:bango_1, :bango_2, :h_code, :h_name, :nyusu, :syomi_date)");
    $stmt -> bindParam(':bango_1', $bango_1, PDO::PARAM_STR);
    $stmt -> bindParam(':bango_2', $bango_2, PDO::PARAM_STR);
    $stmt -> bindParam(':h_code', $h_code, PDO::PARAM_STR);
    $stmt -> bindParam(':h_name', $h_name, PDO::PARAM_STR);
    $stmt -> bindParam(':nyusu', $nyusu, PDO::PARAM_STR);
    $stmt -> bindParam(':syomi_date', $syomi_date, PDO::PARAM_STR);
    $stmt -> execute();


}catch (PDOException $e) {
    echo mb_convert_encoding($e->getMessage(),'UTF-8','SJIS-win');
}
$pdo = null;
?>

追記

java側のソース(for文周辺のみ)を修正したものを追記します。

JSONObject jsonObject = new JSONObject();
            JSONObject jsonObjectSum = new JSONObject();
            JSONObject[globals.ArrayNum];
            String name;
            for (int i = 0; i < globals.ArrayNum; i++) {
                name = "QR_SOSIN_HIS" + i;
                jsonObject.put("_id", globals.id[i]);
                jsonObject.put("bango_1", globals.bango_1[i]);
                jsonObject.put("bango_2", globals.bango_2[i]);
                jsonObject.put("h_code", globals.h_code[i]);
                jsonObject.put("h_name", globals.h_name[i]);
                jsonObject.put("nyusu", globals.nyusu[i]);
                jsonObject.put("syomi_date", globals.syomi_date[i]);
                jsonObjectSum.put(name, jsonObject);
                Log.d("jsontest", "jsonObjectSumの中身は" + jsonObjectSum);
            }

新たにjsoObjectSumを追加し、そこに動的に作った名前のキーにどんどん追加していくようにしたのですが、キーの名前を動的に変えているのに内容が全て後のものに上書きされてしまいます。(JSONArrayを使ってputしていっても同様)
上書きされずに一個一個保存していきたいのですがどうすれば良いでしょうか?
Logの詳細(jsonObjectSumの中身)は以下の通りです。

D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":1,"bango_1":"a","bango_2":"a","h_code":"a","h_name":"a","nyusu":"a","syomi_date":"a"}}
D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":2,"bango_1":"ab","bango_2":"ab","h_code":"ab","h_name":"ab","nyusu":"ab","syomi_date":"ab"},"QR_SOSIN_HIS1":{"_id":2,"bango_1":"ab","bango_2":"ab","h_code":"ab","h_name":"ab","nyusu":"ab","syomi_date":"ab"}}

実現したいのは下記のようにidが1のものが一つ目に格納され、二つ目にidが2のものが追加されてほしい

D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":1,"bango_1":"a","bango_2":"a","h_code":"a","h_name":"a","nyusu":"a","syomi_date":"a"}}
D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":1,"bango_1":"a","bango_2":"a","h_code":"a","h_name":"a","nyusu":"a","syomi_date":"a"},"QR_SOSIN_HIS1":{"_id":2,"bango_1":"ab","bango_2":"ab","h_code":"ab","h_name":"ab","nyusu":"ab","syomi_date":"ab"}}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • aja

    2017/11/30 11:13

    onProgressUpdate で途中経過的にやるとどうなるのでしょう?また、private Activity activity;は警告がでませんか?

    キャンセル

  • m6u

    2017/11/30 11:41

    どういうjson構造にしたいのか、例示してもらえますか? putで置く今の形だと、勝手に配列にはなりませんよね。

    キャンセル

回答 3

0

Android開発の専門家じゃないですけど、
この記事、参考になるんじゃないでしょうか。
[Processing] JSONの読み込み書き込み

一定のデータ構造の繰り返しをまとめるときは
JSONArrayを使うようで、
JSONArrayインスタンスでappendメソッドで追加することで配列化されるようです。
一つのレコードをJSONObject化したら送信用JSONArrayにappendすればいいのかなと。

投稿 2017/11/30 11:44

編集 2017/11/30 12:02

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/30 13:16

    回答ありがとうございます!
    読ませていただいて、なるほど!と思ったのですが、appendメソッドを実装しようとしたら
    Cannot resolve method 'append(org.json.JSONObject)’
    と出て、使えません…

    ソースはJSONArrayをインスタンス化した後、for文の最後に
    jsonArray.append(jsonObject)
    と付け足しました。

    キャンセル

  • 2017/11/30 20:35

    JSONObjectにはappendメソッドはないです。あくまでJSONArray.appendです。
    JSONArrayとJSONObjectは変換も可能なようですよ。
    修正したjava側ソースを、質問文に追記してみてはいかがでしょうか。
    (元のソースを消したり直したりすると、質問と回答のやり取りが第三者にわかりにくくなるので。)

    キャンセル

  • 2017/12/01 11:34 編集

    JSONArray.appendでエラーが出ます。
    質問文に追記いたしました。appendが使えなかったので別の方法を取ろうとしたら別の問題が出てしまいました…

    キャンセル

  • 2017/12/01 12:49

    お二方はProcessingとは何かわかっていますか?

    キャンセル

  • 2017/12/01 12:50 編集

    お二方はProcessingとは何かわかっていますか?
    失礼、二重で投稿されました。

    キャンセル

check解決した方法

-1

・JSONObject jsonObject = new JSONObject();をfor文内で行うことで追記部分を解決
・php側も配列に対応できるよう変更

修正したソースを以下に

JSONObject jsonObjectSum = new JSONObject();
            String name;
            for (int i = 0; i < globals.ArrayNum; i++) {
                JSONObject jsonObject = new JSONObject(); //インスタンス化をfor文内で
                name = "QR_SOSIN_HIS" + i; //動的にキーを取得
                jsonObject.put("bango_1", globals.bango_1[i]);
                jsonObject.put("bango_2", globals.bango_2[i]);
                jsonObject.put("h_code", globals.h_code[i]);
                jsonObject.put("h_name", globals.h_name[i]);
                jsonObject.put("nyusu", globals.nyusu[i]);
                jsonObject.put("syomi_date", globals.syomi_date[i]);
                jsonObjectSum.put(name, jsonObject); //まとめてputする
            }

            os = con.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            bufferedWriter.write(String.valueOf(jsonObjectSum));
            bufferedWriter.flush();
            bufferedWriter.close();
try{
    // データベースへの接続を表すPDOインスタンスを生成
    $pdo = new PDO($dsn,$username,$password);
    $input_str = file_get_contents("php://input");
    $input_json = json_decode($input_str,true);
    $json_count = count($input_json);

    $bango_1 = array();
    $bango_2 = array();
    $h_code = array();
    $h_name = array();
    $nyusu = array();
    $syomi_date = array();


    for($i=0;$i<$json_count;$i++){
        $str = "QR_SOSIN_HIS$i";
        $bango_1[] = $input_json["$str"]["bango_1"];
        $bango_2[] = $input_json["$str"]["bango_2"];
        $h_code[] = $input_json["$str"]["h_code"];
        $h_name[] = $input_json["$str"]["h_name"];
        $nyusu[] = $input_json["$str"]["nyusu"];
        $syomi_date[] = $input_json["$str"]["syomi_date"];


        $stmt = $pdo->prepare("INSERT INTO t_kari_send_his (bango_1, bango_2, h_code, h_name, nyusu, syomi_date)
                 VALUES(:bango_1, :bango_2, :h_code, :h_name, :nyusu, :syomi_date)");
        $stmt -> bindParam(':bango_1', $bango_1[$i], PDO::PARAM_STR);
        $stmt -> bindParam(':bango_2', $bango_2[$i], PDO::PARAM_STR);
        $stmt -> bindParam(':h_code', $h_code[$i], PDO::PARAM_STR);
        $stmt -> bindParam(':h_name', $h_name[$i], PDO::PARAM_STR);
        $stmt -> bindParam(':nyusu', $nyusu[$i], PDO::PARAM_STR);
        $stmt -> bindParam(':syomi_date', $syomi_date[$i], PDO::PARAM_STR);
        $stmt -> execute();
    }

投稿 2017/12/01 14:50

編集 2017/12/01 16:19

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

JSONにはオブジェクトとアレイがあり、これらを入れ子にする事が出来ます。
AndroidではJSONObjectとJSONArrayがそれぞれオブジェクトとアレイを表現するクラスとして定義されています。
今回はアレイなのでJSONArrayを使うべきですね。
また、AndroidでのJSONの取り扱い方をまとめているので参考にしてください。

投稿 2017/11/30 15:23

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/01 10:10

    回答ありがとうございます。
    参考に読ませていただいたのですが、今回のような場合JSONArrayを使ってどのように書いたらよいか具体的に教えていただけませんか?

    キャンセル

  • 2017/12/01 12:45

    提示したページ以降の数ページも合わせて参考にしてください。

    また、どのようなJSONを受け入れるかによって組み立て方が変わるので、一通り読んだ方がいいですよ。

    キャンセル

  • 2017/12/01 13:18

    読ませていただいたのですが追記のようになる原因、解決法がわかりません…
    どのように書けば解決できますでしょうか?

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

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

  • PHP

    15214questions

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

  • Java

    10497questions

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

  • Android Studio

    2728questions

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

  • JSON

    779questions

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

  • 配列

    403questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。