Tengo un código de prueba de sesión de PHP, para garantizar que el usuario que inició sesión sea válido. Solo explicaré algunas de las funciones: is_logged_in solo verifica si algunas variables de sesión están configuradas y test_duplicate conecta a la base de datos para verificar si hay una fila con una columna que iguala el valor.
function check_account(){ if(is_logged_in()){ // Destroy session if the user doesn't exist. if(test_duplicate("username", $_SESSION["user"])){ session_destroy(); } } if($_SESSION["valid_day"] != date("Ymd")){ // Destroy session if the key has expired session_destroy(); } } function test_duplicate($field, $value){ $mysqli = database_connect(); $statement = $mysqli->prepare("SELECT * FROM users WHERE " . $field . " = ?"); $statement->bind_param("s", $value); $statement->execute(); $statement->store_result(); $rows = $statement->num_rows; if($rows > 0){ return FALSE; } return TRUE; } function database_connect(){ if(!isset($dbconnection)){ $config = get_configuration(); // Create connection $mysqli = new mysqli($config["hostname"], $config["username"], $config["password"], $config["database"]); if($mysqli->connect_error){ die("<h1>Error 1 :: Critical backend failure</h1>"); } if(!check_tables($mysqli)){ die("<h1>Error 2 :: Critical backend failure</h1>"); } $dbconnection = $mysqli; return $mysqli; }else{ return $dbconnection; } }Los problemas:
test_duplicate tarda entre 3 y 4 segundos en completarseMis soluciones actuales (no creo que sean particularmente buenas):
Yo sugeriría:
test_duplicate .select * , devuelve un único valor entero. Mejor aún, en lugar de manejarlo como una consulta que devuelve una fila, hágalo como una consulta escalar que devuelve un valor único.Actualizar
Aquí hay una consulta que devuelve 1 si hay una fila con un valor específico en el nombre de username ; o 0 si no existe ninguna fila coincidente:
select ifnull( ( select 1 as user_exists from dual where exists( select * from users where username = 'test2' ) ), 0) as result from dual