¿Cómo comprobar si existe una fila en MySQL? (es decir, comprobar si el nombre de usuario o el correo electrónico existe en MySQL)
Necesito ayuda para comprobar si existe una fila en la base de datos. En mi caso, esa fila contiene una dirección de correo electrónico. Estoy obteniendo el resultado:
email no longer exists [email protected]
Este es el código que estoy usando actualmente:
if (count($_POST)) {
$email = $dbl->real_escape_string(trim(strip_tags($_POST['email'])));
$query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
$result = mysqli_query($dbl, $query);
if (is_resource($result) && mysqli_num_rows($result) == 1) {
$row = mysqli_fetch_assoc($result);
echo $email . " email exists " . $row["email"] . "\n";
} else {
echo "email no longer exists" . $email . "\n";
}
}
¿Existe una mejor manera de verificar si existe una fila en la base de datos MySQL (en mi caso, verificar si existe un correo electrónico en MySQL)?
Usando el enfoque heredado de declaraciones preparadas de mysqli :
$query = "SELECT 1 FROM `tblUser` WHERE email=?";
$stmt = $dbl->prepare($query);
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$emailExists = (bool)$row;
Usando el enfoque moderno de mysqli a partir de PHP 8.2:
$query = "SELECT 1 FROM `tblUser` WHERE email=?";
$result = $dbl->execute_query($query, [$email]);
$row = $result->fetch_assoc();
$emailExists = (bool)$row;
Usando la declaración preparada PDO :
$email = $_POST['email'];
$stmt = $conn->prepare('SELECT 1 FROM `tblUser` WHERE email = :email');
$stmt->execute(["email" => $_POST['email']]);
$row = $result->fetch();
$emailExists = (bool)$row;
- Es mejor utilizar declaraciones preparadas para ayudar a proteger contra una inyección SQL.
NÓTESE BIEN:
Cuando trabaje con formularios y matrices POST como se usan/describen anteriormente, asegúrese de que las matrices POST contengan valores, que se use un método POST para el formulario y que coincidan los atributos con nombre para las entradas.
- Para su información: los formularios utilizan de forma predeterminada un método GET si no se indica explícitamente.
Nota: <input type = "text" name = "var">
- $_POST['var']
partido. $_POST['Var']
Sin coincidencia.
- Las matrices POST distinguen entre mayúsculas y minúsculas.
Consultar:
- http://php.net/manual/en/tutorial.forms.php
Error al comprobar las referencias:
- http://php.net/manual/en/function.error-reporting.php
- http://php.net/manual/en/mysqli.error.php
- http://php.net/manual/en/pdo.error-handling.php
Tenga en cuenta que las API de MySQL no se mezclan, en caso de que esté visitando estas preguntas y respuestas y las esté utilizando mysql_
para conectarse (y realizar consultas).
- Debe utilizar el mismo desde la conexión hasta la consulta.
Consulta al respecto lo siguiente:
- ¿Puedo mezclar API de MySQL en PHP?
Si está utilizando la mysql_
API y no tiene otra opción para trabajar con ella, consulte las siguientes preguntas y respuestas en Stack:
- Compruebe si existe una fila utilizando la antigua API mysql_*
Las mysql_*
funciones están en desuso y se eliminarán de futuras versiones de PHP.
- Es hora de dar un paso hacia el siglo XXI.
También puede agregar una restricción ÚNICA a (una) fila(s).
Referencias:
- http://dev.mysql.com/doc/refman/5.7/en/constraint-primary-key.html
- http://dev.mysql.com/doc/refman/5.7/en/alter-table.html
- ¿Cómo comprobar si un valor ya existe para evitar duplicados?
Cómo agregar una clave única a una tabla existente (con filas no únicas)
Debe ejecutar su consulta y agregar comillas simples a $email en la consulta porque es una cadena, y eliminar is_resource($query)
$query es una cadena, el $resultado será el recurso
$query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
$result = mysqli_query($link,$query); //$link is the connection
if(mysqli_num_rows($result) > 0 ){....}
ACTUALIZAR
Base en tu edición simplemente cambia:
if(is_resource($query) && mysqli_num_rows($query) > 0 ){
$query = mysqli_fetch_assoc($query);
echo $email . " email exists " . $query["email"] . "\n";
Por
if(is_resource($result) && mysqli_num_rows($result) == 1 ){
$row = mysqli_fetch_assoc($result);
echo $email . " email exists " . $row["email"] . "\n";
y estarás bien
ACTUALIZACIÓN 2
Una mejor manera debería ser tener un procedimiento de almacenamiento que ejecute el siguiente SQL pasando el correo electrónico como parámetro
SELECT IF( EXISTS (
SELECT *
FROM `Table`
WHERE `email` = @Email)
, 1, 0) as `Exist`
y recuperar el valor en php
Pseudocódigo:
$query = Call MYSQL_SP($EMAIL);
$result = mysqli_query($conn,$query);
$row = mysqli_fetch_array($result)
$exist = ($row['Exist']==1)? 'the email exist' : 'the email doesnt exist';
Hay varias formas de comprobar si existe un valor en la base de datos. Permítanme demostrarles cómo se puede hacer esto correctamente con PDO y mysqli.
DOP
DOP es la opción más sencilla. Para saber si existe un valor en la base de datos, puede utilizar una declaración preparada y fetchColumn()
. No es necesario recuperar ningún dato, por lo que solo lo recuperaremos 1
si el valor existe.
<?php
// Connection code.
$options = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new \PDO('mysql:host=localhost;port=3306;dbname=test;charset=utf8mb4', 'testuser', 'password', $options);
// Prepared statement
$stmt = $pdo->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->execute([$_POST['email']]);
$exists = $stmt->fetchColumn(); // either 1 or null
if ($exists) {
echo 'Email exists in the database.';
} else {
// email doesn't exist yet
}
Para más ejemplos ver: ¿ Cómo comprobar si el correo electrónico existe en la base de datos?
MySQLi
Como siempre mysqli es un poco más engorroso y restringido, pero podemos seguir un enfoque similar con una declaración preparada.
<?php
// Connection code
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'testuser', 'password', 'test');
$mysqli->set_charset('utf8mb4');
// Prepared statement
$stmt = $mysqli->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->bind_param('s', $_POST['email']);
$stmt->execute();
$exists = (bool) $stmt->get_result()->fetch_row(); // Get the first row from result and cast to boolean
if ($exists) {
echo 'Email exists in the database.';
} else {
// email doesn't exist yet
}
En lugar de convertir la fila de resultados (que podría ni siquiera existir) en booleana, también puede buscar COUNT(1)
y leer el primer elemento de la primera fila usandofetch_row()[0]
Para obtener más ejemplos, consulte: Cómo verificar si existe un valor en una base de datos usando declaraciones preparadas de mysqli
Comentarios menores
- Si alguien te sugiere que uses
mysqli_num_rows()
, no lo escuches. Este es un enfoque muy malo y podría provocar problemas de rendimiento si se utiliza incorrectamente. - No lo uses
real_escape_string()
. Esto no debe utilizarse como protección contra la inyección de SQL. Si utiliza correctamente las declaraciones preparadas, no necesita preocuparse por ningún escape. - Si desea comprobar si existe una fila en la base de datos antes de intentar insertar una nueva, es mejor no utilizar este método. Es mejor crear una clave única en la base de datos y dejar que genere una excepción si existe un valor duplicado.
Después de la validación y antes de INSERT, verifique si el nombre de usuario ya existe, usando mysqli (procedimental). Esto funciona:
//check if username already exists
include 'phpscript/connect.php'; //connect to your database
$sql = "SELECT username FROM users WHERE username = '$username'";
$result = $conn->query($sql);
if($result->num_rows > 0) {
$usernameErr = "username already taken"; //takes'em back to form
} else { // go on to INSERT new record