idUsuario = $idUsuario; $this->username = $username; $this->nombreUsuario = $nombreUsuario; $this->email = $email; $this->contrasena = $contrasena; $this->avatar = $avatar; $this->fechaRegistro = $fechaRegistro; } // Fin __construct() public function insertar(){ $conexion = conexionBD(); if(is_array($conexion)){ return $conexion; }else{ try{ // Comprobamos que el username esté libre $consulta = $conexion->prepare("SELECT * FROM usuarios WHERE username= :username"); $consulta->bindParam(':username', $this->username); $consulta->execute(); $resultado = $consulta->fetchAll(PDO::FETCH_ASSOC); if(count($resultado)>0){ $respuesta = [ 'error' => 'Este nombre de usuario ya existe.', 'caso' => 'username' ]; return $respuesta; } // Comprobamos que el email esté libre $consulta = $conexion->prepare("SELECT * FROM usuarios WHERE email= :email"); $consulta->bindParam(':email', $this->email); $consulta->execute(); $resultado = $consulta->fetchAll(PDO::FETCH_ASSOC); if(count($resultado)>0){ $respuesta = [ 'error' => 'Ya existe un usuario con este correo.', 'caso' => 'email' ]; return $respuesta; } $consulta = $conexion->prepare("INSERT INTO usuarios (idUsuario, username, nombreUsuario, email, contrasena, avatar, fechaRegistro) VALUES (:idUsuario, :username, :nombreUsuario, :email, :contrasena, :avatar, :fechaRegistro)"); $consulta->bindParam(':idUsuario', $this->idUsuario); $consulta->bindParam(':username', $this->username); $consulta->bindParam(':nombreUsuario', $this->nombreUsuario); $consulta->bindParam(':email', $this->email); $consulta->bindParam(':avatar', $this->avatar); $fechaRegistro=date('Y/m/d'); $consulta->bindParam(':fechaRegistro', $fechaRegistro); // Ciframos la contraseña $pass = password_hash($this->contrasena, PASSWORD_DEFAULT); $consulta->bindParam(':contrasena', $pass); $consulta->execute(); // Inciamos la sesión al registrarse $this->idUsuario = $conexion->lastInsertId(); $_SESSION['idUsuario'] = $this->idUsuario; $_SESSION['username'] = $this->username; $respuesta = [ 'exito' => 'El usuario se registró correctamente.', 'id' => $conexion->lastInsertId() ]; return $respuesta; }catch(PDOException $error){ $respuesta = [ 'error' => 'Ocurrió un error al crear al usuario.', 'error_tecnico' => $error ]; $conexion = null; return $respuesta; } } // Fin else } // Fin insertar() public function validar(){ $conexion = conexionBD(); if(is_array($conexion)){ return $conexion; }else{ try{ $consulta = $conexion->prepare("SELECT * FROM usuarios WHERE username= :identificador OR email= :identificador"); $consulta->bindParam(':identificador', $this->identificador); $consulta->execute(); $resultado = $consulta->fetchAll(PDO::FETCH_ASSOC); // Si el usuario no existe if(count($resultado)==0){ $respuesta = ['error' => 'Usuario o contrasena incorrectos.']; return $respuesta; } $pass = $resultado[0]['contrasena']; if(password_verify($this->contrasena, $pass)){ // La pass es correcta, el usuario está validado // Actualizamos variables y también el objeto actual, para que se sepa qué usuario tiene sesión iniciado en cualquier página del proyecto $_SESSION['idUsuario'] = $resultado[0]['idUsuario']; $_SESSION['username'] = $resultado[0]['username']; $_SESSION['nombreUsuario'] = $resultado[0]['nombreUsuario']; $_SESSION['avatar'] = $resultado[0]['avatar']; $this->idUsuario = $resultado[0]['idUsuario']; $this->username = $resultado[0]['username']; $this->nombreUsuario = $resultado[0]['nombreUsuario']; $this->email = $resultado[0]['email']; $this->avatar = $resultado[0]['avatar']; $this->fechaRegistro = $resultado[0]['fechaRegistro']; // Almacenamos datos que usaremos en la respuesta $respuesta = [ 'exito' => 'Usuario validado.', 'nombreUsuario' => $resultado[0]['nombreUsuario'] ]; return $respuesta; }else{ // pass incorrecta // Eliminamos los datos por si hubiera alguna sesión iniciado si alguien ha introducido mal la contraseña unset($_SESSION['idUsuario']); unset($_SESSION['nombreUsuario']); unset($_SESSION['username']); $this->idUsuario = null; $this->username = null; $this->nombreUsuario = null; $this->email = null; $this->avatar = null; $this->fechaRegistro = null; $respuesta = ['error' => 'Usuario o contrasena incorrectos.']; return $respuesta; } }catch(PDOException $error){ $respuesta = [ 'error' => 'Ocurrió un error al validar al usuario.', 'error_tecnico' => $error ]; $conexion = null; return $respuesta; } } // Fin else } // Fin validar() public function editarNombre(){ $conexion = conexionBD(); if(is_array($conexion)){ return $conexion; }else{ try{ $consulta = $conexion->prepare("UPDATE usuarios SET nombreUsuario=:nombre WHERE idUsuario=:id"); $consulta->bindParam(':id', $this->idUsuario); $consulta->bindParam(':nombre', $this->nombreUsuario); $consulta->execute(); $_SESSION['nombreUsuario'] = $this->nombreUsuario; $respuesta = [ 'exito' => 'El nombre de usuario se editó correctamente.', 'exito_tecnico' => $this->nombreUsuario ]; return $respuesta; }catch(PDOException $error){ $respuesta = [ 'error' => 'Ocurrió un error al editar el nombre del usuario.', 'error_tecnico' => $error ]; $conexion = null; return $respuesta; } } // Fin else } // Fin editarNombre() public function editarAvatar(){ $conexion = conexionBD(); if(is_array($conexion)){ return $conexion; } try{ if(!isset($_FILES['avatar']) || !isset($_FILES['avatar']['error'])){ return [ 'error' => 'No se recibió ninguna imagen.' ]; } if($_FILES['avatar']['error'] !== UPLOAD_ERR_OK){ return [ 'error' => 'No se pudo subir la imagen.' ]; } if($_FILES['avatar']['size'] > 5 * 1024 * 1024){ return [ 'error' => 'El avatar no puede superar los 5 MB.' ]; } $finfo = new finfo(FILEINFO_MIME_TYPE); $tiposPermitidos = [ 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/webp' => 'webp' ]; $mime = $finfo->file( $_FILES['avatar']['tmp_name'] ); if(!isset($tiposPermitidos[$mime])){ return [ 'error' => 'El archivo debe ser una imagen JPG, PNG o WEBP.' ]; } if(@getimagesize($_FILES['avatar']['tmp_name']) === false){ return [ 'error' => 'El archivo seleccionado no es una imagen válida.' ]; } // Creamos la carpeta física $carpeta = $_SERVER['DOCUMENT_ROOT'].'/MyDiary/images/avatars/'; if(!is_dir($carpeta)){ if(!mkdir($carpeta, 0755, true)){ return [ 'error' => 'No se pudo crear la carpeta de avatares.' ]; } } $extension = $tiposPermitidos[$mime]; $nombreArchivo = $this->idUsuario.'.'.$extension; $rutaFisica = $carpeta.$nombreArchivo; // Eliminamos posibles avatares anteriores de este usuario $extensiones = ['jpg', 'png', 'webp']; foreach($extensiones as $extensionAnterior){ $archivoAnterior = $carpeta.$this->idUsuario.'.'.$extensionAnterior; if(file_exists($archivoAnterior) && $archivoAnterior !== $rutaFisica){ unlink($archivoAnterior); } } if(!move_uploaded_file($_FILES['avatar']['tmp_name'],$rutaFisica)){ return [ 'error' => 'No se pudo guardar el avatar.' ]; } $rutaBD ='images/avatars/'.$nombreArchivo; // Actualizamos el usuario $consulta = $conexion->prepare("UPDATE usuarios SET avatar = :avatar WHERE idUsuario = :idUsuario"); $consulta->bindParam(':avatar', $rutaBD); $consulta->bindParam(':idUsuario',$this->idUsuario); $consulta->execute(); // Lo guardamos ya en la sesión actual $_SESSION['avatar'] = $rutaBD; return [ 'exito' => true, 'avatar' => $rutaBD ]; }catch(PDOException $error){ return [ 'error' => 'Ocurrió un error al actualizar el avatar.', 'error_tecnico' => $error ]; } } // Fin editarAvatar() public function cerrarSesion(){ $_SESSION = []; session_destroy(); $respuesta = [ 'exito' => 'La sesión se ha cerrado correctamente' ]; return $respuesta; } // Fin cerrarSesion() } // Fin de la clase Usuario /* $usuario = new Usuario(); $usuario->username = 'isaac'; $usuario->nombreUsuario = 'Isaac'; $usuario->email = 'isaac.espi@hotmail.es'; $usuario->contrasena = '1234'; $resultado = $usuario->insertar(); var_dump($resultado); echo '
'; $resultado = $usuario->validar(); var_dump($resultado); */ ?>