Android HTTPPOST 执行 PHP 脚本两次
Android HTTPPOST executing PHP script twice
我正在开发一个基本的 Android APK,它将成为我 运行 网站的基本移动版本。 APK 的一部分使人们能够注册用户帐户(基本注册)。我正在使用 HTTPPOST 将用户表单信息发送到 PHP 脚本。我所有的错误检查都有效(密码匹配、长度等),但是我从有效提交中得到的响应,我可以告诉它尝试 运行 和 PHP 两次。 APK 将收到一条错误消息并告诉用户用户名和密码已被占用,但这是因为 php 获取 运行 的,插入数据,然后由于某种原因 运行s 并报告错误捕获,而不是第一次报告成功 运行。如果我取出错误捕获以查找重复的用户名和电子邮件,我可以在我的数据库中看到两个插入。为什么 PHP 页面得到 运行 两次?
步骤:
- 清除用户数据库。
- 插入有效的注册信息(以免引发错误)。
结果
APK 显示错误消息,指出用户名和密码已被占用。 SQL 数据库显示表单中的信息已被插入。
文件
我将日志记录放入我的 APK 中,它似乎只调用一次 HTTPPOST。下面是 JAVA 文件和 PHP 页面。对此的任何煽动将不胜感激。
JAVA 文件
Register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Registration: ", "Button Pressed");
dialog = ProgressDialog.show(Register.this, "",
"Creating account...", true);
new Thread(new Runnable() {
public void run() {
new RegisterUser().execute("");
}
}).start();
}
});
}
private class RegisterUser extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg0) {
try {
httpclient = new DefaultHttpClient();
// This is the page that will get all the information to create the account
HTTPPOST = new HttpPost("http://www.linetomyphppage.php");
NAMEVALUEPAIRS = new ArrayList<NameValuePair>();
NAMEVALUEPAIRS.add(new BasicNameValuePair("username",username.getText().toString().trim())); // $Edittext_value = $_POST['Edittext_value'];
NAMEVALUEPAIRS.add(new BasicNameValuePair("userEmail",emailaddress.getText().toString().trim()));
NAMEVALUEPAIRS.add(new BasicNameValuePair("password1",password1.getText().toString().trim()));
NAMEVALUEPAIRS.add(new BasicNameValuePair("password2",password2.getText().toString().trim()));
NAMEVALUEPAIRS.add(new BasicNameValuePair("newsletter",subscribe));
HTTPPOST.setEntity(new UrlEncodedFormEntity(NAMEVALUEPAIRS));
HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);
Log.d("Registration: ", "Executing Post");
errorcode = response;
// Redirect the user depending on the response
if (response.equalsIgnoreCase("success")) {
// Toast.makeText(Register.this, "Registration successful", Toast.LENGTH_SHORT).show();
Log.d("Registration: ", "Registration successful");
valid = "Successful";
} else {
Log.d("Registration: ", "Registration failed");
valid = "Invalid";
// Toast.makeText(Register.this, "Registration failed: " + response, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
System.out.println("Exception here : " + e);
}
dialog.dismiss();
return "Executed";
}
@Override
protected void onPostExecute(String result){
if(valid.equalsIgnoreCase("Invalid")){
Log.d("Registration: ", "Error generated");
String code = errorcode.replace("Invalid","");
Toast.makeText(Register.this, "Registration failed: " + code, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(Register.this, "Registration successful", Toast.LENGTH_SHORT).show();
startActivity(new Intent(Register.this, HomeScreen.class));
finish();
}
}
}
PHP边
<?php
// Connecting to database
$connect = $_SERVER['DOCUMENT_ROOT'];
$connect .= "pathtoconnect.php";
include_once($connect);
// Get all the variables being passed from the APK
$username = mysql_real_escape_string($_POST['username']);
$password1 = mysql_real_escape_string($_POST['password1']);
$password2 = mysql_real_escape_string($_POST['password2']);
$email = mysql_real_escape_string($_POST['userEmail']);
$newsletter = mysql_real_escape_string($_POST['newsletter']);
$pass = 1;
$error = false;
// Check if the username is valid.
if (preg_match('/[^0-9a-z-_]/i', $username) == 1) {
$error = 'You can not use spaces or strange characters in a usermame.';
$pass = 0;
}
if(strlen($username) < 5) { // Ensure the length is at least 5
$error = 'Username must be at least 5 characters.';
$pass= 0 ;
}
if(strlen($password1) < 5) { // Ensure the length is at least 5
$error = 'Passwords have to be at least slightly challenging (5+ characters).';
$pass= 0 ;
}
if($password1 != $password2) { // Check for passwords to match
$error = "Your passwords did not match. Please try again.";
$pass= 0 ;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { // Check to make sure email address is valid
$error = "The email address you entered is not valid. Double check it.";
$pass= 0 ;
}
// check if username or email is already in use
$checking = mysql_query("SELECT COUNT(user_id) AS total FROM users WHERE username='$username' OR email='$email'");
$checking = mysql_fetch_array($checking);
if($checking['total'] > 0) {
$error = 'The username or email you are trying to use is already in use. Please go to the website if you forgot your password to reset it.';
$pass= 0 ;
}
if(!$error) {
echo 'success';
$time = time();
mysql_query("INSERT INTO users (username, password, email, date_created, subscription) VALUES ('$username', md5('$password1'), '$email', '$time', '$subscribe')");
}
else {
echo 'Invalid'.$error;
}
?>
设备正在报告重复错误,正如我所提到的,数据已插入,因此 'success' 不会得到回显。
下面是来自 JAVA 文件的日志,显示它只得到失败的响应。
02-04 22:31:37.442 26159-26159/com.demo D/Registration:﹕ Button Pressed
02-04 22:31:37.862 26159-26559/com.demo D/Registration:﹕ Executing Post
02-04 22:31:37.862 26159-26559/com.demo D/Registration:﹕ Registration failed
02-04 22:31:37.872 26159-26159/com.demo D/Registration:﹕ Error generated
我构建了一个基本的 html 表单来传递数据,该方法运行良好,执行了 php 一次,所以我不知所措。 Android/JAVA 对我来说是新手,所以这是实现此目标的错误途径吗?
谢谢
您不需要将您的 AsynTask 子类 (RegisterUser) 调用到线程中,因为它本身就是一个线程,它在主 IU 线程之外运行。直接调用execute方法即可。
而不是做:
new Thread(new Runnable() {
public void run() {
new RegisterUser().execute("");
}
}).start();
做:
new RegisterUser().execute("");
也许它可以解决问题。
此外,您从 DefaultHttpClient 对象调用了两次执行方法,第一行和第三行:
HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);
这不是一个真正的答案,但我将代码转换为使用 JSON 请求而不是 httppost 方法,并且效果更好。
Log.d("JSON", "Running the JSON script");
JSONObject json = jsonParser.makeHttpRequest(url_register, "POST", params);
//Getting specific Response
try {
RESPONSE_STATUS = json.getInt("success");
RESPONSE_MESSAGE = json.getString("message");
} catch (JSONException e) {
RESPONSE_MESSAGE = "An error has occured during the registration";
e.printStackTrace();
}
Log.d("JSON", json.toString());
Log.d("Registration: ", "Response Status: " + RESPONSE_STATUS);
Log.d("Registration: ", "Response: " + RESPONSE_MESSAGE);
// Redirect the user depending on the response
if (RESPONSE_STATUS == 1) {
Log.d("Registration: ", "Registration successful");
valid = "Successful";
} else {
Log.d("Registration: ", "Registration failed");
valid = "Invalid";
}
这确实需要完全重写 php 以将响应代码更改为数组。
同样,这并没有解决我原来的问题,而是一种可行的替代方法。
您正在呼叫 "httpclient.execute(..)" 两次:
HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);
删除其中一个应该可以解决您的问题:)
我正在开发一个基本的 Android APK,它将成为我 运行 网站的基本移动版本。 APK 的一部分使人们能够注册用户帐户(基本注册)。我正在使用 HTTPPOST 将用户表单信息发送到 PHP 脚本。我所有的错误检查都有效(密码匹配、长度等),但是我从有效提交中得到的响应,我可以告诉它尝试 运行 和 PHP 两次。 APK 将收到一条错误消息并告诉用户用户名和密码已被占用,但这是因为 php 获取 运行 的,插入数据,然后由于某种原因 运行s 并报告错误捕获,而不是第一次报告成功 运行。如果我取出错误捕获以查找重复的用户名和电子邮件,我可以在我的数据库中看到两个插入。为什么 PHP 页面得到 运行 两次?
步骤:
- 清除用户数据库。
- 插入有效的注册信息(以免引发错误)。
结果
APK 显示错误消息,指出用户名和密码已被占用。 SQL 数据库显示表单中的信息已被插入。
文件
我将日志记录放入我的 APK 中,它似乎只调用一次 HTTPPOST。下面是 JAVA 文件和 PHP 页面。对此的任何煽动将不胜感激。
JAVA 文件
Register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Registration: ", "Button Pressed");
dialog = ProgressDialog.show(Register.this, "",
"Creating account...", true);
new Thread(new Runnable() {
public void run() {
new RegisterUser().execute("");
}
}).start();
}
});
}
private class RegisterUser extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg0) {
try {
httpclient = new DefaultHttpClient();
// This is the page that will get all the information to create the account
HTTPPOST = new HttpPost("http://www.linetomyphppage.php");
NAMEVALUEPAIRS = new ArrayList<NameValuePair>();
NAMEVALUEPAIRS.add(new BasicNameValuePair("username",username.getText().toString().trim())); // $Edittext_value = $_POST['Edittext_value'];
NAMEVALUEPAIRS.add(new BasicNameValuePair("userEmail",emailaddress.getText().toString().trim()));
NAMEVALUEPAIRS.add(new BasicNameValuePair("password1",password1.getText().toString().trim()));
NAMEVALUEPAIRS.add(new BasicNameValuePair("password2",password2.getText().toString().trim()));
NAMEVALUEPAIRS.add(new BasicNameValuePair("newsletter",subscribe));
HTTPPOST.setEntity(new UrlEncodedFormEntity(NAMEVALUEPAIRS));
HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);
Log.d("Registration: ", "Executing Post");
errorcode = response;
// Redirect the user depending on the response
if (response.equalsIgnoreCase("success")) {
// Toast.makeText(Register.this, "Registration successful", Toast.LENGTH_SHORT).show();
Log.d("Registration: ", "Registration successful");
valid = "Successful";
} else {
Log.d("Registration: ", "Registration failed");
valid = "Invalid";
// Toast.makeText(Register.this, "Registration failed: " + response, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
System.out.println("Exception here : " + e);
}
dialog.dismiss();
return "Executed";
}
@Override
protected void onPostExecute(String result){
if(valid.equalsIgnoreCase("Invalid")){
Log.d("Registration: ", "Error generated");
String code = errorcode.replace("Invalid","");
Toast.makeText(Register.this, "Registration failed: " + code, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(Register.this, "Registration successful", Toast.LENGTH_SHORT).show();
startActivity(new Intent(Register.this, HomeScreen.class));
finish();
}
}
}
PHP边
<?php
// Connecting to database
$connect = $_SERVER['DOCUMENT_ROOT'];
$connect .= "pathtoconnect.php";
include_once($connect);
// Get all the variables being passed from the APK
$username = mysql_real_escape_string($_POST['username']);
$password1 = mysql_real_escape_string($_POST['password1']);
$password2 = mysql_real_escape_string($_POST['password2']);
$email = mysql_real_escape_string($_POST['userEmail']);
$newsletter = mysql_real_escape_string($_POST['newsletter']);
$pass = 1;
$error = false;
// Check if the username is valid.
if (preg_match('/[^0-9a-z-_]/i', $username) == 1) {
$error = 'You can not use spaces or strange characters in a usermame.';
$pass = 0;
}
if(strlen($username) < 5) { // Ensure the length is at least 5
$error = 'Username must be at least 5 characters.';
$pass= 0 ;
}
if(strlen($password1) < 5) { // Ensure the length is at least 5
$error = 'Passwords have to be at least slightly challenging (5+ characters).';
$pass= 0 ;
}
if($password1 != $password2) { // Check for passwords to match
$error = "Your passwords did not match. Please try again.";
$pass= 0 ;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { // Check to make sure email address is valid
$error = "The email address you entered is not valid. Double check it.";
$pass= 0 ;
}
// check if username or email is already in use
$checking = mysql_query("SELECT COUNT(user_id) AS total FROM users WHERE username='$username' OR email='$email'");
$checking = mysql_fetch_array($checking);
if($checking['total'] > 0) {
$error = 'The username or email you are trying to use is already in use. Please go to the website if you forgot your password to reset it.';
$pass= 0 ;
}
if(!$error) {
echo 'success';
$time = time();
mysql_query("INSERT INTO users (username, password, email, date_created, subscription) VALUES ('$username', md5('$password1'), '$email', '$time', '$subscribe')");
}
else {
echo 'Invalid'.$error;
}
?>
设备正在报告重复错误,正如我所提到的,数据已插入,因此 'success' 不会得到回显。 下面是来自 JAVA 文件的日志,显示它只得到失败的响应。
02-04 22:31:37.442 26159-26159/com.demo D/Registration:﹕ Button Pressed
02-04 22:31:37.862 26159-26559/com.demo D/Registration:﹕ Executing Post
02-04 22:31:37.862 26159-26559/com.demo D/Registration:﹕ Registration failed
02-04 22:31:37.872 26159-26159/com.demo D/Registration:﹕ Error generated
我构建了一个基本的 html 表单来传递数据,该方法运行良好,执行了 php 一次,所以我不知所措。 Android/JAVA 对我来说是新手,所以这是实现此目标的错误途径吗?
谢谢
您不需要将您的 AsynTask 子类 (RegisterUser) 调用到线程中,因为它本身就是一个线程,它在主 IU 线程之外运行。直接调用execute方法即可。
而不是做:
new Thread(new Runnable() {
public void run() {
new RegisterUser().execute("");
}
}).start();
做:
new RegisterUser().execute("");
也许它可以解决问题。
此外,您从 DefaultHttpClient 对象调用了两次执行方法,第一行和第三行:
HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);
这不是一个真正的答案,但我将代码转换为使用 JSON 请求而不是 httppost 方法,并且效果更好。
Log.d("JSON", "Running the JSON script");
JSONObject json = jsonParser.makeHttpRequest(url_register, "POST", params);
//Getting specific Response
try {
RESPONSE_STATUS = json.getInt("success");
RESPONSE_MESSAGE = json.getString("message");
} catch (JSONException e) {
RESPONSE_MESSAGE = "An error has occured during the registration";
e.printStackTrace();
}
Log.d("JSON", json.toString());
Log.d("Registration: ", "Response Status: " + RESPONSE_STATUS);
Log.d("Registration: ", "Response: " + RESPONSE_MESSAGE);
// Redirect the user depending on the response
if (RESPONSE_STATUS == 1) {
Log.d("Registration: ", "Registration successful");
valid = "Successful";
} else {
Log.d("Registration: ", "Registration failed");
valid = "Invalid";
}
这确实需要完全重写 php 以将响应代码更改为数组。
同样,这并没有解决我原来的问题,而是一种可行的替代方法。
您正在呼叫 "httpclient.execute(..)" 两次:
HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);
删除其中一个应该可以解决您的问题:)