2

Tengo una aplicación para Android en la que accedo a una base de datos MySql por php.

Estoy intentando hacer que cuando un usuario intenta registrarse y ya exista no inserte los datos a la BBDD.

El problema viene que al poner el if que cuenta las filas del select o lo que sea ya que he probado con bastantes select, jamás ejecuta el insert que se encuentra dentro del if.

Lo que tengo comentado son algunas de las opciones con las que también he probado sin éxito.

Por otro lado en la base de datos tengo claves primarias que el phpadmin permite insertar duplicadas sin ningún problema.

Codigo:

<?php

$connect = mysqli_connect("localhost","root","root","comuniero");

if(mysqli_connect_errno($connect))
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
{
    echo "success";
}

$email = isset($_POST['email']) ? $_POST['email'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';


/*mysqli_select_db($connect,"comuniero");*/
$sql= mysqli_query($connect,"SELECT COUNT(*) AS total FROM users WHERE email='$email'");
$row=mysqli_fetch_object($sql);
if($row->total > 0){
    $query = mysqli_query($connect, "insert into users (username,email,password) values ('$email','$email','$password') ");
}
/*
$sql = "SELECT * FROM users WHERE email='$email' ";
$result=mysqli_query($connect,$sql) or die (mysql_error());
if(mysqli_num_rows($result)>0){
        $query = mysqli_query($connect, "insert into users (username,email,password) values ('$email','$email','$password') ");
}
}
/*$result = $connect->query($sql);

if ($result->num_rows > 0) {
    $query = mysqli_query($connect, "insert into users (username,email,password) values ('$email','$email','$password') ");*/
    /*
$n1=1;
$n2=1;
if ($n1==$n2) {
    $query = mysqli_query($connect, "insert into users (username,email,password) values ('$email','$email','$password') ");
*/
else {
    echo "0 results";
}

mysqli_close($connect);
?>
Miquel Coll
  • 3,191
  • 4
  • 21
  • 43
Nanako3
  • 23
  • 1
  • 4
  • 1
    Te recomiendo que leas sobre [inyección SQL](http://es.stackoverflow.com/q/10518/250) y cómo evitarla. Tal y como está el código de arriba, es inseguro y vulnerable a ese tipo de ataques. – Alvaro Montoro Sep 07 '16 at 11:22
  • 1
    ¿Podrías explicar "_en la base de datos tengo claves primarias que el phpadmin permite insertar duplicadas sin ningún problema_"? La clave primaria debería ser única y no permitir duplicados; si los permite, se pierde todo su valor. – Alvaro Montoro Sep 07 '16 at 11:28
  • Sugiero que agregues a la pregunta la estructura de la tabla y la clave primaria. – El Asiduo Sep 07 '16 at 11:36

2 Answers2

1

Un problema que hará que no se ejecute el insert que se encuentra dentro del if es que la condición está puesta al revés de como debería ser: quieres que los datos se inserten si no existe un registro, y que si ya existe no inserte los datos en la BBDD. Entonces se debería hacer el insert si el resultado del COUNT(*) es 0, pero en el if se está comprobando que sea mayor que 0:

$sql= mysqli_query($connect,"SELECT COUNT(*) AS total FROM users WHERE email='$email'");
$row=mysqli_fetch_object($sql);
if($row->total > 0){
    // insert va aquí, pero sólo se ejecuta si hay un usuario con ese email
}

Eso hará que sólo se inserte en la base de datos si ya existe un registro con ese email, que es lo que se quiere evitar. En su lugar deberías comprobar que $row->total sea 0. Con eso se realizará el insert exclusivamente cuando no exista ya un usuario con ese email:

$sql= mysqli_query($connect,"SELECT COUNT(*) AS total FROM users WHERE email='$email'");
$row=mysqli_fetch_object($sql);
if($row->total == 0){
    // insert va aquí, y sólo se ejecuta si no hay ningún usuario con ese email
}
Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
1

Efectivamente, como dice Alvaro la condición está al revés. Otra opción sería simplemente pasar el INSERT al else que tienes debajo.

Por otra parte, podrías ahorrarte $row=mysqli_fetch_object($sql); utilizando para la condición del if la siguiente funcion: if(mysqli_num_rows($sql)>0) (dejando la condición tal como está en tu ejemplo, que repito está mal)

Por último, decirte que si efectivamente tienes definida una PRIMARY KEY (si es el username o email) podrías ahorrarte toda la comprobación utilizando

insert ignore into users (username,email,password) values ('$email','$email','$password')
Miquel Coll
  • 3,191
  • 4
  • 21
  • 43
A. Cancela
  • 26
  • 2