通过JSON行插入数据库中不工作 [英] Insert rows in database through json does not work
问题描述
我跟着这个教程的http:/ /www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/ 但虽然我觉得我已经按照它一步一步的东西不起作用。什么不工作是我的数据库写一些行。能否请您给一些提示吗?非常感谢您的宝贵时间。
这里是logcat的:
I followed this tutorial http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/ but it something doesn't work although I think I've followed it step by step. What does not work is to write in my database some rows. Can you please give some hints? Thank you very much for your time. Here is the logcat:
02-22 05:10:45.262: E/AndroidRuntime(1202): FATAL EXCEPTION: AsyncTask #2
02-22 05:10:45.262: E/AndroidRuntime(1202): Process: com.example.test, PID: 1202
02-22 05:10:45.262: E/AndroidRuntime(1202): java.lang.RuntimeException: An error occured while executing doInBackground()
02-22 05:10:45.262: E/AndroidRuntime(1202): at android.os.AsyncTask$3.done(AsyncTask.java:300)
02-22 05:10:45.262: E/AndroidRuntime(1202): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
02-22 05:10:45.262: E/AndroidRuntime(1202): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
02-22 05:10:45.262: E/AndroidRuntime(1202): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
02-22 05:10:45.262: E/AndroidRuntime(1202): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
02-22 05:10:45.262: E/AndroidRuntime(1202): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-22 05:10:45.262: E/AndroidRuntime(1202): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-22 05:10:45.262: E/AndroidRuntime(1202): at java.lang.Thread.run(Thread.java:841)
02-22 05:10:45.262: E/AndroidRuntime(1202): Caused by: java.lang.NullPointerException
02-22 05:10:45.262: E/AndroidRuntime(1202): at com.example.test.MainActivity$CreateNewRow.doInBackground(MainActivity.java:134)
02-22 05:10:45.262: E/AndroidRuntime(1202): at com.example.test.MainActivity$CreateNewRow.doInBackground(MainActivity.java:1)
02-22 05:10:45.262: E/AndroidRuntime(1202): at android.os.AsyncTask$2.call(AsyncTask.java:288)
02-22 05:10:45.262: E/AndroidRuntime(1202): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
02-22 05:10:45.262: E/AndroidRuntime(1202): ... 4 more
这是我的PHP:
This is my php:
/*
* Following code will create a new product row
* All product details are read from HTTP Post Request
*/
// array for JSON response
$response = array();
// check for required fields
if (isset($_POST['nume']) && isset($_POST['masa']) && isset($_POST['ip'])) {
$nume = $_POST['nume'];
$masa = $_POST['masa'];
$ip = $_POST['ip'];
// include db connect class
require_once __DIR__ . '/db_connect.php';
// connecting to db
$db = new DB_CONNECT();
// mysql inserting a new row
$result = mysql_query("INSERT INTO test2(null,nume, masa, ip) VALUES(null,'$nume', '$masa', '$ip')");
// check if row inserted or not
if ($result) {
// successfully inserted into database
$response["success"] = 1;
$response["message"] = "Product successfully created.";
// echoing JSON response
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);
}
?>
这是我的解析器:
package com.example.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
static InputStream is = null;
static JSONObject jArr=null;
static String json = "";
// function get json from url
// by making HTTP POST or GET method
public static JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
// 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,"utf-8"));
HttpResponse httpResponse = httpClient.execute(httpPost);
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");
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);
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");
}
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 {
jArr = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String (Array)
return jArr;
}
}
这是我的主要活动:
And this is my main activity:
package com.example.test;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.format.Formatter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
//import java.util.logging.Formatter;
public class MainActivity extends Activity {
// Progress Dialog
private ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();
EditText inputName;
EditText inputDesc;
// url to create new product
private static String url_create_row = "http://localhost/android_connect/create_row.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Edit Text
inputName = (EditText) findViewById(R.id.inputName);
inputDesc = (EditText) findViewById(R.id.inputDesc);
inputDesc.setText(getLocalIpAddress().toString());
// Create button
Button btnCreateProduct = (Button) findViewById(R.id.btnAdaugare);
// button click event
btnCreateProduct.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// creating new product in background thread
new CreateNewRow().execute();
}
});
}
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String ip = Formatter.formatIpAddress(inetAddress.hashCode());
Log.i(TAG_SUCCESS, "****IP="+ip);
return ip;
}
}
}
} catch (SocketException ex) {
System.out.println("lala"+ex.toString());
}
return null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* Background Async Task to Create new product
* */
class CreateNewRow extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
/* @Override
protected void onPreExecute() {
super.onPreExecute();
pDialog.setMessage("Creating Row..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
Log.d(TAG_SUCCESS, "SUCCESSSSSSSSS!");
}*/
/**
* Creating product
* */
protected String doInBackground(String... args) {
String nume = inputName.getText().toString();
String ip = inputDesc.getText().toString();
String masa = "1";
// Building Parameters
List <NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("nume", nume));
params.add(new BasicNameValuePair("masa", masa));
params.add(new BasicNameValuePair("IP", ip));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = JSONParser.makeHttpRequest(url_create_row, "POST", params);
// check log cat for response
Log.d("Create Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
Toast.makeText(MainActivity.this, "s-a adaugat ceva in baza de date!", Toast.LENGTH_LONG).show();
// closing this screen
finish();
} else {
// failed to create product
Log.d(TAG_SUCCESS, "Nu a mers nimic");
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
/*protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
}*/
}
}
我加入清单和网络访问一个网络的权限。任何建议将是有益的,AP preciated。
I added the internet permission in manifest and the network access one. Any suggest will be helpful and appreciated.
推荐答案
小心HTTP参数区分大小写。
Be careful HTTP parameters are case sensitive.
您发送
params.add(new BasicNameValuePair("IP", ip));
但要检查
isset($_POST['ip'])
它应该是相同的:
it should be the same:
params.add(new BasicNameValuePair("ip", ip));
也是你正在使用错误的异步任务:
also you are making wrong use of async task:
protected JSONObject doInBackground(String... args) {
String nume = inputName.getText().toString();
String ip = inputDesc.getText().toString();
String masa = "1";
// Building Parameters
List <NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("nume", nume));
params.add(new BasicNameValuePair("masa", masa));
params.add(new BasicNameValuePair("IP", ip));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = JSONParser.makeHttpRequest(url_create_row, "POST", params);
// check log cat for response
Log.d("Create Response", json.toString());
return json;
}
protected void onPostExecute(JSONObject json) {
if(json != null){
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
Toast.makeText(MainActivity.this, "s-a adaugat ceva in baza de date!",
Toast.LENGTH_LONG).show();
// closing this screen
finish();
} else {
// failed to create product
Log.d(TAG_SUCCESS, "Nu a mers nimic");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
您不允许在 doInBackground
更新UI(如面包),你必须到code移动到onPostExecute。
You are not allowed to update the UI (such as toast) in doInBackground
You have to move that code to onPostExecute.
这篇关于通过JSON行插入数据库中不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!