java, php(backend) and mysql(database)
を使用してAndroidアプリケーションを作成しました。私はバックエンドphp
コードとデータベースをLinux
ホスティングサーバーに配置しました。私の問題は、データベースからのみデータを読み取ることができます。つまり、アプリケーションがサーバーからデータを取得できますが、取得したデータを変更できず、サーバーを使用して実行するとエラーが発生します。ローカルシステムにデータベースとコードを配置すると、ローカルホスト上では完全に動作しますが、サーバーに配置するとデータを読み取ることはできますが、insert, update or delete
のデータは読み取れません。私はすでにサーバーのデータベースに完全な権限を与えています。誰もこの側面に関して私を助けてくれますか? 私はサーバがモバイルのような外部者からのリクエストを受け入れないと思います。だから私の質問はアンドロイドでウェブサービスのすべての権限を取得する方法は?
what do we need to do such that the server accepts requests from mobile side?
PSです:私は、サーバー内のデータベースへの完全な権限を与えているとも私は、Androidマニフェストファイルにインターネットのアクセス許可を追加しました。
@Lieライアン:あなたの要求を1として、ここで私のサーバーに接続するためのコードです:
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);
?>
感謝。アプリケーションは、あなたのAndroidマニフェストファイル(AndroidManifest.xmlに)に "android.permission.INTERNETあなたの許可を設定する必要がネットワークソケットを開くことができるように
あなたはサーバー側でリクエストを処理するために使用しているコードの小さなサンプルと、リクエストに使用しているコードをトリミングすることができます。また、サーバー側のデータベースユーザーのアクセス許可を確認してみてください。 Webサービスを書くときに覚えておかなければならないことの1つは、要求の形式がサーバーの予期しているものと一致している限り、サーバーは要求の出所を気にしないということです。 –
@LieRyan今質問をチェックしてください。私は確かにコードには問題はないが、サーバーで行う必要があることがあると言うことができますが、私のコードを投稿した要求に応じて。 –
ありがとう、JSON文字列を解析するコードの部分を一時的に削除(コメントアウト)する代わりに、単に 'responseBody'(logcatまたは画面上のテキストビュー)を表示して、再実行してください。応答はあなたが期待しているものですか?次に、 'include"の直後に 'print($ _ POST [" statement "])'と 'print($ _ POST [" query "]);を追加します。ステートメントとクエリ文字列がPHPスクリプトに到達しますか?もしそうなら、おそらくMySQLの部分ではエラーになります。 'mysql_query()'と 'mysql_fetch_array()'の周りに 'print(mysql_error());'を振ってみてください。 –