Анализатор Android JSON отправляет несколько копий данных на сервер

#php #android #mysql #json

#php #Android #mysql #json

Вопрос:

В моем приложении есть экран регистрации, который отправляет регистрационные данные пользователя и отправляет их на сервер, а затем сервер сохраняет их в базе данных.

Моя проблема в том, что, когда я проверил базу данных, там было несколько копий данных. Я не знаю, создаются ли множественные копии на стороне клиента или сервера.

Я добавил скриншот базы данных, и вы можете ясно видеть, что существует несколько копий одних и тех же данных. Каждый раз, когда я нажимаю кнопку отправки на стороне клиента в моем приложении для Android, в базе данных сохраняются два одинаковых данных. Я не использовал никаких циклов, все еще он хранит две копии одних и тех же данных в базе данных.

вот мой код

 public class RegisterScreen extends Activity {

    Button reg;
    TextView tv;
    EditText fn,ln,un,pwd,mob,email;
    HttpPost httppost;
    StringBuffer buffer;
    HttpResponse response;
    HttpClient httpclient;
    List<NameValuePair> nameValuePairs;
    ProgressDialog dialog = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        reg=(Button)findViewById(R.id.reg);
        fn=(EditText)findViewById(R.id.fn);
        ln=(EditText)findViewById(R.id.ln);
        un=(EditText)findViewById(R.id.un);
        pwd=(EditText)findViewById(R.id.pwd);
        mob=(EditText)findViewById(R.id.mob);
        email=(EditText)findViewById(R.id.email);
        tv = (TextView)findViewById(R.id.tv);


        reg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog = ProgressDialog.show(RegisterScreen.this, "",
                        "Registering user...", true);
                new Thread(new Runnable() {
                    public void run() {
                        login();
                    }
                }).start();
            }
        });
    }


    void login(){
        try{

            httpclient=new DefaultHttpClient();
            httppost= new HttpPost("http://192.168.43.6/test/registration.php"); // make sure the url is correct.
            //add your data
            nameValuePairs = new ArrayList<NameValuePair>();
            // Always use the same variable name for posting i.e the android side variable name and php side variable name should be similar,
            nameValuePairs.add(new BasicNameValuePair("firstname",fn.getText().toString().trim()));
            nameValuePairs.add(new BasicNameValuePair("lastname",ln.getText().toString().trim()));
            nameValuePairs.add(new BasicNameValuePair("username",un.getText().toString().trim()));
            nameValuePairs.add(new BasicNameValuePair("password",pwd.getText().toString().trim()));
            nameValuePairs.add(new BasicNameValuePair("mob",mob.getText().toString().trim()));
            nameValuePairs.add(new BasicNameValuePair("email",email.getText().toString().trim()));// $Edittext_value = $_POST['Edittext_value'];

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            //Execute HTTP Post Request
            response=httpclient.execute(httppost);

            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            final String response = httpclient.execute(httppost, responseHandler);
            System.out.println("Response : "   response);
            runOnUiThread(new Runnable() {
                public void run() {
                    tv.setText("Response from PHP : "   response);
                    dialog.dismiss();
                }
            });

            if(response.equalsIgnoreCase("Registration")){
                runOnUiThread(new Runnable() {
                    public void run() {
                        Toast.makeText(RegisterScreen.this,"Registration Successful", Toast.LENGTH_SHORT).show();
                    }
                });

                startActivity(new Intent(RegisterScreen.this, LoginScreen.class));
            }else{
                showAlert();
            }

        }catch(Exception e){
            dialog.dismiss();
            System.out.println("Exception : "   e.getMessage());
        }
    }
    public void showAlert(){
        RegisterScreen.this.runOnUiThread(new Runnable() {
            public void run() {
                AlertDialog.Builder builder = new AlertDialog.Builder(RegisterScreen.this);
                builder.setTitle("Registration Error.");
                builder.setMessage("Problem in Registration. Please try again later")
                        .setCancelable(false)
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                            }
                        });
                AlertDialog alert = builder.create();
                alert.show();
            }
        });
    }
}
  

вот мой серверный код

 <?php
$hostname_localhost ="localhost";
$database_localhost ="testdb";
$username_localhost ="root";
$password_localhost ="";
$localhost = mysql_connect($hostname_localhost,$username_localhost,$password_localhost)
or
trigger_error(mysql_error(),E_USER_ERROR);

mysql_select_db($database_localhost, $localhost);

$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$username = $_POST['username'];
$password = $_POST['password'];
$mob = $_POST['mob'];
$email = $_POST['email'];

$query_search = "INSERT INTO register(Firstname, Lastname, loginname, pwd, Mobilenumber , emailid) VALUES('$firstname', '$lastname','$username','$password','$mob','$email')";
$query_exec = mysql_query($query_search) or die(mysql_error());
//$rows = mysql_num_rows($query_exec);
//echo $rows;
 echo "Registration";
?>
  

вот скриншот базы данныхвведите описание изображения здесь

Ответ №1:

Похоже, что ваш вызов выполняется дважды за Login() ?

 response=httpclient.execute(httppost);

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

Комментарии:

1. ваш ответ сработал отлично. Я удалил response=httpclient.execute(httppost);. Спасибо за помощь

Ответ №2:

Я не знаю, создаются ли множественные копии на стороне клиента или сервера.

Этот код вставляет новую строку при каждом запуске

 $query_search = "INSERT INTO register(Firstname, Lastname, loginname, pwd, Mobilenumber , emailid) VALUES('$firstname', '$lastname','$username','$password','$mob','$email')";
$query_exec = mysql_query($query_search) or die(mysql_error());
  

Вам нужно выбрать для существующих данных и только после этого вставить строку

Комментарии:

1. извините, но я не получил вашего ответа. Не могли бы вы, пожалуйста, объяснить это более подробно??

2. Сначала вам нужно выбрать поле, которое должно быть уникальным, например, электронное письмо. Затем запустите запрос «ВЫБЕРИТЕ 1 ИЗ, register ГДЕ emailid = ‘$email'». Если строка не существует, запустите запрос INSERT

3. я отправляю данные из приложения Android на php-сервер, чтобы он мог хранить их в базе данных, а не извлекать. Он просто должен хранить их в базе данных и ничего больше. Проблема в том, что он хранит несколько копий данных. Ваше решение сработало бы, если бы я пытался извлечь данные, а не сохранить их

4. Вы не извлекаете их, просто проверяете, существует ли строка. Другим способом вы можете сделать поле электронной почты уникальным с помощью mysql ALTER TABLE register ADD UNIQUE ( emailid )

5. Ваше решение не имеет никакого смысла. Я сохраняю значение в базе данных, тогда зачем мне нужно изменять базу данных и использовать запрос select?? Даже если я удалю все содержимое (все строки) внутри базы данных, а затем вставлю новые данные, все равно будут сохранены две копии каждых данных. Есть какие-либо предложения по этому поводу??