简体   繁体   English

Android HTTPPOST执行两次PHP脚本

[英]Android HTTPPOST executing PHP script twice

I'm working on a basic Android APK that is going to be a basic mobile version of a website I run. 我正在开发一个基本的Android APK,它将成为我运行的网站的基本移动版本。 A portion of the APK enables people to sign up for users accounts (basic registration). APK的一部分使人们可以注册用户帐户(基本注册)。 I'm using HTTPPOST to send the user form information to a PHP script. 我正在使用HTTPPOST将用户表单信息发送到PHP脚本。 All my error checks work (password match, length, etc), but the response I'm getting from a valid submission, I can tell its trying to run the PHP twice. 我所有的错误检查都能正常工作(密码匹配,长度等),但是从有效提交中得到的响应中,我可以告诉它尝试两次运行PHP。 The APK will get an error message and tell the user the user the username and password have been taken, but this is because the php gets run ones, inserts the data, then for some reason runs again and the error catch gets reported instead of just reporting back success the first time it was run. APK会收到一条错误消息,并告诉用户已使用了用户名和密码,但这是因为php获得了运行用户名和密码,然后插入了数据,然后由于某种原因再次运行了,并且报告了错误捕获,而不仅仅是在首次运行时报告成功。 If I take out the error catch to look for duplicate usernames and emails, I can see two inserts in my database. 如果取出错误捕获以查找重复的用户名和电子邮件,则可以在数据库中看到两个插入。 Why is the PHP page getting run twice? 为什么PHP页面两次运行?

STEPS: 脚步:

  1. Clear users database. 清除用户数据库。
  2. Insert valid registration information (to not throw errors). 插入有效的注册信息(以免出错)。

RESULTS 结果

APK gets displayed error message saying username and password have been taken. APK收到显示错误消息,提示已使用用户名和密码。 SQL database shows that the information from the form have been inserted. SQL数据库显示已插入表单中的信息。

FILES 档案

I put logging in my APK and it seems to only call the HTTPPOST once. 我将登录记录在APK中,似乎只调用一次HTTPPOST。 Below is the JAVA file and PHP page. 以下是JAVA文件和PHP页面。 Any incite on this would be appreciated. 任何煽动将不胜感激。

JAVA File 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 Side 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;  
}

?> ?>

The device is reporting the duplicate error and as I mentioned, the data gets inserted so its like 'success' isn't getting echoed. 该设备正在报告重复错误,并且正如我提到的那样,数据已插入,因此不会像“成功”那样被回显。 Below is the logs from the JAVA file that show its only getting the failed response. 以下是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

I built a basic html form to pass the data and that method works well, executes the php onces so I'm at a loss. 我建立了一个基本的html表单来传递数据,该方法效果很好,一次执行了php,所以我很茫然。 Android/JAVA is new to me so is this the wrong route to accomplish this? Android / JAVA对我来说是新手,所以这是实现此目的的错误途径吗?

Thanks 谢谢

you are calling "httpclient.execute(..)" twice: 您两次调用“ httpclient.execute(..)”:

HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);

remove one of them should solve your issue :) 删除其中之一应该可以解决您的问题:)

You don't need to call your AsynTask subclass (RegisterUser) into a Thread because it is a Thread itselt, that runs out of the main IU Thread. 您不需要将AsynTask子类(RegisterUser)调用到线程中,因为它是一个线程itelt,它耗尽了主要的IU线程。 Just call execute method. 只需调用execute方法。

Instead of doing: 而不是做:

new Thread(new Runnable() {
            public void run() {
                new RegisterUser().execute("");
            }
        }).start();

Do: 做:

                new RegisterUser().execute("");

May be it could fix the problem. 可能可以解决问题。

Also, you are calling execute method twice from DefaultHttpClient object, first and third lines: 此外,您将从DefaultHttpClient对象的第一行和第三行调用两次execute方法:

HTTPRESPONSE = httpclient.execute(HTTPPOST);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(HTTPPOST, responseHandler);

Its not really an answer, but I converted the code to use JSON request instead of the httppost method and it works much better. 它不是一个真正的答案,但是我将代码转换为使用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";
            }

This did take a complete re-write of the php to change the response code to an array. 确实需要完全重写php才能将响应代码更改为数组。

Again, this doesn't fix my original issue, but is a working alternative method. 同样,这不能解决我的原始问题,但是是一种可行的替代方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM