layout/main.xml


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

    <Button
        android:id="@+id/get_record"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="抓資料囉!" />


    <TableLayout
        android:id="@+id/user_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

先在本機端建立與資料庫連線的PHP檔
將ResultSet以JSON的格式回傳
www/AndroidConnectDB/android_connect_db.php

<?php
$db = mysql_pconnect("localhost","user","pwd");

mysql_query("SET CHARACTER SET 'UTF8';");
mysql_query('SET NAMES UTF8;');
mysql_query('SET CHARACTER_SET_CLIENT=UTF8;');
mysql_query('SET CHARACTER_SET_RESULTS=UTF8;');
mysql_select_db("database");

$sql = $_POST['query_string'];
$sql = stripslashes($sql);
$res = mysql_query($sql);
while($r = mysql_fetch_assoc($res))
    $output[] = $r;

print(json_encode($output));

mysql_close();

?>

建立一個JAVA類別來呼叫PHP
將JSON以String型態傳給Activity處理


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

public class DBConnector {
    public static String executeQuery(String query_string) {
        String result = "";
        
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("http://10.0.2.2/AndroidConnectDB/android_connect_db.php");
            ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("query_string", query_string));
            httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            //view_account.setText(httpResponse.getStatusLine().toString());
            HttpEntity httpEntity = httpResponse.getEntity();
            InputStream inputStream = httpEntity.getContent();
            
            BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8);
            StringBuilder builder = new StringBuilder();
            String line = null;
            while((line = bufReader.readLine()) != null) {
                builder.append(line + "\n");
            }
            inputStream.close();
            result = builder.toString();
        } catch(Exception e) {
            // Log.e("log_tag", e.toString());
        }
        
        return result;
    }
}

在Activity端,將JSON字串轉成JSON陣列
以迴圈建立TableRow物件,加到Layout中

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;


public class TestAndroidDBActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findViews();
        setListeners();
        
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
        .detectDiskReads()  
        .detectDiskWrites()  
        .detectNetwork()  
        .penaltyLog()  
        .build());  
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
        .detectLeakedSqlLiteObjects()   
        .penaltyLog()  
        .penaltyDeath()  
        .build());  
    }
    
    private Button button_get_record;
    
    private void findViews() {
        button_get_record = (Button)findViewById(R.id.get_record);
    }
    
    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.user_list);
            user_list.setStretchAllColumns(true);
            TableLayout.LayoutParams row_layout = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            TableRow.LayoutParams view_layout = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, 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(TestAndroidDBActivity.this);
                    tr.setLayoutParams(row_layout);
                    tr.setGravity(Gravity.CENTER_HORIZONTAL);
                    
                    TextView user_acc = new TextView(TestAndroidDBActivity.this);
                    user_acc.setText(jsonData.getString("account"));
                    user_acc.setLayoutParams(view_layout);
                    
                    TextView user_pwd = new TextView(TestAndroidDBActivity.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());
            }
        }
    };
}


資料表內的資料
資料表

Activity執行前
執行前

Activity執行後
執行後

文章標籤
創作者介紹

歡笑的背後是看不見的悲傷

seanstar5317 發表在 痞客邦 PIXNET 留言(215) 人氣()


留言列表 (215)

