2011-12-08 112 views
0

我想通過以下教程連接到Android設備的MySQL:http://www.anddev.org/networking-database-problems-f29/connecting-to-mysql-database-t50063.html無法使用PHP連接到MySQL從Android使用PHP

所有這一切發生的是,它正在打印我希望連接到模擬器上的服務器的IP地址。它顯示了logcat的以下錯誤:

12-08 11:42:01.993: I/dalvikvm(274): threadid=3: reacting to signal 3 
12-08 11:42:02.113: I/dalvikvm(274): Wrote stack traces to '/data/anr/traces.txt' 
12-08 11:42:03.273: E/log_tag(274): Error parsing data org.json.JSONException: Value 
<!DOCTYPE of type java.lang.String cannot be converted to JSONArray 
12-08 11:45:58.283: E/log_tag(351): Error parsing data org.json.JSONException: Value 
<!DOCTYPE of type java.lang.String cannot be converted to JSONArray 
    12-08 11:53:11.302: E/log_tag(378): Error parsing data org.json.JSONException: Value 
    <!DOCTYPE of type java.lang.String cannot be converted to JSONObject 
12-08 12:03:31.643: E/log_tag(405): Error parsing data org.json.JSONException: Value 
<!DOCTYPE of type java.lang.String cannot be converted to JSONArray 
12-08 12:20:57.052: E/log_tag(432): Error parsing data org.json.JSONException: Value 
<!DOCTYPE of type java.lang.String cannot be converted to JSONArray 

下面是我的java文件的副本:

package com.david.Connect; 

    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.json.JSONArray; 
    import org.json.JSONException; 
    import org.json.JSONObject; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.widget.LinearLayout; 
    import android.widget.TextView; 


    public class ConnectActivity extends Activity { 
    /** Called when the activity is first created. */ 

     TextView txt; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // Create a crude view - this should really be set via the layout resources 
     // but since its an example saves declaring them in the XML. 
     LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
     txt = new TextView(getApplicationContext()); 
     rootLayout.addView(txt); 
     setContentView(rootLayout); 

     // Set the text and call the connect function. 
     txt.setText("Connecting..."); 
     //call the method to run the data retreival 
     txt.setText(getServerData(KEY_121)); 



    } 
    public static final String KEY_121 = "http://86.47.59.249/employee.php"; 



    private String getServerData(String returnString) { 

     InputStream is = null; 

     String result = ""; 
     //the year data to send 
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
nameValuePairs.add(new BasicNameValuePair("code","1")); 

//http post 
try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(KEY_121); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 

}catch(Exception e){ 
     Log.e("log_tag", "Error in http connection "+e.toString()); 
} 

//convert response to string 
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(); 
     result=sb.toString(); 
}catch(Exception e){ 
     Log.e("log_tag", "Error converting result "+e.toString()); 
} 
//parse json data 
try{ 
     JSONArray jArray = new JSONArray(result); 
     for(int i=0;i<jArray.length();i++){ 
       JSONObject json_data = jArray.getJSONObject(i); 
       Log.i("log_tag","id: "+json_data.getInt("EmployeeId")+ 
         ", name: "+json_data.getString("First_Name")+ 
         ", sex: "+json_data.getInt("Last_Name")+ 
         ", birthyear: "+json_data.getInt("Birth_Date") 
       ); 
       //Get an output to the screen 
       returnString += "\n\t" + jArray.getJSONObject(i); 
     } 
}catch(JSONException e){ 
     Log.e("log_tag", "Error parsing data "+e.toString()); 
} 
return returnString; 
    } 

    } 

,這裏是我的PHP文件,我有服務器86.47.59.29在MySQL中數據庫是:

