2012-04-13 28 views
1

我創建了一個使用java, php(backend) and mysql(database)的Android應用程序。我已將我的後端php代碼和數據庫放在Linux託管服務器上。我的問題是我只能從數據庫中讀取數據,也就是說,我的應用程序可以從服務器獲取數據,但它不能對獲取的數據進行任何更改,而且當我使用服務器運行時出現錯誤,但是當我將數據庫和代碼放在本地系統中時,它在本地主機上完美工作,但是當放置在服務器中時,它只能讀取數據但不能讀取數據。我已經給予服務器數據庫的完全權限。任何人都可以請幫我這方面? 我認爲服務器不接受來自外部人員的請求,比如移動設備。所以我的問題是如何在android中獲得web服務的所有權限?

what do we need to do such that the server accepts requests from mobile side? 

PS:我已經給予了充分的權限在服務器上的數據庫,也我已經在Android清單文件添加Internet權限。

@Lie瑞恩:按照您的要求,這裏是我的代碼連接到服務器:

protected List<List<String>> callWebServer(String queryString, String statement){ 

    List<List<String>> stringList = null; 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("query", queryString)); 
    nameValuePairs.add(new BasicNameValuePair("statement", statement)); 

    try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(WEB_SERVICE_URL); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
     String responseBody = httpclient.execute(httppost,responseHandler); 
     JSONObject json = new JSONObject(responseBody); 

     if(statement.equals(DB_SELECT_STATEMENT) || statement.equals(DB_INSERT_STATEMENT)){ 

      List<String> queryStrings = null; 
      // parsing query 
      if(statement.equals(DB_SELECT_STATEMENT)){ 
       queryStrings = splitQuery(queryString); 


      JSONArray jArray = json.getJSONArray("output"); 

      if(jArray.length() > 0) 
       stringList = new ArrayList<List<String>>(); 

      for(int i=0;i<jArray.length();i++){ 
       JSONObject json_data = jArray.getJSONObject(i); 

       String rowData = json_data.getString("rowData"); 
       if(rowData.equals("nothing")){ 
       // Toast.makeText(getBaseContext(), "No record found", Toast.LENGTH_LONG).show(); 
       }else{ 

        JSONObject getClassNameObject = new JSONObject(rowData); 
        List<String> tempStringList = new ArrayList<String>(); 

        for(String valueStr:queryStrings){ 
         if(valueStr.contains(".")) valueStr = valueStr.split("\\.")[1]; 
         tempStringList.add(getClassNameObject.getString(valueStr)); 
        } 

        stringList.add(tempStringList); 
       } 
      } 
      }else{ 
       JSONArray jArray = json.getJSONArray("output"); 
       stringList = new ArrayList<List<String>>(); 
       JSONObject json_data = jArray.getJSONObject(0); 

       stringList.add(getList("mn", json_data.getString("rowData"))); 

      } 
     } 

     //Toast.makeText(getBaseContext(), "Event Added Successfully", Toast.LENGTH_LONG).show(); 
    }catch(ArrayIndexOutOfBoundsException e){ 

    }catch(Exception e){ 

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

和PHP代碼來處理請求是:提前

<?php 
include "connect.php"; 

if($_POST["statement"] == "select"){ 

    $booleanRow = true; 
    // for select statements 
    $db_output = mysql_query($_POST["query"])); 
    while($row=mysql_fetch_array($db_output, MYSQL_ASSOC)){ 
     $output[] = array('rowData'=>$row); 
     $booleanRow = false;    
    }  

    if($booleanRow){ 
     $row = "nothing"; 
     $output[] = array('rowData'=>$row); 
    } 

    print(json_encode(array('output'=>$output))); 
}else{ 

    // for insert, update and delete  
    mysql_query($_POST["query"]); 

    $row = mysql_insert_id();  
    $output[] = array('rowData'=>$row); 
    print(json_encode(array('output'=>$output))); 
} 

mysql_close($link); 
    ?> 

感謝。

+0

你可以修剪一下你用來處理服務器端請求的代碼的小樣本,以及你用來發出請求的代碼。另外,請嘗試檢查服務器端數據庫用戶的權限。在編寫Web服務時要記住的一點是,只要請求的格式與服務器期望的內容相匹配,服務器就不會關心請求來自哪裏。 – 2012-04-13 12:47:52

+0

@LieRyan請檢查我的問題。我可以肯定地說,代碼中沒有問題,但是服務器需要做些什麼,但是根據您的請求,我發佈了我的代碼。 – 2012-04-13 13:03:01

+0

謝謝,現在暫時刪除(註釋掉)解析JSON字符串的代碼部分,而只是打印'responseBody'(logcat或屏幕上的textview),然後重新運行。答案是你期望的嗎?接下來,在'include「connect.php」;「之後添加'print($ _ POST [」statement「])''和'print($ _ POST [」query「]);'。語句和查詢字符串是否到達PHP腳本?如果他們這樣做,那麼這可能是MySQL部分的錯誤;嘗試一些'print(mysql_error());''''''''''''''''''''''mysql_fetch_array()'' – 2012-04-13 16:51:31

回答

1

要允許應用程序打開你需要設置「android.permission.INTERNET對」許可,您的Android清單文件(AndroidManifest.xml中)網絡插口:

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

有關列表的更多的權限看Manifest.Permission類。

+0

哦...!我已經添加了該文件,並且我已經在問題中解釋過,我可以連接到數據庫並從服務器獲取數據,但不能插入,更新或刪除數據。所以請改善你的答案。 – 2012-04-13 12:31:53