發表留言
  • mmblack0621
  • 感謝sea​​nstar5317大大熱情分享

    小弟最近剛接觸連線這個部份

    這篇文章讓我獲益良多

    希望有機會能一起討論討論
  • 主要是為了做筆記啦XD

    我也還算是初學者喔~
    請多多指教!

    seanstar5317 於 2012/09/21 13:18 回覆

  • 訪客
  • 請問站長大大~
    我練習了您寫的範例不過出現了以下錯誤訊息
    "error opening trace file: No such file or directory (2)"
    似乎讀不到資料庫的部分~看了很多資料還是不知道錯誤再哪邊
    請問我是忘記改什麼變數嘛 ?! 還是版本有問題?
  • 抱歉喔~最近比較少上來看部落格

    請問錯誤是發生在哪個類別裡呢?
    範例裡的PHP檔名為"android_connect_db.php"
    麻煩您檢查一下囉~

    seanstar5317 於 2012/09/21 13:20 回覆

  • 訪客
  • String cannot be converted to JSONArray
    我的LOGCAT抓到這個錯誤訊息欸 :(
  • 訪客
  • E/log_tag(329): org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONArray
  • 試試看先把PHP要回傳的陣列print_r出來看看
    裡面的值看起來怪怪的~~

    seanstar5317 於 2012/10/02 23:00 回覆

  • 黃明吉
  • 請問一下,我用網頁開php他會出現這行錯誤
    wWarning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\aaa.php on line 12
    這樣要怎麼解決??
    上網查了之後是說抓不到值??
    不太知道問題在哪
  • 利用mysql_error()把詳細錯誤訊息叫出來看看
    記得寫的滿清楚的

    seanstar5317 於 2012/10/04 09:46 回覆

  • j999444
  • [{"id":"1","account":"qwe","pwd":"qweqwe"},{"id":"2","account":"eee","pwd":"ewe"},{"id":"3","account":"rdfd","pwd":"we1"}]

    print_r值出來是這個呀 (我自己丟進資料庫的資料)
    @_@
  • 那在建立JSONArray之前先把傳回來的result用Log顯示出來吧~~
    傳遞字串有時候會莫名其妙加了一些東西XD"

    seanstar5317 於 2012/10/04 09:49 回覆

  • 路人
  • 請問大大,print的值出來是null
    是不是沒跟資料庫連結上呢??
    不過我程式碼幾乎都沒錯~
    用mysql_error也沒說錯哪~
    一整個卡住啊~求救
  • 在TestAndroidDBActivity這個類別中
    String result = DBConnector.executeQuery("SELECT * FROM user");
    查詢語法是放在這一行

    可能是沒連到資料庫
    或者欄位/表單名稱不對吧

    seanstar5317 於 2012/10/04 14:37 回覆

  • 路人
  • 摁摁

    我資料庫名稱用database
    資料表user
    欄位id,account,pwd
    內容數值都跟你的結果圖一樣

    不過點下查詢還是什麼都沒跑出來
  • Log 有沒有錯誤訊息呢@@?

    seanstar5317 於 2012/10/04 15:17 回覆

  • 路人
  • 你是說catch(Exception e) {
    //Log.e("log_tag", e.toString());
    這個嗎?

    好像都沒甚麼錯誤訊息
  • 因為註解掉了 XD?

    seanstar5317 於 2012/10/04 15:26 回覆

  • 路人
  • 好像~哈哈
    還有一行也是註解那行是啥
    //view_account.setText(httpResponse.getStatusLine().toString());


    不過log那行解掉註解後還是沒顯示啥
    QAQ
    難得找到用json可以成功連android跟php的
    結果卻跑不出來
  • 這行應該是在測試忘記拿掉的....

    你的network_permission有打開嗎??

    seanstar5317 於 2012/10/04 15:40 回覆

  • 路人
  • 這個嗎?
    <uses-permission android:name="android.permission.INTERNET"/>
  • 看來有開XD"

    那分別在PHP、兩個Class內把結果顯示出來
    看在哪邊出錯了~

    seanstar5317 於 2012/10/04 15:59 回覆

  • 發瘋的路人
  • $sql = $_POST['query_string'];
    想問這行~
    因為我改成(select ... from ...);
    php頁面可以跑出json形式的資料庫資料~
    但是在android上還是看不到~
    無力~~~~~~~~~~~~~~~~~~~~~XDD
  • 恩....
    回傳值在DBConnector就不見了嗎?

    seanstar5317 於 2012/10/04 20:38 回覆

  • 路人
  • 應該可能吧
    ~又試了好幾天還是找不出問題
  • 在每個類別都把回傳值印出來看看阿~~

    seanstar5317 於 2012/10/09 16:54 回覆

  • 小萱萱
  • 為什麼我只要("SELECT * FROM user");的user改成我的資料表就無法顯示了
    兩個資料內容是一模一樣,資料表名稱不同而已
  • 你的資料表名稱會不會用到保留字呢?
    也可以試試 echo mysql_error();
    看有什麼錯誤

    seanstar5317 於 2012/10/10 14:55 回覆

  • Jia-wei Tang
  • 大大好@@
    我想請問發生這個錯誤??
    error opening trace file: No such file or directory
    我php弄我的檔案
    http://localhost/android_get/json2.php
    結果出現這個ERROR
  • 如果是在手機端連到電腦本機的網頁
    URL要用10.0.2.2喔~

    seanstar5317 於 2012/10/11 22:08 回覆

  • Jia-wei Tang
  • 這個嗎?
    <uses-permission android:name="android.permission.INTERNET"/> 看來有開XD"

    那分別在PHP、兩個Class內把結果顯示出來
    看在哪邊出錯了~
    大大說的兩個class 是說DBConnector與TestAndroidDBActivity嗎??
  • 對阿~
    在回傳JSON字串的過程中都把結果顯示出來看看

    seanstar5317 於 2012/10/11 22:09 回覆

  • Jia-wei Tang
  • 大大@@
    我用android給的模擬器去跑的
    他在跑那個時出現error opening trace file: No such file or directory
    還有大大說的URL要用10.0.2.2喔??的意思我不太懂
  • 因為是用手機執行程式
    localhost在這邊是指手機本機 而不是電腦喔
    要連到電腦本機的資料庫要用10.0.2.2才可以

    seanstar5317 於 2012/10/16 13:09 回覆

  • 悄悄話
  • 悄悄話
  • 訪客
  • print(json_encode($output));

    這行的用意是什麼?
    註解掉有關係嗎?
  • 這一行是要把查詢結果的陣列轉換成JSON格式的字串輸出到呼叫端處理
    如果要用JSON處理的話一定要有喔~

    seanstar5317 於 2012/10/20 11:35 回覆

  • 訪客
  • 問一下 sql的 id account pwd 的資料型態是什麼?
  • int / varchar / varchar

    seanstar5317 於 2012/10/21 20:08 回覆

  • 路人
  • hi~一直都忘了問-.-我用的是XAMPP的

    www/AndroidConnectDB/
    這行路徑php檔要放在哪啊??

    我是放在htdoc裡..
  • htdoc/AndroidConnectDB 底下吧~

    seanstar5317 於 2012/10/24 11:49 回覆

  • Melynn
  • 不好意思想要請問一下
    如果要改成不用按鈕的形式而是直接印在手機螢幕上該如何做呢?
    還有就是要如何將從資料庫取到的值來做運用?
    謝謝!!
  • 直接顯示的話就是在onCreate就去資料庫撈資料囉~

    請問做運用是指......?

    seanstar5317 於 2012/10/24 13:53 回覆

  • Melynn
  • 就是假設從資料庫中
    TextView user_name = new TextView(Database.this);
    user_name.setText(jsonData.getString("number"));
    user_name.setLayoutParams(view_layout);
    然後印出來是123
    那我是否可以對取出來的123做+1或是-1動作?
  • 當然可以呀
    抓出來的值就可以自由運用了阿XD"

    seanstar5317 於 2012/10/24 14:01 回覆

  • Melynn
  • 阿...那我想要請問要怎麼做@@""
    不知道抓出來的是陣列還是...@@?

  • PHP回傳的是一個字串(String)
    我們利用這個符合JSON格式的字串建立JSONArray / JSONObject物件
    再用jsonData.getString("number")這個方法把值抓出來

    seanstar5317 於 2012/10/24 14:23 回覆

  • Melynn
  • 好的!非常謝謝你!
    我來試試看!
  • 不會 =)

    seanstar5317 於 2012/10/24 14:45 回覆

  • 訪客
  • 假如我資料庫裡有多加一個欄位name要顯示,不知道要那些地方要修改
  • JSONArray跑迴圈抓資料的部分

    seanstar5317 於 2012/10/27 10:27 回覆

  • 訪客
  • 先在本機端建立與資料庫連線的PHP檔
    將ResultSet以JSON的格式回傳
    www/AndroidConnectDB/android_connect_db.php

    請問這段我要怎麼用..
    我看不懂這段..,毫無頭緒google蠻多的了...
  • 第三行指的是PHP檔的路徑~

    是哪邊不懂呀@@?

    seanstar5317 於 2012/10/30 22:17 回覆

  • #28訪客
  • 就是我該如何建一個php檔...

    和第三段routh在哪裡..

    不好意思,php這邊功夫底真的有點空.....
  • 第三行就是路徑了呀~~

    這部分可能要自己找一下PHP的教學囉

    seanstar5317 於 2012/10/30 23:55 回覆

  • 訪客
  • 如果我是想要將資料寫入資料庫
    不知道要怎麼修改
  • 訪客
  • 我已經解決了怎麼寫入到資料庫了
    實在太感謝你了
    這篇幫助了我很多,而且有問題發問都會回答,真的很謝謝你
  • 這邊都沒說是怎樣寫資料庫的阿>"<
    你要不要跟大家分享一下XD

    我比較怕回答問題都沒幫到忙啦....
    這篇寫得不太好 造成大家很多困擾ˊˇˋ
    需要各位多多指教啦!

    seanstar5317 於 2012/11/03 19:52 回覆

  • KOK
  • 前輩您好,小弟剛學,可以跟你要整包原始檔參考嗎??
    信箱: ftchinetmsn .com
    感激不盡
  • 其實所有程式碼都在這邊了阿XD

    seanstar5317 於 2012/11/12 20:47 回覆

  • Leon
  • 謝謝您的教學 手機已經可以顯示資料了
    不過我將資料庫的的內容從原先的英文字換成中文就會出現亂碼
    請問原因是?...
  • 應該是PHP回傳值給JAVA的時候 編碼跑掉
    猜的啦XD"

    seanstar5317 於 2012/11/22 15:44 回覆

  • 訪客
  • $sql = $_POST['query_string'];
    $res = mysql_query($sql);
    while($r = mysql_fetch_assoc($res))

    $output[] = $r;
    我用網頁連的時候 都說這裡有錯誤 可是用mysql_error查也看不出來呢

    請問大大是哪裡出問題了@@?
  • 直接用瀏覽器開啟這個php檔案
    會沒有query_string這個參數

    seanstar5317 於 2012/12/05 21:47 回覆

  • 訪客
  • StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork()
    .penaltyLog()
    .build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectLeakedSqlLiteObjects()
    .penaltyLog()
    .penaltyDeath()
    .build());
    請問大大這個部分要怎麼跟php做連結
  • 這部分沒有要連PHP阿
    請參考上一篇~

    seanstar5317 於 2012/12/06 09:19 回覆

  • 訪客
  • The application Andoir-php(process com.example.android_php)has violated its self-enforced StrictMode policy
    我按按鈕要抓資料
    模擬器就跳出這個問題
    想請問大大這樣有沒有辦法解決
    THX
  • 請問你的Android版本是什麼

    seanstar5317 於 2012/12/06 09:21 回覆

  • 訪客
  • 我用2.33的去模擬的
  • 請參考前一篇~
    3.0以下不用設定StrictMode

    seanstar5317 於 2012/12/06 21:52 回覆

  • 訪客
  • 想請問版大
    你當初在做這部分的時候有愈到
    程式都沒問題可是卻抓不到資料的問題嗎?
    我現在完全不知道是哪部分有誤了@@
  • 有阿~當初也debug很久XD

    catch到例外的時候可以把錯誤輸出到Log看看
    有些我都註解掉了

    也有可能是在傳遞資料的時候編碼跑掉

    或者JSON格式不對

    seanstar5317 於 2012/12/10 09:40 回覆

  • JUS
  • 請問版大
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork()
    .penaltyLog()
    .build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectLeakedSqlLiteObjects()
    .penaltyLog()
    .penaltyDeath()
    .build());
    這段程式碼可以解釋一下ㄇ
    StrictMode 這句他一直出現紅線
  • 這段的用途請參考前一篇筆記~

    紅線可以把你的游標移過去看他的錯誤是什麼阿~

    seanstar5317 於 2012/12/11 22:02 回覆

  • JUS
  • 版大我道模擬器按下按鈕以後 LOG CAT
    就會出現下列的東西
    12-11 05:26:51.584: D/AndroidRuntime(274): Shutting down VM
    12-11 05:26:51.584: W/dalvikvm(274): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
    12-11 05:26:51.606: E/AndroidRuntime(274): FATAL EXCEPTION: main
    12-11 05:26:51.606: E/AndroidRuntime(274): java.lang.ClassCastException: android.widget.TableRow
    12-11 05:26:51.606: E/AndroidRuntime(274): at com.example.successthree.MainActivity$1.onClick(MainActivity.java:42)
    12-11 05:26:51.606: E/AndroidRuntime(274): at android.view.View.performClick(View.java:2408)
    12-11 05:26:51.606: E/AndroidRuntime(274): at android.view.View$PerformClick.run(View.java:8816)
    12-11 05:26:51.606: E/AndroidRuntime(274): at android.os.Handler.handleCallback(Handler.java:587)
    12-11 05:26:51.606: E/AndroidRuntime(274): at android.os.Handler.dispatchMessage(Handler.java:92)
    12-11 05:26:51.606: E/AndroidRuntime(274): at android.os.Looper.loop(Looper.java:123)
    12-11 05:26:51.606: E/AndroidRuntime(274): at android.app.ActivityThread.main(ActivityThread.java:4627)
    12-11 05:26:51.606: E/AndroidRuntime(274): at java.lang.reflect.Method.invokeNative(Native Method)
    12-11 05:26:51.606: E/AndroidRuntime(274): at java.lang.reflect.Method.invoke(Method.java:521)
    12-11 05:26:51.606: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    12-11 05:26:51.606: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    12-11 05:26:51.606: E/AndroidRuntime(274): at dalvik.system.NativeStart.main(Native Method)
  • 猜測是你在新增TableRow的時候的轉型出錯了(?)

    seanstar5317 於 2012/12/11 22:04 回覆

  • sunny1001
  • 你好 我測試之後 沒錯誤 但是點下抓資料囉 卻沒有資料出來 請問可能是哪邊問題 路徑確認過了
  • 看一下LOG有沒有錯誤訊息吧~

    seanstar5317 於 2012/12/14 11:11 回覆

  • 訪客
  • 版大您好:
    我的執行後會出現以下的問題,有爬了很多文但都無法解決
    想請問版大究竟是哪裡出錯了
    12-21 11:27:23.644: E/System(60): Failure starting core service
    12-21 11:27:23.644: E/System(60): java.lang.SecurityException
    12-21 11:27:23.644: E/System(60): at android.os.BinderProxy.transact(Native Method)
    12-21 11:27:23.644: E/System(60): at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:146)
    12-21 11:27:23.644: E/System(60): at android.os.ServiceManager.addService(ServiceManager.java:72)
    12-21 11:27:23.644: E/System(60): at com.android.server.ServerThread.run(SystemServer.java:206)
    12-21 11:27:23.664: E/EventHub(60): could not get driver version for /dev/input/mouse0, Not a typewriter
    12-21 11:27:23.664: E/EventHub(60): could not get driver version for /dev/input/mice, Not a typewriter
    12-21 11:27:23.844: E/SoundPool(60): error loading /system/media/audio/ui/Effect_Tick.ogg
    12-21 11:27:23.844: E/SoundPool(60): error loading /system/media/audio/ui/KeypressStandard.ogg
  • sorry現在才看到~

    Google了一下這個錯誤
    可能是模擬器造成的不明錯誤吧XD"
    把原本的刪掉 新增另一個模擬器試試看吧~

    seanstar5317 於 2012/12/25 21:49 回覆

  • 想要請問您!!
  • 請問版主.
    我的log cat出現這個錯誤:
    03-31 12:53:22.280: E/log_tag(866): org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONArray
    想要請問要怎麼修正才對呢?ˊˋ
    然後我的php若直接看的話
    頁面上只有顯示 null 的字樣
    請問這是正常的嗎?><
  • 應該是PHP端查詢失敗
    回傳給JAVA的是錯誤訊息
    錯誤訊息就不能轉換成JSON物件了~

    seanstar5317 於 2013/04/07 23:21 回覆

  • ♥煥霖&amp;憶婷♥
  • 請問要如何在TextView中加上卷軸呢?
  • 請問您的卷軸是指@@?

    seanstar5317 於 2013/04/07 23:22 回覆

  • 您好:)
  • 我是上上一樓的發問者
    謝謝版主回覆!! 那個問題我已經解決了:)
    不過現在遇到一個新的問題:
    以下是我主要問題程式片段:
    (in java)
    try {
    String result = DBConnector.executeQuery("SELECT*FROM user where zip = 'newzip' ");
    System.out.println(result);

    (php語法)
    <?php
    $db = mysql_pconnect("localhost","root","1234");

    mysql_query("SET CHARACTER SET 'UTF8';");
    mysql_query("SET NAMES UTF8;");
    mysql_query("SET CHARACTER_SET_CLIENT=UTF8;");
    mysql_query("SET CHARACTER_SET_RESULTS=UTF8;");
    mysql_select_db("food");

    $sql = $_POST["query_string"];

    $res = mysql_query($sql) or die(mysql_error());
    while($r = mysql_fetch_assoc($res))
    $output[] = $r;

    print(json_encode($output));
    mysql_close();
    ?>

    這是我的錯誤訊息:
    mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in <b>C:\AppServ\www\AndroidConnectDB\android_connect_db.php</b> on line <b>13</b><br />
    我有將java中的語法直接在phpmyadmin中執行
    (即SELECT*FROM user where zip = 'newzip')
    是可以正確找到該筆符合條件的資料
    但是不知道為什麼 透過java寫入至php中去呼叫mySQL執行時卻總是傳回錯誤
    上網爬過很多文
    有試著去修正過編碼的問題(SET NAMES UTF8;)
    也有去php.ini修改過 magic_quotes_gpc = On
    但仍舊回傳null以及錯誤訊息
    但是我將它改成
    SELECT*FROM user where id=1 時
    是可以正確執行的00"
    所以再猜想會不會是單引號引起的問題
    也有將它改成
    SELECT*FROM user where zip = /'newzip/'
    卻仍舊不見好轉ˊˋ

    想要請問是否有解決的方法?ˊˋ

    補充:
    我的SQL錯誤回報:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'newzip\'' at line 1
  • 抱歉之前拖這麼久才回覆....

    要使用 escape character 的話, 應該是反斜線 \ 喔
    試試看吧@@

    ----更新----

    剛剛發現你好像有用反斜線了XD

    JAVA透過HTTP傳遞字串會自動escape
    PHP卻沒有處理
    可以試試看用 str_replace 把反斜線清掉
    或者有其他處理 escape character 的函式(?)

    seanstar5317 於 2013/04/08 22:12 回覆

  • 謝謝您!!
  • 感謝版主回覆!!:)
    不過小妹不才 有點搞亂了
    $sql = $_POST["query_string"];

    $sql = str_replace ("\", " ", "$sql");
    $res = mysql_query($sql) or die(mysql_error());
    while($r = mysql_fetch_assoc($res))
    $output[] = $r;


    print(json_encode($output));
    不知道replace這樣寫對嗎?
    好像不能這樣直接命令?ˊˋ
    想要請問該怎麼改才對呢><
  • 您好 我是樓上的發問者:)
  • 版主您好! 我已經解決這個問題了:)
    最後使用stripslashes($_POST["query_string"]);
    就成功了:)
    還是謝謝您的回答!!小妹受益良多~
    ---------------------------------------------
    另外還有個問題想要請問您
    當我按下catch時
    資料會一直累積寫入
    不知道有沒有什麼方法可以當按下catch時
    他會先清空頁面上的值後 再重新寫入呢?
  • 原來要這樣做 謝謝你的分享 >"<

    可以在觸發事件的時候
    user_list.removeAllViews();

    §參考 http://developer.android.com/reference/android/view/ViewGroup.html#removeAllViews()

    試試看吧@@

    seanstar5317 於 2013/04/09 15:48 回覆

  • Hi
  • 您好~:)
    我有試著用user_list.removeAllViews();
    但是會造成只顯示第一筆資料
    後續資料會被強迫終止ˊˋ
  • removeAllViewsInLayout() 這個方法呢@@?

    seanstar5317 於 2013/04/09 21:20 回覆

  • 你好:)
  • 您好~!
    恩恩!! 已經可以成功執行了
    真的很謝謝版主熱心回覆!!><
    如果不嫌棄的話
    小妹最近又有一個新問題ˊˋ
    我現在試著將資料庫改放到實驗室中的固定ip上
    想要透過php 改連結到位於遠端的資料庫
    但是卻回傳找不到資料表
    想要請問一下 不知道是什麼原因導致呢?ˊˋ
  • 有幫到忙就好 >"<

    可能是用來使用遠端資料庫的登入帳號只能在 localhost 登入
    要把登入主機改成 %

    seanstar5317 於 2013/04/12 20:45 回覆

  • 103
  • 版主您好:
    想要請問一下
    因為我要呈現的資訊太多了 已經超出頁面
    不知道有什麼辦法可以讓他出現滾條
    或是怎麼樣才能夠往下滑 已看到下方超出頁面的資訊呢?><
  • 可以試試 ScrollView ~

    seanstar5317 於 2013/04/18 09:16 回覆

  • 訪客
  • 版主妳好
    想請問妳一下
    我實作妳的程式是 ok 的
    不過我想在 php 做好sql 指令處理後由手機來做 jason 的讀取動作就好
    而不是由手機發送sql 指令
    想請問板大是否能給我個方向或提點
  • 那只要把SQL寫在PHP裡面就好了~

    seanstar5317 於 2013/05/01 10:18 回覆

  • 訪客
  • 我是上面的發問者 關於 PHP 使用 SQL 這塊我有實作出來
    也有運用網頁查看結果是可行的
    想請問關於手機方面使用GET方式來接收JASON資料的話該如何實作 有無範例可供參考 期間有嘗試過板大的範例來實作但 POST 的 BasicNameValuePair 無法接收DOUBLE的數值 所以想請問一下板大
  • GET / POST 都是發送到 PHP 端
    接收資料是在 HttpResponse 這部分喔

    seanstar5317 於 2013/05/01 13:49 回覆

  • 楊仔
  • 想請問一下android 連mySQL
    一定要透過PHP連嗎
    還是可以有其他方式呢
  • 好像都得透過呼叫伺服器端的方式來連資料庫
    可以用PHP、JSP、ASP......等

    要用JDBC連都會失敗

    seanstar5317 於 2013/05/02 10:35 回覆

  • 訪客
  • 請問一下~
    [{"test_id":"1","test_value":"100"},{"test_id":"2","test_value":"1000"}]
    DBConnector result出來的結果是這樣
    可是沒辦法像版主單純跑出abcd 1234那種(user_acc.setText(jsonData.getInt("test_value")))
    例外處理標記是顯示
    Resources$NotFoundException: Resource ID #0x64
  • 這個錯誤是在抓 layout 的時候,
    ID 有錯誤耶~
    先檢查看看有沒有打錯>"<

    seanstar5317 於 2013/05/06 21:56 回覆

  • 訪客
  • 想請教一下~HttpPost 連結是沒有的ip
    程式執行時會直接當掉
    要怎麼確定有那個IP位置的php?
  • 利用 try-catch 吧
    可是程式設計師自己寫在裡面的URL
    怎麼會沒有這個 IP 0.0

    seanstar5317 於 2013/05/06 21:57 回覆

  • ROACH
  • 這個範例是我第一個android測試程式
    終於踹出來的感動感動,遇到的一些問題分享給看這篇的戰友...

    問題1:StrictMode.setThreadPolicy這行出現一堆紅色看錯誤的話應該是minSdkVersion版本太低的問題
    到AndroidManifest.xml開啟後把uses-sdk裡面的android:minSdkVersion="XX"
    調到8以上吧...

    問題2:org.apache.http.conn.HttpHostConnectException: Connection to 出現這種的錯誤訊息
    先用內建瀏覽器檢查如果連的到該位址的話
    那一樣到AndroidManifest.xml的uses-sdk那段的下面多加
    <uses-permission android:name="android.permission.INTERNET" />

    比方我的配置大概這樣吧
    <uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET" />

    花的好多時間除錯真的滿感謝大大的範例教學...
    如果我的方向錯誤請大大指教

    想問一個問題您在上面說
    /*
    SQL 結果有多筆資料時使用JSONArray
    只有一筆資料時直接建立JSONObject物件
    JSONObject jsonData = new JSONObject(result);
    */

    這邊要怎寫判斷式來判別一筆還是多筆阿~~
    還是先用try包住 JSONArray 如果丟出錯誤就用JSONObject呢
  • 謝謝您的補充 <(_ _)>
    這篇有很多不完善的地方請各位多多包涵~

    --------------------------------------------------------

    如果是用 Eclipse 開發的話,
    在開啟 Manifest.xml 這個檔案的時候,
    下面會看到 permission 的分頁,
    切換過去也可以選擇要打開那些 permission 喔~

    --------------------------------------------------------

    好像只能用您說的方式判斷呢....
    其實小弟我也一直無法理解為何只有一筆資料時不能用 JSONArray

    seanstar5317 於 2013/05/06 22:06 回覆

  • 57樓
  • 謝謝~
    因為有時候server會關掉XD
  • N
  • 您好

    小弟是新手剛接觸 想請問一下
    網頁:ASP .net C#
    資料庫:MySQL
    android這邊要怎麼連資料庫呢?

    要做出
    註冊會員(把註冊好的會員資料傳到資料庫存著)
    會員登入(把使用者輸入的帳密跟資料庫內的資料確認是不是會員)
    存取資料

    不知道能不能請您指導一下?
  • 在 HttpPost 那邊把呼叫的 URL 改成 aspx 的URL
    其餘部分應該跟以往做網頁端的方式差不多~

    不知道能不能請您詳細敘述一下問題@@

    seanstar5317 於 2013/05/28 14:24 回覆

  • 悄悄話
  • ROACH
  • 給57樓的朋友補充一下!如果Server關掉的話
    程式跑到httpClient.execute那段會當在那邊無法回應
    所以多加這兩行吧~反正連線五秒內沒回應就放棄,叫程式不要硬撐的
    一樣也要包在try裡面就可以的
    httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);

    httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
    跟大家分享一下
  • 謝謝你的分享 >"<

    seanstar5317 於 2013/05/30 23:43 回覆

  • 訪客
  • 不好意思 初學程式語言 請問PHP檔裡的 $sql = $_POST['query_string']

    這個query_string 從哪來的? 小弟除了這行不同 其他一樣 但小弟這行是用SQL語法(select ..) 想請問這行是什麼意思
  • boxza2003
  • 你好 小弟是樓上那為 小弟有看到你將 sql 語法放在android端 不好意思 沒看清楚就在提問 目前小弟執行後 是沒資料的 在PHP端 是有顯示 { "欄位" "資料" } 所以資料庫跟PHP應該沒問題,小弟正在從android 找尋問題
  • boxza2003
  • 不好意思,不用理上面兩則留言,沒注意到前面有人詢問相關問題了
    另外想請問一下,假如我把SQL語法(select)放在PHP那邊,那我android端要怎改
    因為沒改是抓不到值
  • 不好意思現在才看到留言 >"<

    如果把SQL字串寫在PHP裡面的話
    DBConnector 類別在發送 POST 請求的時候
    不要傳參數過去就可以囉~

    seanstar5317 於 2013/06/05 22:28 回覆

  • adam
  • 想請問一下
    為什麼setContentView(R.layout.main);這邊
    main cannot be resolved or is not a field
  • 檢查一下有沒有建立 layout/main.xml 這個排版的檔案

    seanstar5317 於 2013/06/07 14:07 回覆

  • dennis800919
  • 1.ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.cece/.TestAndroidDBActivity }
    2.ActivityManager: Warning: Activity not started, its current task has been brought to the front

    這是什麼? 是可以執行出來 但模擬器沒有出現資料
  • 把模擬器重開試試看@@?

    seanstar5317 於 2013/06/10 16:44 回覆

  • dennis800919
  • 有從新用了~還是不行

    http://127.0.0.1/AndroidConnectDB/android_connect_db ----->我在網路上打這個

    他出現


    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\AndroidConnectDB\android_connect_db.php on line 12
    null
    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\AndroidConnectDB\android_connect_db.php on line 12 null
    建議更好的譯法 空

  • 悄悄話
  • 悄悄話
  • 悄悄話
  • 悄悄話
  • dennis800919
  • 有顯示出來了

    謝謝大大

    ^^
  • 希望有幫到你的忙 >"<

    seanstar5317 於 2013/06/14 17:38 回覆

  • 訪客
  • 不好意思 請問一下 用這種寫法可以把資料寫進資料庫mysql嗎?
    String result = DBConnector.executeQuery("INSERT.....");
    還是只能用jdbc?
  • 可以啊~

    seanstar5317 於 2013/06/29 16:49 回覆

  • 訪客
  • 請教一下 出現這個錯誤
    org.json.JSONException: Value <meta of type java.lang.String cannot be converted to JSONArray
    應該如何解決呢?感覺好像是在JSONArray jsonArray = new JSONArray(result);
    發生錯誤 可是不知道有什麼好方法
  • PHP 回傳的結果不是 JSON 格式字串
    應該是查詢的時候有錯誤

    可以用Log 把結果印出來看看~

    seanstar5317 於 2013/06/29 16:50 回覆

  • 訪客
  • 不好意思 想請問一個問題><
    程式已經可以成功燒到手機了
    但是手機上卻一直無法正確的運作
    連button都看不到就直接跳出來 然後說已停止
    想請問這會不會是連結不到資料庫的原因><????
  • 程式只有在按下按鈕之後才會連資料庫
    所以如果是一開始就打不開
    可能是手機Android 版本跟模擬器不一樣喔~

    seanstar5317 於 2013/07/02 14:52 回覆

  • dennis800919
  • 大大我問一下喔~

    如果要把圖片傳進去app

    會改很多嗎?

  • 請問您指的是.....
    在畫面上放圖片 or
    上傳圖片到伺服器@@?

    seanstar5317 於 2013/07/04 09:47 回覆

  • 悄悄話
  • dennis800919
  • 大大

    app取mysql資料庫的圖片

    會改很多嗎?
  • 到排版的畫面可以找到放圖片的元件

    seanstar5317 於 2013/07/05 23:32 回覆

  • 李柏融 李
  • 所以程式不用改嗎?
  • 這幾天會寫一下使用圖片的範例 ^_^

    seanstar5317 於 2013/07/10 01:06 回覆

  • 訪客
  • 請問版主有試過從app輸入中文到資料庫端嗎
    目前我嘗試過都以亂碼收場 還在努力找尋問題><

    另外 謝謝你這篇的分享 真的非常受用^^
  • JAVA 傳到 PHP 的編碼要再檢查一下喔~

    這篇還有很多遺漏的地方
    如果有問題的話請多多指教 >"<

    seanstar5317 於 2013/07/10 01:08 回覆

  • kyle
  • 版主你好
    小弟嘗試版主你的程式之後
    出現以下的問題
    Call requires API level 9 (current min is 8): new android.os.StrictMode.ThreadPolicy.Builder

    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork()
    .penaltyLog()
    .build());

    是SDK版本問題嗎?
  • 到 Manifest.xml 把SDK min 改成9 就可以囉

    seanstar5317 於 2013/07/10 01:09 回覆

  • rr
  • 我是將android端改連到mssql,但php在接收mssql資料庫值時,中文卻抓不到耶,也不是亂碼,請完全接不到值,既不是亂碼,也不是null,想請問你,這問題要如何解決?(查了很多網路資料都沒有提到)
  • 我沒有連過 MSSQL 耶....
    完全接不到結果是不是在連資料庫的時候就出問題了呢@@?

    seanstar5317 於 2013/07/10 01:10 回覆

  • Jerry
  • 謝謝版主與各位分享,試過了,沒問題!
  • Lee
  • 感謝版主的分享
    但我點下抓資料囉
    卻沒有資料出來

    LogCat
    則顯示
    (1)error opening trace file: No such file or directory (2)
    (2)Emulator without GPU emulation detected.
    (3)Skipped 197 frames! The application may be doing too much work on its main thread.

    想請教是哪一個環節出錯了呢?! 感謝
  • 應該是呼叫後端的PHP 有問題

    seanstar5317 於 2013/07/15 13:16 回覆

  • 新手
  • 板主你好,
    我試了你提供的程式,一直無法顯示資料
    我試著把從資料庫取回的result,在logcat印出來,發現也是正常(用JSON Validator跑過),如下:[{"id":"1","ac":"abc","pw":"1234"},{"id":"2","ac":"def","pw":"45678"}]
    但是程式再解析JSON時,logcat就會出現
    org.json.JSONException: Value ? of type java.lang.String cannot be converted to JSONArray
    請問這是什麼問題???
  • 新手
  • 終於找到問題所在
    問題是php檔案的編碼問題
    我用emeditor編寫,預設是UTF-8(含簽章)
    改為UTF-8(無簽章)就可以了
  • 實習生
  • 請問如果要連結到遠端的資料庫,版主有試過嗎?
    就是非localhost的..
    例如手機用3G網路也可以傳送POST和接收
  • 實習生
  • 應該說,我試過了,但是出現
    406 Not Acceptable
    This request is not acceptable
    Powered By LiteSpeed Web Server LiteSpeed Technologies is not responsible for administration and contents of this web site!
    的拋出錯誤
    不知道版主有沒有遇到
    在本機上的IP/yy.php都可以正常接收POST
    不知為什麼把資料庫移到online的伺服器上就出現這種錯誤
    應該不是PHP的語法錯誤,因為就算連執行"空的PHP","單純echo的PHP"也出現此錯誤

    我原先是用
    http://j796160836.pixnet.net/blog/post/30577968
    此老師的做法(其實跟版主一樣原理)
    錯誤後,我改用版主的寫法,一樣出現這個錯誤
    求版主研討~
  • 是不是被防火牆擋住了@@?

    seanstar5317 於 2013/08/20 15:28 回覆

  • 訪客
  • 請問一下
    為什麼抓資料按下去沒有任何反應
  • Lee
  • 版主你好 小弟我做了一個可以新增MYSQL的程式

    PHP:

    <?php
    $link=mysql_connect("127.0.0.1","root","1234");
    mysql_select_db("test4",$link);
    mysql_query("SET NAMES utf8");
    $newuser = $_GET['newuser'];
    $sql = "INSERT INTO teacher (name) VALUES ('$newuser')";
    mysql_query($sql);
    mysql_close();
    ?>
  • Lee
  • 我是上面那位

    感謝大大

    我發現問題了

    是自己程式打太快,字打錯了

    另外,這邊留言很容易吃留言耶...
  • rain
  • 版主你好~
    我用了你的程式碼但是中文跑出來會出現亂碼。有什麼方法可以解決中文亂碼的問題嗎? 謝謝~
  • 訪客
  • 請問版主
    你在這行程式中
    String result = DBConnector.executeQuery("SELECT * FROM user");
    能夠提供insert和update的SQL語法嗎?
    我自己試了好幾次
    只做出delete功能
  • 訪客
  • 我是94樓的訪客
    我剛剛查完資料之後發現
    insert和update需要用到的是executeUpdate()
    請問版主關於這個方法的內容是否跟executeQuery()是一樣的?
  • 訪客
  • 抱歉問個笨問題
    因為我只有在前陣子上課時碰過android
    以前並沒用過java與php
    請問新增的java類別是要放在哪個位置呢?

    我用模擬器跑的時候似乎沒有動到java檔?
  • 跟Android 的Activity 放在一起就好了

    seanstar5317 於 2013/08/20 15:34 回覆

  • 訪客
  • 抱歉我是樓上
    請問新增的java類別名稱要取名為?
  • 訪客
  • 寫到快瘋掉了
    只有感激不盡
  • 訪客

  • BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8);
    StringBuilder builder = new StringBuilder();
    String line = null;
    while((line = bufReader.readLine()) != null) {
    builder.append(line + "\n");
    }


    請問這段的作用是轉成jsonObject可接收的形式嗎 那為何要這樣寫
  • 這邊是讀取PHP 傳回來的字串

    seanstar5317 於 2013/08/20 15:36 回覆

  • shuan
  • 我是#100樓的
    用mysql_error() 呼叫錯誤
    顯示Query was empty
    是指 值沒有傳入嗎?? 還是代表甚麼?
  • 是因為mysql_query() 沒有給SQL 語法吧@@

    seanstar5317 於 2013/08/20 15:36 回覆

1 23
找更多相關文章與討論