【问题标题】:Mysql database search through php and android通过php和android搜索mysql数据库
【发布时间】:2015-08-13 05:43:42
【问题描述】:

我一直在开发一个基本的 WAMP 数据库测试应用程序,但我遇到了一个大问题。我已经设法访问所有数据,添加新数据,甚至删除我的 MySQL 数据库上的数据,所有这些都来自我使用 php 的 Android 应用程序。但是,此时,每当我添加规范以搜索特定数据(如用户名或 ID 号)时,我的代码中都会出现错误,我无法弄清楚。

首先,这是我的 JSONParser 代码:

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

// function get json from url
// by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method,
                                  List<NameValuePair> params) {

    is = null;
    jObj = null;
    json = "";

    // Making HTTP request
    try {
        // check for request method
        if(method == "POST"){
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);   /////THIS WHERE THE ERROR POINTS TO
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }else if(method == "GET"){
            // request method is GET
            DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            HttpGet httpGet = new HttpGet(url);
            url += "?" + paramString;

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);

        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");

                Log.i("1 ", line);
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
}

对 JSONParser 类的调用来自一个单独的 Java 类,它扩展了 AsyncTask:

                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("pid", pid));

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(
                            "http://10.0.2.2/android_connect/get_product_details.php", "GET", params);

接下来是我用来搜索特定项目信息的 PHP 文件:

<?php

require 'connect.php';

if(isset($_GET['pid'])){
    $pid = trim($_GET['pid']);

    if($people = $db->prepare("SELECT * FROM products WHERE pid = ?")){
        $people->bind_param('i', $pid);
        $people->execute();

        $people->bind_result($pid, $name, $price, $desc, $created_at, $updated_at);

        $product = array();

        while($people->fetch()){
                $product["pid"] = $pid;
                $product["name"] = $name;
                $product["price"] = $price;
                $product["description"] = $desc;
                $product["created_at"] = $created_at;
                $product["updated_at"] = $updated_at;
        }

        $response["success"] = 1;

        $response["product"] = array();
        $response["product"] = $product;


        echo json_encode($response);
    }
    else {
        // failed to insert row
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";

        // echoing JSON response
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}

?>

PHP 已经在 Web 浏览器上进行了多次测试,并且运行良好。但是每当我使用 Android 应用程序调用它时,似乎都会失败,因为没有返回任何内容。

接下来是我的 logCat 信息:

08-13 01:16:50.259    2764-2764/com.dev.zane.testserver I/url﹕ http://10.0.2.2/UnCorkd/android_connect/get_product_details.php
08-13 01:16:50.259    2764-2764/com.dev.zane.testserver I/url﹕ http://10.0.2.2/UnCorkd/android_connect/get_product_details.php?pid=6
08-13 01:16:50.260    2764-2764/com.dev.zane.testserver D/AndroidRuntime﹕ Shutting down VM
08-13 01:16:50.261    2764-2764/com.dev.zane.testserver E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.dev.zane.testserver, PID: 2764
    android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
            at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
            at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
            at libcore.io.IoBridge.connect(IoBridge.java:122)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
            at java.net.Socket.connect(Socket.java:882)
            at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
            at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
            at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
            at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
            at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
            at com.dev.zane.testserver.JSONParser.makeHttpRequest(JSONParser.java:73)
            at com.dev.zane.testserver.EditProductActivity$GetProductDetails$1.run(EditProductActivity.java:131)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

错误似乎是在 JSONParser 类中的行:'HttpResponse httpResponse = httpClient.execute(httpGet);'在 GET 部分下。

什么可能导致此错误? GET/POST 之间是否存在一些格式或混淆?

任何帮助都会很棒,因为我已经为此烦恼了几天,似乎无法在网上任何地方找到任何明确的答案。如果我缺少任何信息或您需要更多信息,我会很乐意添加/编辑。

谢谢!

【问题讨论】:

    标签: java php android mysql wamp


    【解决方案1】:

    在单独的线程上执行网络操作。 为此,您可以使用AsyncTask。正如您的日志所说,您正在主线程上执行网络操作。

    android.os.NetworkOnMainThreadException
    

    将此代码放在AsycTaskdoInBackground()方法中

    JSONObject json = jsonParser.makeHttpRequest(                            "http://10.0.2.2/android_connect/get_product_details.php", "GET", params);
    

    来自 s

    【讨论】:

    • 正如我上面提到的,该操作已经在 AsyncTask 类中。所以它已经被异步调用了。不过还是谢谢
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多