java - Android 应用程序不在 WAMP 数据库中保存数据

标签 java php android mysql wamp

用户必须通过点击 map 来添加标记。我的目标是将名称、类别、纬度和经度发送到 SQL 数据库。我遵循了本教程:https://www.youtube.com/watch?v=cOsZHuu8Qog .该应用程序运行正常,它甚至得到一个 toast “注册成功!”,但数据库仍然是空的

此外,我的应用程序和 WampServer 之间的通信可能有问题。我想知道连接 URL 是否正确。我在 Internet 上发现 默认 WAMP 本地主机 IP 是 10.0.2.2 或者它可以使用我 PC 的本地 IP。两者均无效。

查看代码:

AddShopActivity.java

public class AddShopActivity extends MainScreen implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener {

Spinner spinner;
ArrayAdapter<CharSequence> adapter;


GoogleMap mGoogleMap;
GoogleApiClient mGoogleApiClient;

String Name, Category, Latitude, Longitude;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_shop);
    initMap();
    spinner = (Spinner) findViewById(R.id.spinner);
    adapter = ArrayAdapter.createFromResource(this, R.array.eidoskatastimatos, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
}

private void initMap() {
    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
    mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    mGoogleApiClient.connect();
}

LocationRequest mLocationsRequest;

@Override
public void onConnected(Bundle bundle) {
    mLocationsRequest = LocationRequest.create();
    mLocationsRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationsRequest.setInterval(5000);
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationsRequest, this);


    mGoogleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng latLng) {

            EditText shop_name = (EditText)findViewById(R.id.editName);
            Spinner shop_category = (Spinner)findViewById(R.id.spinner);

            MarkerOptions marker = new MarkerOptions()
                                       .position(new LatLng(latLng.latitude, latLng.longitude))
                                       .draggable(true)
                                       .title(shop_name.getText().toString())
                                       .snippet(shop_category.getSelectedItem().toString());


            CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, 16);
            mGoogleMap.animateCamera(update);

            mGoogleMap.clear();
            mGoogleMap.addMarker(marker);

            Name = shop_name.getText().toString();
            Category = shop_category.getSelectedItem().toString();
            Latitude = String.valueOf(latLng.latitude);
            Longitude = String.valueOf(latLng.longitude);
        }
    });

}

public void shopReg(View view)
{
    String method = "save";
    BackgroundTask backgroundTask = new BackgroundTask(this);
    backgroundTask.execute(method, Name, Category, Latitude, Longitude);
    finish();
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

@Override
public void onLocationChanged(Location location) {
    if (location == null){
        Toast.makeText(this, "Can't get current location", Toast.LENGTH_LONG).show();
    } else {
        LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 16);
        mGoogleMap.animateCamera(update);
    }

}
}

BackgroundTask.java

public class BackgroundTask extends AsyncTask<String,Void,String> {


Context ctx;

BackgroundTask(Context ctx)
{
    this.ctx = ctx;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {
    String reg_url = "http://10.0.2.2/shop/register.php";
    String method = params[0];
    if(method.equals("save"))
    {
        String Name = params[1];
        String Category = params[2];
        String Latitude = params[3];
        String Longitude = params[4];
        try {
            URL url = new URL(reg_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            OutputStream OS = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS, "UTF-8"));
    String data = URLEncoder.encode("Name", "UTF-8") +"="+URLEncoder.encode(Name,"UTF-8")+"&"+
            URLEncoder.encode("Category", "UTF-8") +"="+URLEncoder.encode(Category,"UTF-8")+"&"+
            URLEncoder.encode("Latitude", "UTF-8") +"="+URLEncoder.encode(Latitude,"UTF-8")+"&"+
            URLEncoder.encode("Longitude", "UTF-8") +"="+URLEncoder.encode(Longitude,"UTF-8");
            bufferedWriter.write(data);
            bufferedWriter.flush();
            bufferedWriter.close();
            OS.close();
            InputStream IS = httpURLConnection.getInputStream();
            IS.close();
            return "Το κατάστημα προστέθηκε!";
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    return null;
}

@Override
protected void onProgressUpdate(Void... values) {
    super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(String result) {
    Toast.makeText(ctx,result,Toast.LENGTH_LONG).show();
}
}

初始化文件

<?php
$db_name="shops";
$mysql_user="root";
$mysql_pass="";
$server_name="localhost";

$con = mysqli_connect($server_name,$mysql_user,$mysql_pass,$db_name);

?>

register.php

<?php
require"init.php";

$shop_name=$_POST["Name"];
$shop_category=$_POST["Category"];
$shop_latitude=$_POST["Latitude"];
$shop_longitude=$_POST["Longitude"];

$sql_query="insert into shop_info values('$shop_name','$shop_category','$shop_latitude','$shop_longidude');";

?>

最佳答案

假设后端 (php) 代码正是您在此示例中提供的代码,您实际上从未执行任何保存任何内容的代码,所以难怪您的数据库是空的。

您的代码现在做什么:

  • init.php 中准备连接
  • 通过在 register.php 中的字符串中插入用户提供的数据来准备 SQL 查询的字符串表示(哎呀,阅读下文)

缺少什么:

  • 执行查询以实际处理数据,即 mysqli_query($conn, $sql_query);
  • 了解 SQL injection
  • 在 PHP 脚本中实现一种避免 SQL 注入(inject)的正确方法(即 prepared statements)
  • (可选但推荐)使用现代 PDO interface访问数据库。

作为一般性建议,您的目标应该是将复杂的代码分解为可测试的小部分,您可以验证它们是否正常工作。

例如,如果您尝试使用实际值而不是来自 POST 数据的值来调用 register.php,您很快就会发现它没有保存任何内容,而是查看 IP、连接或您的 android 代码。你得到的评论是在那个方向 - 忘掉你的 android 应用程序并尝试验证后端在请求进入后保存它。

关于java - Android 应用程序不在 WAMP 数据库中保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46382614/

相关文章:

java - Admob 原生快捷广告

java - 正则表达式(JAVA)

java - 什么是NullPointerException,我该如何解决?

php - 当用户使用我的网站时,如何在用户浏览器中使用 php 启用 cookie

php - 为什么这有效 : if ( isset($var) && $var ){

android - GPGPU Android 模拟器 (Renderscript/OpenCL)

java - 单表策略在 Hibernate 中不起作用

java - 在 FILE 类中获取空指针异常

javascript - Body onload 脚本在 PHP 之前执行 PHP 脚本

android - 均匀缩放线性布局中的图像