gpt4 book ai didi

java - 通过php和android进行Mysql数据库搜索

转载 作者:行者123 更新时间:2023-11-29 22:07:50 24 4
gpt4 key购买 nike

我一直在开发一个基本的 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 已在网络浏览器上经过多次测试并且运行良好。但每当我使用 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 之间是否存在格式或混淆?

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

谢谢!

最佳答案

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

android.os.NetworkOnMainThreadException

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

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

来自 s

关于java - 通过php和android进行Mysql数据库搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31980311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com