使用 PHP 和 MySQL 删除 Android 中的用户
Delete an user in Android using PHP and MySQL
我正在尝试开发一个 activity 来从 mysql table 中删除一个用户。一旦我登录到该应用程序,我希望用户在想要删除他们的帐户时单击一个按钮。当我单击该按钮时,出现以下错误:
22416-22416/etsiit.etsiitcast_def E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: etsiit.etsiitcast_def, PID: 22416
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
at java.net.Socket.connect(Socket.java:882)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at etsiit.etsiitcast_def.PerfilFragment.onClick(PerfilFragment.java:67)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这是我的删除 user.php 函数:
<?php
require_once 'connectbd.php';
// connecting to database
$this->db = new DB_Connect();
$this->db->connect();
$query = "DELETE FROM usuarios WHERE username = '$username' LIMIT 1";
mysql_query($query);
if (mysql_affected_rows() == 1) {
echo("El usuario ha sido eliminado.");
} else {
echo("Error al eliminar el usuario.");
}
?>
这是我的 Android activity 代码:
Button delete = (Button) rootView.findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = "http://"+IP_Server+"/etsiitcast_db/deleteuser.php";
HttpClient client = new DefaultHttpClient();
try {
client.execute(new HttpGet(url));
} catch(IOException e) {
//do something here
}
}
});
其中 IP_SERVER 是我的服务器地址。
告诉我是否需要更多代码。
您需要将 http 调用嵌入到 AsyncTask 中,以免被主线程处理。
在Android中,您不应该在主线程上进行网络调用。否则,UI 会冻结。为避免这种情况,Android 现在抛出 NetworkOnMainThreadException。
因此,您应该在后台进行所有网络调用。为此,您可以使用 :
- 异步任务
- 装载机
- 基本线程...
在 android 中,您不能在主线程上进行网络活动,您需要使用 AsyncTask or better way use a asynchronous networking library like Volley or Android-Async-Http 将网络 activity 移动到后台线程。我以前使用过 async-http,我认为它是 good.Below 我举一些例子可能会对你有所帮助
AsyncHttpClient client = new AsyncHttpClient();Button delete = (Button)rootView.findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
client.get("http://"+IP_Server+"/etsiitcast_db/deleteuser.php", new AsyncHttpResponseHandler() {
@Override
public void onStart() {
// called before request is started
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
// feedback to user
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
@Override
public void onRetry(int retryNo) {
// called when request is retried
}
});
});
我正在尝试开发一个 activity 来从 mysql table 中删除一个用户。一旦我登录到该应用程序,我希望用户在想要删除他们的帐户时单击一个按钮。当我单击该按钮时,出现以下错误:
22416-22416/etsiit.etsiitcast_def E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: etsiit.etsiitcast_def, PID: 22416
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
at java.net.Socket.connect(Socket.java:882)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at etsiit.etsiitcast_def.PerfilFragment.onClick(PerfilFragment.java:67)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这是我的删除 user.php 函数:
<?php
require_once 'connectbd.php';
// connecting to database
$this->db = new DB_Connect();
$this->db->connect();
$query = "DELETE FROM usuarios WHERE username = '$username' LIMIT 1";
mysql_query($query);
if (mysql_affected_rows() == 1) {
echo("El usuario ha sido eliminado.");
} else {
echo("Error al eliminar el usuario.");
}
?>
这是我的 Android activity 代码:
Button delete = (Button) rootView.findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = "http://"+IP_Server+"/etsiitcast_db/deleteuser.php";
HttpClient client = new DefaultHttpClient();
try {
client.execute(new HttpGet(url));
} catch(IOException e) {
//do something here
}
}
});
其中 IP_SERVER 是我的服务器地址。 告诉我是否需要更多代码。
您需要将 http 调用嵌入到 AsyncTask 中,以免被主线程处理。
在Android中,您不应该在主线程上进行网络调用。否则,UI 会冻结。为避免这种情况,Android 现在抛出 NetworkOnMainThreadException。
因此,您应该在后台进行所有网络调用。为此,您可以使用 :
- 异步任务
- 装载机
- 基本线程...
在 android 中,您不能在主线程上进行网络活动,您需要使用 AsyncTask or better way use a asynchronous networking library like Volley or Android-Async-Http 将网络 activity 移动到后台线程。我以前使用过 async-http,我认为它是 good.Below 我举一些例子可能会对你有所帮助
AsyncHttpClient client = new AsyncHttpClient();Button delete = (Button)rootView.findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
client.get("http://"+IP_Server+"/etsiitcast_db/deleteuser.php", new AsyncHttpResponseHandler() {
@Override
public void onStart() {
// called before request is started
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
// feedback to user
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
@Override
public void onRetry(int retryNo) {
// called when request is retried
}
}); });