2016年5月16日 星期一

php讀取mysql資料(使用Json)

太久沒更新了文章了~~
今天寫的這篇文章主要是提供另一種讀取Mysql資料的方法。
3月份時有寫一篇php抓資料庫的作法,但在那之後我找到另一種比較簡單的方法,方法請各位看下方搂~~

1.首先先寫一個PHP
<?
$host='120.105.132.39'; //你資料庫的位置
$name='root'; //帳號
$pwd='ab19696a';//密碼
$db='database'; //資料庫名稱
$con=mysql_connect($host,$name,$pwd) or die("connection failed");
mysql_select_db($db,$con) or die("db selection failed");


$result=mysql_query("SELECT * FROM user",$con);//user=資料表
while($row=mysql_fetch_assoc($result)){
$tmp[]=$row;
}
echo json_encode(array("data"=>$tmp));//放到json裡面,名稱是data
mysql_close($con);

?>

2.再來從android studio抓php的資料

首先 在 activity裡 設一個字串用來存放php網路位置(如下圖)
String showUri = "http://120.105.132.39/app_link/loadingdata.php";
並加上這段
com.android.volley.RequestQueue requestQueue;
並在onCreate裡放上這段
requestQueue = Volley.newRequestQueue(getApplicationContext());

接下來就是重點了,你要如何抓到php的資料。

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.POST,showUri, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println(response.toString());
try {
JSONArray data = response.getJSONArray("data");
//這邊要和上面json的名稱一樣
//下邊是把全部資料都印出來
for (int i = 0; i < data.length(); i++) {
JSONObject jasondata = data.getJSONObject(i);
String account = jasondata.getString("name");
String pwd = jasondata.getString("works");
txt.append(account + " " + pwd + " " + " \n");
//txt是textview
}
txt.append("===\n");//把資料放到textview顯示出來
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.append(error.getMessage());
}
});
requestQueue.add(jsonObjectRequest);

大致上就是這個樣子,圖我就沒有拍了。
有任何意見或是問題歡迎提出來一起討論。
如果有哪個地方寫錯或是我理解錯誤,還請各位糾正我。
最近有些忙,沒時間新增其他文章,還請各位見諒!!

4/6新增
如上面做完還有紅線,請在build.gradle裡面的dependencies {}中
加上
compile 'com.mcxiaoke.volley:library:1.0.19'
如下圖

2016年5月13日 星期五

android studio 使用servlet 網頁無法顯示中文 解決方法

最近在用android studio 開發 app engine 沒想到在處理顯示中文這部分花了很久的時間,以下是解決辦法。
1.先打開google cloud module的build.gradle。
2.在裡面加上(這段很重要,沒加這段後面無法顯示!!)
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"}
3.在doGet裡面加上(resp=response)
  *這段要放在輸出上面
resp.setContentType("text/html;charset=UTF-8");

doPost也是一樣加上
resp.setContentType("text/html;charset=UTF-8");
一樣放在輸出上面。

如果有說錯的地方或者有任何問題歡迎指教。

2016年3月2日 星期三

android 由PHP抓mysql資料 (使用HttpURLconnection)

這篇是從android透過php連結到mysql,並抓出mysql的資料
注意:請先在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
這用來開啟連網功能


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="抓資料"
android:id="@+id/btn1"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TableLayout
android:id="@+id/user_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_below="@+id/btn1" />
</RelativeLayout>

////////////////////////////////////////////////////////////////////////////////////

abc.php

<?
$host='資料庫位置';//ex:120.105.132.80
$name='帳號';
$pwd='密碼';
$db='資料庫名稱';
$con=mysql_connect($host,$name,$pwd) or die("connection failed");
mysql_select_db($db,$con) or die("db selection failed");

$result=mysql_query("SELECT * FROM user",$con);//user資料表名稱
while($row=mysql_fetch_assoc($result)){
$tmp[]=$row;
}
echo json_encode($tmp);
mysql_close($con);
?>

////////////////////////////////////////////////////////////////////

DBConnector.java

