2013-07-24 24 views
3

我爲Android設備編寫了一個程序,它將呼叫日誌發送到我的主機中的數據庫。我使用httpPost方法來做到這一點,另一方面我有一個PHP代碼。我的PHP代碼中的錯誤,當我用httpPost從android設備中調用它時

當我嘗試運行要求這個代碼我在此得到一個頁面主要是我看到這一點:

500 Internal Server Error 

和​​我給這個錯誤:

PHP Startup: Suhosin Extension does not officially support PHP 5.2 and below anymore, because it is discontinued. Use it at your own risk. in Unknown on line 0 

我的主機提供商不要不允許我直接更改php.ini文件。

我的一些PHP代碼方:

function callLogSyncToCount() 
{ 
global $serverAddress, $DBusername, $DBpassword, $DBname; 
$userID = $_POST['userID']; 
$data = $_POST['data']; 
$logs = explode('`second`', $data); 
foreach($logs as $item) 
{ 
    //list($number, $duration, $date, $type) = explode("`first`", $item); 

    $counter = 0; 

    $con = mysql_connect($serverAddress, $DBusername, $DBpassword) or die (mysql_error()); 
    if (!$con) 
    { 
     die('Could not connect: ' . mysql_error()); 
     return false; 
    } 
    mysql_select_db($DBname, $con);mysql_query("SET NAMES 'utf8'"); 
    $result = mysql_query("SELECT * FROM `call_log` WHERE `user_id` = '".$userID."' AND `number` = '".$number."' AND `date` = '".$date."' AND `type` = '".$type."'") or die (mysql_error()); 
    while($row = mysql_fetch_array($result)) 
    { 
     $counter++; 
    } 
    if ($counter < 1) 
    { 
     mysql_query("INSERT INTO `call_log`(`user_id`, `date`, `duration`, `number`, `type`) VALUES ('".$userID."', '".$date."', '".$duration."', '".$number."', '".$type."')") or die (mysql_error()); 
    } 
    mysql_close($con) or die (mysql_error()); 
} 
return true; 

}

我的一些androide端代碼:

private class SyncToCount extends AsyncTask<String, Void, String> { 
    @SuppressLint("SimpleDateFormat") 
    @Override 
    protected String doInBackground(String... param) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(param[0]); 
     SimpleDateFormat mySQLFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     mySQLFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
     long ID = Long.parseLong(param[1]); 
     List<callLogType> calls = new ArrayList<CallLogUtility.callLogType>(); 

     calls = getCallList(); 
     String sendStr = ""; 
     globalVars.syncLogSize = calls.size(); 
     try { 
      int j = 0; 
      for(int i = 0; i < calls.size() && j < 20; i++) 
      {   
       if(calls.get(i).ID <= ID) 
        continue; 
       j++; 
       sendStr += calls.get(i).PhoneNumber + "`first`"; 
       sendStr +=Integer.toString(calls.get(i).Duration)+ "`first`"; 
       Date newDate = new SimpleDateFormat("d MMM yyyy hh:mm:ss z").parse(calls.get(i).Date); 
       sendStr +=mySQLFormat.format((newDate))+ "`first`"; 
       sendStr +=Integer.toString(calls.get(i).Type)+ "`second`"; 
       globalVars.syncLogUntil+=1; 
      } 

     } catch (Exception e) { 

     } 
     try 
     { 
      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("syncType", "calllogtocount")); 
      nameValuePairs.add(new BasicNameValuePair("userID", param[1])); 
      nameValuePairs.add(new BasicNameValuePair("data", sendStr)); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      @SuppressWarnings("unused") 
      HttpResponse response = httpclient.execute(httppost); 

      BufferedReader in = new BufferedReader 
      (new InputStreamReader(response.getEntity().getContent())); 
      StringBuffer sb = new StringBuffer(""); 
      String line = ""; 
      String NL = System.getProperty("line.separator"); 
      while ((line = in.readLine()) != null) { 
       sb.append(line + NL); 
      } 
      in.close(); 
     } 
     catch(Exception ex) 
     { 
     } 
     return null; 
    }  
} 

這個代碼不工作,但我的日誌中的代碼作品從這個android代碼和那個服務器以及php和數據庫中正確使用這樣的語法。

幫助我,我絲毫含糊PHP和Android ...

+0

是否已將註釋$ item變量的行註釋到相關值的列表中?或者您是否在查找錯誤的同時完成了此操作? –

+1

沒有這個代碼是我的最終代碼,並在Android端發送一個字符串和白細胞分裂我得到部分 –

回答

1

我在這裏的直覺是,你還沒有初始化,您正在使用的變量,這是不安的事情。我沒有關注命名變量來自哪裏,我假設這裏沒有Register_globals(希望不是)。如果你是這樣,它會解釋爲什麼系統檢查使用PHP版本的錯誤,雖然我認爲這只是註釋掉的一行的副作用。

我的進一步直覺是擔心非轉置數據被放入SQL語句中,但如果使用mysql_real_escape_string()可能會分心,那麼它應該防止(故意的)不良用戶數據,因爲它不是。我想知道,如果你能觸發錯誤(或者導致像SQL注入這樣的其他錯誤),你是否發送了格式錯誤的數據(從表單中)?

您是否使用基本表單測試了PHP,該表單完全按照您的期望提交數據?這將允許您將輸出數據調試到文件或屏幕以查看發生了什麼,但從這裏看,PHP代碼需要使用$ _POST中的值明確設置的變量。

它在我看來像變量需要填充,但由於列表行已被註釋掉,這是不會發生,這可能會讓你與未初始化的變量,這可能會或可能不會讓你感到不安。

除此之外,如果你阻止註釋掉foreach中的代碼它是否會返回true?如果是,那麼我可能是對的,問題在那裏,所以一點點地回過頭來,直到錯誤拋出。如果不是那麼它是外面的,你已經從你的詢問中消除了你的代碼的一半。

我希望能給你一些東西。一切順利找到你的困境的來源。

+0

問題解決,這是服務器端的錯誤,有時我得到它,並通過更改它解決了服務器提供商。 –

相關問題