1

La cosa es que estoy haciendo un proyecto el cual debe registrar usuarios pero al instalar la app en mi móvil solo aparece un Toast diciendo**"Registro exitoso"** y al revisar mi base de datos veo que no insertó registros, he estado investigando y no encuentro solución. Ya intenté agregando ACCESS_NETWORK_STATE y usesCleartextTraffic=true en el manifest.

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ejecutarServicio("http://192.168.0.2:80/app/register.php");
            }
        });
    }

    public void llamaHome(){
        Intent intent=new Intent(this,home.class);
        startActivity(intent);
    }

    private void ejecutarServicio(String URL){
        StringRequest stringRequest=new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Toast.makeText(getApplicationContext(), "Registro exitoso", Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> parametros=new HashMap<String, String>();
                parametros.put("nombre", nombre.getText().toString());
                parametros.put("apellidos", apellido.getText().toString());
                parametros.put("direccion", direccion.getText().toString());
                parametros.put("correo", correo.getText().toString());
                parametros.put("contrasenia", contraseña.getText().toString());
                return parametros;
            }
        };
        RequestQueue requestQueue=Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }
}

Ya intenté con diferentes consultas en php y actualmente tengo este.

<?php

$host="localhost";
$bd="deposito_cerveza_botana";
$pass="";
$user="root";

   $nom=$_POST['nombre'];
   $ap=$_POST['apellidos'];
   $dir=$_POST['direccion'];
   $correo=$_POST['correo'];
   $cont=$_POST['contrasenia'];

   $conexion=mysqli_connect($host,$user,$pass,$bd);

   $insert="INSERT INTO usuario(nombre, apellidos, direccion, correo, contraseña) VALUES ('{$nom}','{$ap}','{$dir}','{$correo}','{$cont}')";
   $resultado_insert=mysqli_query($conexion,$insert);

   mysqli_close($conexion);

?>
Jesús
  • 1,543
  • 3
  • 10
  • 25
Antonio
  • 11
  • 1
  • Para probar, verifica si el servidor está recibiendo los datos poniendo esto: `echo nom: $nom, ap: $ap, dir: $dir, correo: $correo, cont: $cont";` y en Android pon el Toast así: `Toast.makeText(getApplicationContext(), "Registro exitoso: "+response, Toast.LENGTH_SHORT).show();` y dinos si muestra los datos. Si no los muestra es que no los está recibiendo. De todos modos, debes verificar una inserción correcta, pero luego te explico como, cuando estemos seguros de que los datos llegan. Otra cosa, evita valores especiales en tu nominación, lo digo por la columna `contraseña` – A. Cedano Nov 23 '19 at 16:45
  • @A.Cedano Si envía los datos en el Toast. – Antonio Nov 23 '19 at 17:04

1 Answers1

2

Prueba de este modo. En el código he implementado lo siguiente:

  • Un control de los datos pasados, para comprobar que no están vacíos
  • Control de la conexión en sí misma, además, estableciendo utf-8
  • Consultas preparadas, para evitar ataques de Inyección SQL
  • Control de la preparación de la consulta
  • Control de la ejecución de la consulta

De este modo el código controlará cualquier eventualidad, emitiendo siempre un mensaje adecuado. En este tipo de contextos no deberías omitir ningún control, porque cualquier fallo que no se controle podría resultar en un fallo fatal en la app con la consiguiente mala experiencia de usuario. Por otra parte la seguridad (consultas preparadas) es fundamental en estos casos.

Prueba de este modo y coméntanos el resultado. Espero te sirva.

<?php
    $nom=!empty($_POST['nombre']) ? $_POST['nombre']: NULL;
    $ap=!empty($_POST['apellidos']) ? $_POST['apellidos']: NULL;
    $dir=!empty($_POST['direccion']) ? $_POST['direccion']: NULL;
    $correo=!empty($_POST['correo']) ? $_POST['correo']: NULL;
    $cont=!empty($_POST['contrasenia']) ? $_POST['contrasenia']: NULL;
    if ($nom && $ap && $dir && $correo && $cont) {
        $host="localhost";
        $bd="deposito_cerveza_botana";
        $pass="";
        $user="root";
        if ($conexion=mysqli_connect($host,$user,$pass,$bd)) {
            mysqli_set_charset($conexion, "utf8");
            $sql="INSERT INTO usuario(nombre, apellidos, direccion, correo, contraseña) VALUES (?,?,?,?,?)";
            if ($stmt=mysqli_prepare($conexion,$sql)) {
                mysqli_stmt_bind_param($stmt, "sssss", $nom, $ap, $dir, $correo, $cont);
                if( mysqli_stmt_execute($stmt) ) {
                    $msg="Datos insertados exitosamente";
                } else {
                    $msg="Error insertando datos: mysqli_error($stmt)";
                }
            } else {
                $msg="Error en la consulta {mysqli_error($conexion)}";
            }
            mysqli_close($conexion);
        } else {
            $msg="No hay conexión";
        }
    } else {
        $msg="No se postearon todos los datos";
    }
    echo $msg;
?>

Recomendación

Evita nombrar tus tablas, columnas, variables usando caracteres como la ñ, en contextos en los que no se establece una codificación adecuada este tipo de nombrado ha dado problemas, por tanto, evita usar ñ, palabras con acento o caracteres raros en los nombres. Digo esto porque veo que llamaste a tu columna contraseña. Veamos si no hay algún fallo debido a eso. Ha ocurrido ya otras veces, que la consulta falla porque hay escrito en ella una palabra con ñ, ver por ejemplo este comentario en un caso similar al tuyo.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221