2015-02-05 3 views
0

Я работаю над базовым Android APK, который станет базовой мобильной версией веб-сайта, который я запускаю. Часть APK позволяет пользователям регистрироваться для учетных записей пользователей (базовая регистрация). Я использую HTTPPOST для отправки информации о форме пользователя в скрипт PHP. Все мои проверки ошибок работают (совпадение паролей, длина и т. Д.), Но ответ, который я получаю от действительного представления, могу сказать, что он пытается дважды запустить PHP. APK получит сообщение об ошибке и сообщит пользователю пользователя имя пользователя и пароль, но это связано с тем, что php получает запущенные, вставляет данные, а затем по какой-то причине снова запускается, и сообщение об ошибке получает сообщение, а не просто отчет о успехе в первый раз, когда он был запущен. Если я выберу ошибку, чтобы искать дубликаты имен пользователей и электронных писем, я могу увидеть две вставки в моей базе данных. Почему страница PHP запускается дважды?Android HTTPPOST, выполняющий PHP-скрипт дважды

ШАГОВ:

  1. Очистить базы данных пользователей.
  2. Вставьте действительную регистрационную информацию (чтобы не выдавать ошибки).

РЕЗУЛЬТАТЫ

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 Side

<?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; 
} 

?>

Устройство сообщает дубликата ошибки и, как я уже говорил, получает данные вставляются так его как 'успех' не получает эхо. Ниже приведены журналы из файла 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 для меня новичок, так это неправильный путь для этого?

Благодаря

ответ

2

вы вызываете «httpclient.execute (..)» дважды:

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

удалить один из них должен решить вопрос :)

+0

У меня была та же проблема, спасибо! – garatu

0

Вам не нужно вызывать ваш AsynTask подкласс (RegisterUser) в тему, потому что это тема itselt, которая проходит из основного IU тему. Просто вызовите метод execute.

Вместо того чтобы делать:

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

Do:

   new RegisterUser().execute(""); 

Может быть, это может решить проблему.

Кроме того, вы призываете выполнить метод дважды из DefaultHttpClient объекта, первая и третья строки:

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

Спасибо за ответ, но, к сожалению, я получаю те же результаты ; создается новая учетная запись, затем php запускается снова и отбрасывает дублируемую ошибку учетной записи. – Joffroi

+0

Я только что проверил свою основную страницу регистрации (которая работает), добавив туда фиктивную команду INSERT. Разумеется, этот скрипт также запускается дважды. Итак, почему мой httppost работает с php-страницами дважды? – Joffroi

0

Ее не совсем ответ, но я преобразовал код, чтобы использовать запрос 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, чтобы изменить код ответа на массив.

Опять же, это не исправляет мою оригинальную проблему, но является рабочим альтернативным методом.