お使いのブラウザは、バージョンが古すぎます。

このサイトは、Internet Explore8・Internet Explore9には対応しておりません。
恐れ入りますが、お使いのブラウザをバージョンアップしていただきますよう宜しくお願いいたします。

Android とPHP でPOST通信を行う

どーもー。ブンブン丸です。
今回はAndroid Tipsです。
とあるアプリでAndroidから文字列をサーバーのPHPに送って、データベースから情報を取得してその結果をAndroidに返す、と言ったことをする必要がありました。

ざっくりとした仕様は、以下の通りです。
・AndroidとPHPとはPOSTを使った送信
・Android端末は2.2以降を想定

Android OS 3.0以降は注意

さてAndroidとPHPとの通信ですが、OS 2.xまでは良いのですが、3.0以降だと非同期通信を行う必要があります。
さもなくばもれなく例外が発生します。はい。

・レイアウトはこんな感じで用意しました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/submit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="submit" />

</LinearLayout>

・メインのクラスはこんな感じです。

public class Main extends Activity implements OnClickListener
{
	MyAsyncTask task;
	 EditText editText ;
	String text="";
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

          editText =(EditText)findViewById(R.id.editText);
         Button submit = (Button)findViewById(R.id.submit);

         SpannableStringBuilder sb = (SpannableStringBuilder)editText.getText();

         text=sb.toString();
         submit.setOnClickListener(this);
    }
	@Override
	public void onClick(View v) {
		// TODO 自動生成されたメソッド・スタブ
		if(v.getId() == R.id.submit){
			 SpannableStringBuilder sb = (SpannableStringBuilder)editText.getText();

	         text=sb.toString();
			
			task= new MyAsyncTask(this);
			task.execute(text);
		}

	}
}

・非同期通信クラスはこんな感じで

public class MyAsyncTask extends AsyncTask<String, Integer, Integer> implements OnCancelListener{
	final String TAG = "MyAsyncTask";

	  private Activity m_Activity;

	    private static final String url = "http://nvtrlab.jp/test.php";

        //クライアント設定
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);

        List<NameValuePair> nameValuePair;
        HttpResponse response;
        ByteArrayOutputStream byteArrayOutputStream;
        HttpResponse res = null;

        public MyAsyncTask(Activity activity) {
        this.m_Activity = activity;
        }


	 @Override
	  protected void onPreExecute() {
	    Log.d(TAG, "onPreExecute");
	  }

	  @Override
	  protected Integer doInBackground(String... contents) {
	    Log.d(TAG, "doInBackground - " + contents[0]);
	    HttpClient httpClient = new DefaultHttpClient();
            HttpPost post = new HttpPost(url);

            ArrayList <NameValuePair> params = new ArrayList <NameValuePair>();
            params.add( new BasicNameValuePair("moji", contents[0]));

        try {
            post.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
            res = httpClient.execute(post);

            byteArrayOutputStream = new ByteArrayOutputStream();
            res.getEntity().writeTo(byteArrayOutputStream);

        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

	    return Integer.valueOf(res.getStatusLine().getStatusCode());

	  }

	  @Override
	  protected void onProgressUpdate(Integer... values) {
	    Log.d(TAG, "onProgressUpdate - " + values[0]);

	  }

	  @Override
	  protected void onCancelled() {
	    Log.d(TAG, "onCancelled");

	  }

	  @Override
	  protected void onPostExecute(Integer result) {
	    Log.d(TAG, "onPostExecute - " + result);


	    //サーバーからの応答を取得
        if(res.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
        {
//デバッグ用にリザルトコードをTextViewに表示させておく
            TextView tv = (TextView) this.m_Activity.findViewById(R.id.textView1);
            tv.setText(""+result);

           tv.setText(result+"\n"+byteArrayOutputStream.toString());

//サーバーから受けとった文字列の処理
           if(byteArrayOutputStream.toString().equals("1")){
        	   Toast.makeText(this.m_Activity, "[ここには処理1] ", Toast.LENGTH_LONG).show();
           }else{
        	   Toast.makeText(this.m_Activity, "[ここには処理2] ", Toast.LENGTH_LONG).show();
           }
        }
        else
        {
            Toast.makeText(this.m_Activity, "[error]: "+response.getStatusLine(), Toast.LENGTH_LONG).show();
        }
	  }

	  @Override
	  public void onCancel(DialogInterface dialog) {
	    Log.d(TAG, "Dialog onCancell... calling cancel(true)");
	    this.cancel(true);
	  }
	}

・PHPはこんな感じにしましたが 今時ならDSNを使った方が良いですね

<?php
//$dsn="mysql:dbname= database;host=127.0.0.1";
  $url = "127.0.0.1";
  $user = "user";
  $pass = "password";
  $db = "database";
  $table = "data";
  if(!isset($_POST[moji])){$_POST[moji]="";}
  $ moji = htmlspecialchars($_POST["moji"]);

  // MySQLへ接続する
  $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。");

  // データベースを選択する
  $sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。");

  // クエリを送信する
  $sql = "SELECT * FROM $table where text LIKE BINARY '".$moji."'";
  $result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql);

  //結果セットの行数を取得する(PHP 5.5.0 では非推奨です)
  $rows = mysql_num_rows($result);
//一致行数を返す
    echo $rows;
?>

おしまい。

2 Comments

    • ブンブン丸
      ブンブン丸

      lansさん
      こんにちは。
      コメントありがとうございます。
      起動できない・・・
      具体的にコメント頂けるとお役にたてるお返事が出来るかも知れません。

      Reply

コメントをどうぞ

メールアドレスは公開されません。* が付いている欄は必須項目です。


お気軽にお問い合わせください。

日本VTR実験室では、お仕事のご依頼、ブログ・コラムのご感想などを受け付けております。
アプリ開発・コンテンツ制作でお困りでしたら、お気軽にご相談ください。
ご連絡お待ちしております。

お問い合わせはこちらから

03-3541-1230

info@nvtrlab.jp

電話受付対応時間:平日AM9:30〜PM6:00