#php #android #mysql #post #android-volley
#php #Android #mysql #Публикация #android-volley
Вопрос:
Мое приложение получает название региона от mapActivity
с помощью getStringExtra
, затем включается в строку, полученную в результате текущей активности, которая General_Info
должна быть отправлена в онлайн-базу данных.
В PHP-коде нет ошибки.
Я тестировал приложение, используя Wi-Fi и data, но, к сожалению, оно всегда возвращает «fail».
Я понятия не имею, в чем проблема с моим кодом.
Прилагается мой код
StringRequest request=new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(response.contains("SUCCESS")){
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(getApplicationContext(), "fail", Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), "system error", Toast.LENGTH_SHORT).show();
error.printStackTrace();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> param=new HashMap<String, String>();
param.put("householdid",houseNo.getText().toString());
param.put("region", region);
param.put("totalmembers", totalMembers.getText().toString());
param.put("totalfemale", totalFemale.getText().toString());
param.put("totalmale", totalMale.getText().toString());
return param;
}
};
MySingleton.getInstance(General_Info.this).addToRequestQueue(request);
}
php-код:
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
include_once("connect.php");
$householdId = $_POST['householdid'];
$region = $_POST['region'];
$totalMembers = $_POST['totalmembers'];
$totalFemale = $_POST['totalfemale'];
$totalMale = $_POST['totalmale'];
$result = mysqli_query($con,"INSERT INTO households (householdId,region,totalMembers,totalFemale,totalMale)
VALUES ('$householdId',' $region','$totalMembers','$totalFemale',' $totalMale')");
if($result == true) {
echo "SUCCESS";
}
else{
echo "FAILURE ";
}
}
mysqli_close($con);
Комментарии:
1. Я думаю, вы пропустили код 🙂
2. Добавляйте журналы во все полученные ответы (Log.d) и вставляйте полученный ответ. Кроме того, используйте кнопку code при вставке своего кода, не делайте это так, как вы делали, прикрепляя картинку.
3. используйте Log для каждого введенного вами параметра, а также регистрируйте ответ..
4. Прежде всего, я предлагаю вам использовать Retrofit…it это намного проще, чем Volley. И, как говорили другие, разместите некоторые журналы с помощью
Log.d
и просмотрите свой журнал cat5. отправьте свой URL, пожалуйста, без этого, как я проверю, с какой проблемой вы столкнулись
Ответ №1:
На вашем месте я бы внес изменения в код следующим образом. Прежде всего, я использую medoo в качестве фреймворка базы данных, который действительно прост в использовании и полностью документирован. Если вы используете это, ваша вставка будет выглядеть следующим образом:
$householdId = $_POST['householdid'];
$region = $_POST['region'];
$totalMembers = $_POST['totalmembers'];
$totalFemale = $_POST['totalfemale'];
$totalMale = $_POST['totalmale'];
// $database is an object which you declared using medoo.
$result = $database->insert("households",[
"householdId" => $householdId,
"region" => $region,
"totalMembers" => $totalMembers,
"totalFemale" => $$totalFemale,
"totalMale" => $totalMale
]);
И как в документации сказано для insert:
Возврат: [число] Последний идентификатор вставки
Итак, вы просто проверяете, $result
это >= 1 или нет:
if($result >= 1) {
echo "SUCCESS";
}
else{
echo "FAILURE ";
}
Я думаю, что это будет работать как ваш сервер. И для вашего клиента это будет что-то вроде этого:
Сначала вам нужен генератор сервисов:
public class ServiceGenerator {
public static final String API_BASE_URL = "http://your.api-base.url";
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static <S> S createService(Class<S> serviceClass) {
Retrofit retrofit = builder.client(httpClient.build()).build();
return retrofit.create(serviceClass);
}
}
Затем вы должны написать свой собственный интерфейс…допустим, у нас есть ваш веб-сервис, который выглядит примерно так: http://your.api-base.url/my-service/insert.php
И ваш интерфейс:
public interface MyClient {
@POST("/myservice/insert.php")
Call<String> insert(
@Body("householdid") String householdId,
@Body("region") String region,
@Body("totalmembers") String totalMembers,
@Body("totalfemale") String totalFemale,
@Body("totalmale") String totalMale
);
}
Что ж, теперь все готово.
Для вызова метода вы должны сделать это:
MyClient client = ServiceGenerator.createService(MyClient.class);
Call<String> insertCall = client.insert(houseNo.getText().toString(),
region,
totalMembers.getText().toString(),
totalFemale.getText().toString(),
totalMale.getText().toString());
insertCall.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if(response != null amp;amp; response.isSuccessful()){
// you have a response...handle it
}
}
@Override
public void onFailure(Call<OwnerResponse> call, Throwable t) {
//PROBLEM!!!
}
}
Комментарии:
1. Спасибо @Mohammad Z 🙂 я уже решил проблему, фактически у меня была проблема со структурой моей базы данных, и все, что вы опубликовали, тоже помогло мне. Большое вам спасибо