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 = "https://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; ?>
おしまい。
試してみたのですが起動できませんよ
lansさん
こんにちは。
コメントありがとうございます。
起動できない・・・
具体的にコメント頂けるとお役にたてるお返事が出来るかも知れません。