2016-08-26 13 views
2

私はPostgreSQLデータベースとの通信(アップとダウンロード)を含むAndroidアプリケーションに取り組んでいます。 PHPスクリプトを使用してデータベースからデータを取得したい。PostgreSQLからPHP経由でAndroidにデータを送信するには?

テーブル名は "table"で、カラムは "id"、 "username"、 "title"です。非常に単純なケース(表中の1個のエントリ)で

、これは私の作品:

$statement = $pdo->prepare("SELECT * FROM table"); 
$result = $statement->execute(); 
$fetched= $statement->fetch(); 

$echo = array(); 

array_push($echo,array(
    "id"=>$fetched['id'], 
    "username"=>$fetched['username'], 
    "title"=>$fetched['title'] 
)); 

echo json_encode(array("result"=>$echo); 
アンドロイドで

データ受信が

JSONObject ob = new JSONObject(response); 

で動作し、私はデータを読み取ることができますJSONオブジェクトとして扱います。

しかし、テーブルから複数のエントリを取得する必要がある場合もあります。私は多くのチュートリアルを読みましたが、それらのすべてにはさまざまなアプローチがあります。私は以下を試した:

$statement = $pdo->prepare("SELECT * FROM table"); 
$result = $statement->execute(); 
$fetched= $statement->fetch(); 

$echo = array(); 

while ($row = $fetched) { 
    $row_array['id'] = $row['id']; 
    $row_array['username'] = $row['username']; 
    $row_array['title'] = $row['title']; 

array_push($echo, $row_array); 
} 

echo json_encode(array("result"=>$echo); 

しかし、この方法は常にnullを返します。正直言って、$行の役割がどういうものなのか正確にはわかりません。

問題の原因は何ですか?

ありがとうございました!

編集:nullの結果が出ると、初めてAndroidスタジオの入力ストリームから戻り値にアクセスしようとすると、NullPointerExceptionが発生します。 エラーは次のようになります。

08-26 17:17:16.605 5278-5278 E/AndroidRuntime: FATAL EXCEPTION: main 
              java.lang.NullPointerException 
               at com.example.sainz.example.RandomActivity$1LoginAsync.onPostExecute(RandomActivity.java:101) 
               at com.example.sainz.example.RandomActivity$1LoginAsync.onPostExecute(RandomActivity.java:40) 
               at android.os.AsyncTask.finish(AsyncTask.java:631) 
               at android.os.AsyncTask.access$600(AsyncTask.java:177) 
               at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
               at android.os.Handler.dispatchMessage(Handler.java:99) 
               at android.os.Looper.loop(Looper.java:137) 
               at android.app.ActivityThread.main(ActivityThread.java:4867) 
               at java.lang.reflect.Method.invokeNative(Native Method) 
               at java.lang.reflect.Method.invoke(Method.java:511) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
               at dalvik.system.NativeStart.main(Native Method) 
+0

RTFM [fetch()](http://php.net/manual/en/pdostatement.fetch.php): 'PDOStatementオブジェクトに関連付けられた結果セットから行を取得します。 '** ROW **のデータ。 1つの単独の行であり、結果セット全体ではありません。 'while($ row = $ result-> fetch())'はすべての行を順番に取得します。 –

+0

ええ、それは本当です、ヒントのおかげで。しかし、それはまだデータの最初の行を返す必要があり、nullではない、そうですか?コードを推奨するものに変更しましたが、戻り値はまだnullです。戻り値は – s4inz

+0

です。あなたのエンコードされた配列は '{" result ":null}'のように見えますか?またはあなたは全くのjsonを得ない? –

答えて

0

あなたのように、代わりに(1が行ごとにフェッチ)ループでそれを呼び出すのでは、一度だけfetch methodを呼び出していることをあなたのコードに問題がある:

$statement = $pdo->prepare("SELECT id, username, title FROM table"); 
$statement->execute(); 

$echo = array(); 

while ($row = $statement->fetch()) { 
    $row_array = array(); 
    $row_array['id'] = $row['id']; 
    $row_array['username'] = $row['username']; 
    $row_array['title'] = $row['title']; 

    array_push($echo, $row_array); 
} 
$statement = null; 

echo json_encode(array("result"=>$echo); 

もう1つの方法は、おそらくPDO::FETCH_CLASSを使用してfetchAll methodを使用し、$echoアレイオブジェクトを一度に実行することです。

+0

ありがとうございました。 $ result-> fetch()は例外を引き起こしますが、$ statement-> fetch()は必要なものを返すことができます。それが私の進歩を助ける答えです。 – s4inz

関連する問題