Android应用程序不会将数据保存到WAMP数据库中
用户必须通过点击地图来添加标记。我的目标是将名称,类别,纬度和经度发送到SQL数据库。我遵循这个教程:https://www.youtube.com/watch?v=cOsZHuu8Qog。该应用程序的作品,它甚至得到toast
,“注册成功!”但数据库仍为空。Android应用程序不会将数据保存到WAMP数据库中
也,也许我的应用程序和WampServer之间的通信有问题。我想知道连接网址是否正确。我在互联网上发现,默认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();
}
}
的init.php
<?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
- 连接准备通过将用户的SQL查询字符串表示提供的数据串在
register.php
(哎哟,阅读下面)
缺少什么:
- 执行查询真正做到对数据进行处理,即
mysqli_query($conn, $sql_query);
- 学习一下SQL injection
- 实施的适当方式,以避免在PHP脚本SQL注入一个(即prepared statements)
- (可选但推荐)使用现代的PDO interface来访问数据库。
作为一般性建议,您应该将复杂的代码分解为小的可测试部件,您可以验证它们是否正常工作。
例如,您是否尝试用实际值调用register.php
而不是那些来自POST
数据的数据,您很快就会发现它不保存任何内容,而不是查看IP,连接或Android代码。你得到的评论是在这个方向 - 忘记你的Android应用程序,并尝试验证后端保存请求一旦进来。
它的工作! mysqli_query($ conn,$ sql_query)'在'register.php'中。谢谢! –
嗨,好像你在这里有多个问题。 首先检查移动应用程序和托管的WampServer是否位于同一网络上。然后使用类似于Postman的工具来验证您的注册端点是否工作正常。澄清两者后,我们尝试解决移动应用程序问题。 –
@Ruchira Randana我使用android Studio的默认模拟器。关于“邮差”工具,那是什么?我从来没有用过它。我在哪里可以找到它? –
邮差是和Chrome的附加组件。您可以使用它来测试您的Web服务。还有许多其他类似的工具,例如CURL。 https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en –