package com.example.user.mysql_test;
import android.util.Log;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class DBConnector {
public static String executeQuery(String query_string) {
     String result = "";
     HttpURLConnection urlConnection=null;
     InputStream is =null;
     try {
             URL url=new URL("http://120.105.132.39/app_link/abc.php");                       //php的位置
             urlConnection=(HttpURLConnection) url.openConnection();//對資                料庫打開連結
             urlConnection.setRequestMethod("POST");
             urlConnection.connect();//接通資料庫
             is=urlConnection.getInputStream();//從database 開啟 stream

             BufferedReader bufReader = new BufferedReader(new                                    InputStreamReader(is, "utf-8"), 8);
             StringBuilder builder = new StringBuilder();
             String line = null;
             while((line = bufReader.readLine()) != null) {
              builder.append(line + "\n");
            }
              is.close();
              result = builder.toString();
            } catch(Exception e) {
            Log.e("log_tag", e.toString());
            }

            return result;
           }
}
////////////////////////////////////////////////////////////////////////////////////////////////////

MainActivity.java

package com.example.user.mysql_test;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
   @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViews();
    setListeners();
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork()
    .penaltyLog()
    .build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectLeakedSqlLiteObjects()
    .penaltyLog()
    .penaltyDeath()
    .build());
     }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
     int id = item.getItemId();
//noinspection SimplifiableIfStatement
     if (id == R.id.action_settings) {
     return true;
     }
     return super.onOptionsItemSelected(item);
}
     private Button button_get_record;
     private void findViews() {
     button_get_record = (Button)findViewById(R.id.btn1);
     }
     private void setListeners() {
     button_get_record.setOnClickListener(getDBRecord);
     }
     private Button.OnClickListener getDBRecord = new                           

     Button.OnClickListener() {
     public void onClick(View v) {
// TODO Auto-generated method stub
    TableLayout user_list = (TableLayout)findViewById(R.id.list);
     user_list.setStretchAllColumns(true);

     TableLayout.LayoutParams row_layout = new                   

     TableLayout.LayoutParams(ViewGroup.LayoutParams.

     WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

     TableRow.LayoutParams view_layout = new                                  

    TableRow.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,      ViewGroup.LayoutParams.WRAP_CONTENT);

      try {
      String result = DBConnector.executeQuery("SELECT * FROM user");
/*
SQL 結果有多筆資料時使用JSONArray
只有一筆資料時直接建立JSONObject物件
     JSONObject jsonData = new JSONObject(result);
*/
     JSONArray jsonArray = new JSONArray(result);
     for(int i = 0; i < jsonArray.length(); i++) {
     JSONObject jsonData = jsonArray.getJSONObject(i);
     TableRow tr = new TableRow(MainActivity.this);
     tr.setLayoutParams(row_layout);
     tr.setGravity(Gravity.CENTER_HORIZONTAL);

     TextView user_acc = new TextView(MainActivity.this);
     user_acc.setText(jsonData.getString("account"));//資料欄位名稱
     user_acc.setLayoutParams(view_layout);
     TextView user_pwd = new TextView(MainActivity.this);
     user_pwd.setText(jsonData.getString("pwd"));
     user_pwd.setLayoutParams(view_layout);
     tr.addView(user_acc);
     tr.addView(user_pwd);
     user_list.addView(tr);
    }
    } catch(Exception e) {

    Log.e("log_tag", e.toString());
    }
  }
};
}

資料庫裡的資料


模擬器執行結果

以上的是使用HttpURLconnection來連結PHP並非使用HttpClient
原因:API23已停止支援HttpClient
詳情

以上是小弟第一次練習 請多指教
參考網址:http://developer.android.com/intl/zh-tw/reference/android/os/StrictMode.html#setThreadPolicy(android.os.StrictMode.ThreadPolicy)

http://seanstar5317.pixnet.net/blog/post/28092031-%5Bandroid%5D%E5%BE%9Emysql-%E6%8A%93%E8%B3%87%E6%96%99%EF%BC%8C%E5%8B%95%E6%85%8B%E6%96%B0%E5%A2%9Etextview%E8%87%B3tablela

https://www.youtube.com/watch?v=eV1_bj89FZA
.......


php讀取mysql資料(使用Json)

太久沒更新了文章了~~ 今天寫的這篇文章主要是提供另一種讀取Mysql資料的方法。 3月份時有寫一篇php抓資料庫的作法,但在那之後我找到另一種比較簡單的方法,方法請各位看下方搂~~ 1.首先先寫一個PHP <? $host='120.105.132.3...