通过JSON行插入数据库中不工作 [英] Insert rows in database through json does not work

查看:109
本文介绍了通过JSON行插入数据库中不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我跟着这个教程的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