<?php 
    mysql_connect("86.47.59.249","username","password"); 
    mysql_select_db("Test"); 

    $q=mysql_query("SELECT * FROM Tbl_Employee WHERE  
    EmployeeId>'".mysql_real_escape_string ($_REQUEST['code'])."'"); 
    while($e=mysql_fetch_assoc($q)) 
    $output[]=$e; 

    print(json_encode($output)); 

    mysql_close(); 
    ?> 

而下面是我的清單文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.david.Connect" 
    android:versionCode="1" 
    android:versionName="1.0" > 


    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:label="@string/app_name" 
      android:name=".ConnectActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
     </manifest> 

任何人都可以對此有所瞭解嗎?它讓我瘋狂!

感謝

+0

您應該緊急更改您的php腳本 - 將'$ _REQUEST ['code']'更改爲'mysql_real_escape_string($ _REQUEST ['code'])''。如果沒有這種改變,任何閱讀這篇文章的人都會有足夠的信息來輕易地破壞你的數據庫,並且可能會使用SQL注入攻擊你的服務器看到這個頁面的背景閱讀:http://php.net/manual/en/security.database.sql-injection.php –

+1

謝謝你只是改變那裏 – DMC

回答

1

如果我在瀏覽器中訪問http://86.47.59.249/employee.php,我得到一個404錯誤。這是因爲你的PHP腳本要麼設置不正確,要麼沒有正確設置。

你需要做兩件事情:

在你的Java,檢查請求的響應代碼。你可以這樣做,像這樣:

// ... 
HttpResponse response = httpclient.execute(httppost); 
StatusLine responseStatus = response.getStatusLine(); 
if (responseStatus.getStatusCode() != 200) { 
    // Handle error here 
} else { 
    HttpEntity entity = response.getEntity(); 
    // ... 

在你的PHP,你需要處理潛在的錯誤:

<?php 

    // Database connection settings 
    $dbHost = '86.47.59.249'; 
    $dbUser = 'username'; 
    $dbPass = 'password'; 
    $dbName = 'Test'; 

    // Try and connect to the database 
    if (!mysql_connect($dbHost, $dbUser, $dbPass)) { 
    header('HTTP/1.1 500 Internal Server Error'); 
    exit('Oh No! Something went wrong connecting to the database: '.mysql_error()); 
    } else if (!mysql_select_db($dbName)) { 
    header('HTTP/1.1 500 Internal Server Error'); 
    exit('Oh No! Something went wrong selecting the database: '.mysql_error()); 
    } 

    // Define SQL query 
    $query = "SELECT * 
      FROM Tbl_Employee 
      WHERE EmployeeId > '".mysql_real_escape_string($_REQUEST['code'])."'"; 

    // Try and execute the query 
    if (!$result = mysql_query($query)) { 
    header('HTTP/1.1 500 Internal Server Error'); 
    exit('Oh No! Something went wrong with the query: '.mysql_error()); 
    } 

    // Fetch all results into an array 
    while ($row = mysql_fetch_assoc($result)) { 
    $output[] = $e; 
    } 

    // Close database link 
    // You can safely leave this line out, PHP implicitly does this when 
    // it terminates 
    mysql_close(); 

    // Exit with a JSON encoded string of the results 
    exit(json_encode($output)); 
+0

當你輸入http://86.47.59.249/employee.php你不能訪問它的原因是因爲這不是我使用的實際地址。但是,當我輸入實際地址時,我得到一個404錯誤,但是如果我使用http://的ftp:// intead輸入地址,則可以連接。有什麼方法將ftp合併到我的php文件中? – DMC

+0

@davemc FTP服務器不會調用(運行)PHP腳本並給出輸出,它只會給你PHP源代碼。您需要讓PHP腳本在您的Web服務器上運行。如果它是一個有效的Web服務器,我想這可能只是將腳本移動到正確的目錄以允許它作爲網頁服務的問題。 – DaveRandom

+0

好吧,我剛剛發現我連接到了錯誤的服務器。事實證明,我的電腦是託管MySQLServer的電腦。林有點困惑現在因爲我不認爲這是一個網絡服務器。當我運行localhost \ employee.php它只是給了我打開或保存文件的選項。有任何想法嗎? – DMC

1

在瀏覽器中打開該頁面(employee.php),請查看源代碼(CTRL + U大多數瀏覽器),並確保只返回一個JSON字符串,因爲它清楚地在失敗試圖將結果解析爲JSON數組。

0

使用Firefox的Firebug擴展,看看數據你的PHP腳本返回。你很可能沒有使用正確的JSON.get *函數。