Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // variable declaration
- $username = "";
- $email = "";
- $errors = array();
- $_SESSION['success'] = "";
- $Usererr = $Mailerr = $Passerr = false;
- // connect to database
- $db = mysqli_connect('localhost', 'root', 'sa', 'registration');
- // REGISTER USER
- if (isset($_POST['reg_user'])) {
- // receive all input values from the form
- $username = mysqli_real_escape_string($db, $_POST['username']);
- $email = mysqli_real_escape_string($db, $_POST['email']);
- $password_1 = mysqli_real_escape_string($db, $_POST['password_1']);
- $password_2 = mysqli_real_escape_string($db, $_POST['password_2']);
- // form validation: ensure that the form is correctly filled
- if (empty($username)) { array_push($errors, "El nombre de usuario es obligatorio"); $Usererr=true; }
- if (empty($email)) { array_push($errors, "El correo electrónico es obligatorio"); $Mailerr=true; }
- if (empty($password_1)) { array_push($errors, "Se requiere una contraseña"); $Passerr=true; }
- if ($password_1 != $password_2) {
- array_push($errors, "Las dos contraseñas no coinciden");
- }
- // register user if there are no errors in the form
- if (count($errors) == 0) {
- $password = md5($password_1);//encrypt the password before saving in the database
- $query = "INSERT INTO users (username, email, password)
- VALUES('$username', '$email', '$password')";
- mysqli_query($db, $query);
- $_SESSION['username'] = $username;
- $_SESSION['success'] = "Ahora estás logeado";
- unset($_SESSION['msg']);
- if (isset($_GET["redirect"])){
- header('location: ' . $_GET["redirect"]);
- }else
- header('location: index.php');
- }
- }
- // ...
- // LOGIN USER
- if (isset($_POST['login_user'])) {
- $username = mysqli_real_escape_string($db, $_POST['username']);
- $password = mysqli_real_escape_string($db, $_POST['password']);
- if (empty($username)) {
- array_push($errors, "Username is required");
- }
- if (empty($password)) {
- array_push($errors, "Password is required");
- }
- if (count($errors) == 0) {
- $password = md5($password);
- $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
- $results = mysqli_query($db, $query);
- if (mysqli_num_rows($results) == 1) {
- $_SESSION['username'] = $username;
- $_SESSION['success'] = "Ahora estás logeado";
- unset($_SESSION['msg']);
- if (isset($_GET["redirect"])){
- header('location: ' . $_GET["redirect"]);
- }else
- header('location: pagina_privada.php');
- }else {
- array_push($errors, "Combinación errónea de usuario y contraseña");
- }
- }
- }
- ?>
- <?php
- session_start();
- ?>
- <?php
- if (!isset($_SESSION['username'])) {
- $_SESSION['msg'] = "Para acceder a esta página, debes iniciar sesión primero";
- header('location: login.php?redirect=pagina_privada.php');
- }
- ?>
- <?php
- include("../PHP/header.php");
- include("../PHP/headerejercicio.php");
- include("login_functions.php");
- ?>
- <?php
- echo $_SESSION['username'];
- ?>
- <?php
- include("../PHP/footer.php");
- include("../PHP/footerejercicio.php");
- ?>
- <?php
- session_start();
- ?>
- <?php
- if (isset($_SESSION['username'])) {
- $_SESSION['msg'] = "Ya estás logeado";
- header('location: pagina_privada.php');
- }
- ?>
- <?php
- include("../PHP/header.php");
- include("../PHP/headerejercicio.php");
- include("login_functions.php");
- ?>
- <?php
- if (count($errors) > 0) {
- //Mostrar todos los mensajes de error
- for ($i = 0; $i < sizeOf($errors); $i++)
- echo "<div class='alert alert-danger' role='alert'>$errors[$i]</div>";
- }
- ?>
- <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post">
- <div class="form-group <?php if ($Usererr) echo 'has-error';?>">
- <label for="username">Nombre de usuari@</label>
- <input type="text" class="form-control" id="username" name="username" value="<?php echo $username?>">
- </div>
- <div class="form-group <?php if ($Mailerr) echo 'has-error';?>">
- <label for="email">Correo</label>
- <input type="text" class="form-control" id="email" name="email" value="<?php echo $email?>">
- </div>
- <div class="form-group <?php if ($Passerr) echo 'has-error';?>">
- <label for="password_1">Contraseña</label>
- <input type="password" class="form-control" id="password_1" name="password_1">
- </div>
- <div class="form-group <?php if ($Passerr) echo 'has-error';?>">
- <label for="password_2">Confirma la contraseña</label>
- <input type="password" class="form-control" id="password_2" name="password_2">
- </div>
- <button type="submit" class="btn btn-default" name="reg_user">Registrarse</button>
- <p>¿Ya tienes un usuario? <a href='login.php'>Login</a></p>
- <?php
- include("../PHP/footer.php");
- include("../PHP/footerejercicio.php");
- ?>
- <?php
- session_start();
- ?>
- <?php
- if(isset($_GET["redirect"])){
- $redirect = htmlspecialchars($_SERVER['PHP_SELF']) . "?redirect=" . $_GET["redirect"];
- }
- else {
- $redirect = htmlspecialchars($_SERVER['PHP_SELF']);
- }
- ?>
- <?php
- include('login_functions.php');
- include("../PHP/header.php");
- include("../PHP/headerejercicio.php");
- ?>
- <?php
- if (isset($_SESSION['username'])) {
- ?>
- <p>Está registrado como <strong><?php echo $_SESSION['username']; ?></strong></p>
- <?php
- }else{
- if(isset($_SESSION['msg'])){
- echo "<div class='alert alert-danger' role='alert'>$_SESSION[msg]</div>";
- unset($_SESSION['msg']);
- }
- ?>
- <?php
- if (count($errors) > 0) {
- //Mostrar todos los mensajes de error
- for ($i = 0; $i < sizeOf($errors); $i++)
- echo "<div class='alert alert-danger' role='alert'>$errors[$i]</div>";
- }
- ?>
- <form action="<?php echo $redirect;?>" method="post">
- <div class="form-group <?php if ($Usererr) echo 'has-error';?>">
- <label for="username">Nombre de usuari@</label>
- <input type="text" class="form-control" id="username" name="username" value="<?php echo $username?>">
- </div>
- <div class="form-group <?php if ($Passerr) echo 'has-error';?>">
- <label for="password">Contraseña</label>
- <input type="password" class="form-control" id="password" name="password">
- </div>
- <button type="submit" class="btn btn-default" name="login_user">Acceder</button>
- <p>¿Todavia no tienes un usuario? <a href='register.php'>Registrarse</a></p>
- </form>
- <?php
- }
- ?>
- <?php
- include("../PHP/footer.php");
- include("../PHP/footerejercicio.php");
- ?>
- <?php
- session_start();
- include('login_functions.php');
- ?>
- <?php
- include("../PHP/header.php");
- include("../PHP/headerejercicio.php");
- ?>
- <?php if (isset($_SESSION['username'])) {?>
- <p>Está registrado como <strong><?php echo $_SESSION['username']; ?></strong></p>
- <?php
- }else{
- ?>
- <?php
- if ($errors){
- //Mostrar todos los mensajes de error
- for ($i = 0; $i < sizeOf($errors); $i++)
- echo "<div class='alert alert-danger' role='alert'>$errors[$i]</div>";
- }
- ?>
- <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post">
- <div class="form-group <?php if ($Usererr) echo 'has-error';?>">
- <label for="username ">Nombre de usuari@</label>
- <input type="text" class="form-control" id="username" name="username" value="<?php echo $username?>">
- </div>
- <div class="form-group <?php if ($Passerr) echo 'has-error';?>">
- <label for="password">Contraseña</label>
- <input type="password" class="form-control" id="password" name="password">
- </div>
- <button type="submit" class="btn btn-default" name="login_user">Acceder</button>
- <p>¿Todavia no tienes un usuario? <a href='register.php'>Registrarse</a></p>
- <?php
- }
- ?>
- <?php
- include("../PHP/footerejercicio.php");
- include("../PHP/footer.php");
- ?>
- <?php
- /*
- ******************************** PROCESO Y MODELO ***************************************
- Aquí empieza la parte de proceso de la página y de conexión con el modelo de la bd
- Como podéis observar en esta parte NO se escribe nada de HTML!!!
- Esto es así porque en esta parte, podemos iniciar sesiones, hacer redirecciones, etc. y para ello es obligatorio
- no haber producido salida HTML
- De hecho, toda esta parte podría estar perfectamente en otro script php. Sólo está aquí para que os sea más sencillo
- */
- function sanitize_input($data) {
- /*
- La variable $db se define fuera de esta función. Para no ir pasando la conexión a la bd en cada función se usa
- global $db; que indica que esta variable tiene ámbito (scope) global y está definida en otra parte
- */
- global $db;
- $data = trim($data);
- //Quitar las comillas escapadas ' y ""
- $data = stripslashes($data);
- //Prevenir la introducción de scripts en los campos
- $data = htmlspecialchars($data);
- return mysqli_real_escape_string($db, $data);
- }
- function connect_db(){
- //Conexión con la bd
- $db = mysqli_connect('localhost', 'root', 'sa', 'mi_primera_web');
- //IMPORTANTE. Siempre que os conectéis fijad la codificación de caracteres a utf8
- mysqli_query($db, "SET NAMES 'utf8'");
- return $db;
- }
- /* Este array lo uso para mostrar la información del Method, action, view_mode y parámetros
- Solo es para pruebas
- */
- $debug = array();
- array_push($debug, "Method: " . $_SERVER["REQUEST_METHOD"]);
- // Conectar con la base de datos
- $db = connect_db();
- //Inicializar variables (SIEMPRE!!!)
- $id = -1; /* Así identificamos el valor NULL, con un valor que NUNCA pueda tener ese campo */
- $id_categoria = -1;
- $nombre = "";
- $precio = 0;
- $descripcion = "";
- $nombreErr = false;
- $precioErr = false;
- $descripcionErr = false;
- $errors = array();
- $info = array();
- $error = false;
- if (($_SERVER["REQUEST_METHOD"] == "POST")){
- /*
- Recordad que todas las opciones que implican modificación de BD se hacen con post
- Las posibles opciones son:
- update, delete e insert
- Dependiendo del método uno de los `button submit` se llama de una forma u otra (mirad el form)
- De esta forma sabemos qué acción ha realizado el usuario
- */
- if (isset($_POST['update'])) {
- $action = "update";
- }else if (isset($_POST['delete'])) {
- $action = "delete";
- }else if (isset($_POST['insert'])) {
- $action = "insert";
- }
- //Siempre estamos en view_mode edit al hacer post, a no ser que se cambie por show_message (ver más abajo la explicación)
- $view_mode = "edit";
- switch ($action) {
- case "update":
- //Hacemos comprobaciones
- $id = sanitize_input($_POST['id']);
- $nombre = sanitize_input($_POST['nombre']);
- $id_categoria = sanitize_input($_POST['id_categoria']);
- $descripcion = sanitize_input($_POST['descripcion']);
- $precio = sanitize_input($_POST['precio']);
- if (empty($nombre)) {
- array_push($errors, "El nombre de la categoría es obligatorio");
- $nombreErr = true;
- }
- if (empty($descripcion)){
- array_push($errors, "La descripción del producto es obligatoria");
- $descripcionErr = true;
- }
- if (empty($precio)){
- array_push($errors, "El precio del producto es obligatorio");
- $precioErr = true;
- }
- if (count($errors) == 0) {
- //todo bien
- $query = "UPDATE productos set nombre = '$nombre', descripcion = '$descripcion', id_categoria = $id_categoria, precio = $precio where id=$id";
- if (!mysqli_query($db, $query)){
- // Si se produce algún error, informamos
- array_push($errors, mysqli_error($db));
- }
- /* Sólo pruebas */
- array_push($debug, "Query: " . $query);
- }
- break;
- case "delete":
- $id = sanitize_input($_POST['id']);
- $query = "DELETE FROM productos where id=$id";
- mysqli_query($db, $query);
- if (!mysqli_query($db, $query)){
- //IMPORTANTE: Si se produce algún error, pasamos a action update
- array_push($errors, mysqli_error($db));
- $action = "update";
- $nombre = $_POST['nombre'];
- $descripcion = $_POST['descripcion'];
- $precio = $_POST['precio'];
- $id_categoria = $_POST['id_categoria'];
- $error = true;
- }else{
- //Cuando va bien sólo muestro un mensaje. Mirad más abajo
- $view_mode = "show_message";
- }
- /* Sólo pruebas */
- array_push($debug, "Query: " . $query);
- break;
- case "insert":
- $id = "";
- $nombre = sanitize_input($_POST['nombre']);
- $id_categoria = sanitize_input($_POST['id_categoria']);
- $descripcion = sanitize_input($_POST['descripcion']);
- $precio = sanitize_input($_POST['precio']);
- if (empty($nombre)) {
- array_push($errors, "El nombre de la categoría es obligatorio");
- $view_mode = "add_new";
- $nombreErr = true;
- }
- if (empty($descripcion)){
- array_push($errors, "La descripción del producto es obligatoria");
- $view_mode = "add_new";
- $descripcionErr = true;
- }
- if (empty($precio)){
- array_push($errors, "El precio del producto es obligatorio");
- $view_mode = "add_new";
- $precioErr = true;
- }
- $query = "INSERT INTO productos (nombre, descripcion, id_categoria, precio) VALUES('$nombre', '$descripcion', $id_categoria, $precio)";
- array_push($debug, "Query: " . $query);
- if (mysqli_query($db, $query)){
- /*
- IMPORTANTE: Si todo va bien pasamos a action update de la categoría insertada
- La función mysqli_insert_id devuelve el último id automático insertado
- */
- $id = mysqli_insert_id($db);
- $action = "update";
- }else{
- //Si se produce algún error, seguiremos en action insert para que el usuario lo pueda corregir
- array_push($errors, mysqli_error($db));
- }
- break;
- default:
- array_push($errors, "Opción incorrecta");
- /* Este action y view_mode son especiales. Los uso para contemplar casos incongruentes */
- $action = "incorrect";
- $view_mode = "show_message";
- }
- }
- if (($_SERVER["REQUEST_METHOD"] == "GET")){
- //Ver en qué estado hemos de mostrar el form
- //Por defecto, la opción es editar un ítem
- $view_mode = "edit";
- /*
- En el GET sólo pueden venir los modos edit, add_new
- Dependiendo de este parámetro las "action" posibles son:
- edit -> update o delete
- add_new -> insert
- NOTA. El modo "show_message" es especial. No se usa como parámetro en la URL, sino que se usa para indicar que no
- queremos mostrar el formulario (por ejemplo, una vez borrado un elemento, cuando no se encuentra el elemento, etc)
- Si "view_mode" es:
- * edit: Muestra los datos del elemento junto con Guardar, Eliminar y Nuevo
- * add_new: Muestra un formulario con los datos en blanco y los botones Guardar y Cancelar
- * show_message: No muestra el formulario. Se usa en casos especiales (buscad en el código)
- */
- if (isset($_GET['view_mode'])) {
- $view_mode = strtolower($_GET['view_mode']);
- }
- if ($view_mode == "edit"){
- /* Obtener los datos del elemento */
- $id = -1; //Suponemos que es NULL
- if (isset($_GET["id"])){
- $id = $_GET["id"];
- }
- if ($id != -1){
- $query = "SELECT * from productos where id = $id";
- }else{
- /*
- Si no hay id es porque visitamos la página sin querystring.
- Nos quedamos con la primera que haya. Fijáos en "limit 1"
- */
- $query = "SELECT * from productos order by id asc limit 1";
- }
- array_push($debug, "Query: " . $query);
- $results = mysqli_query($db, $query);
- if ($results->num_rows > 0) {
- //Rellenar las variables con las obtenidas de la BD
- $row = mysqli_fetch_assoc($results);
- $id = $row["id"];
- $nombre = $row["nombre"];
- $descripcion = $row["descripcion"];
- $id_categoria = $row["id_categoria"];
- $precio = $row["precio"];
- //Si el elemento existe, la action ahora es update
- $action = "update";
- }else{
- //Si no obtenemos ningún elemento es porque está vacía la tabla o no existe tal elemento
- if ($id == -1){
- //No hay ninguno, pasar automáticamente a modo add_new
- $view_mode = "add_new";
- }else{
- //El elemento no existe
- $view_mode = "show_message";
- array_push($errors, "El producto $id no existe");
- }
- }
- }
- /*
- ********** CUIDADO ********************
- NO HACER
- else if ($view_mode == "add_new"){
- porque cuando estamos en modo "edit" podemos cambiar a "add_new"
- */
- if ($view_mode == "add_new"){
- $id = "";
- $action = "insert";
- }
- //Si no son estos modos no mostramos el formulario
- if (($view_mode != "add_new") && ($view_mode != "edit") && ($view_mode != "show_message")){
- $view_mode = "show_message";
- $action = "incorrect";
- array_push($errors, "Opción incorrecta");
- }
- }
- ?>
- <?php
- /* ******************************** VISTA ***************************************
- Aquí empieza la parte que muestra la página. Ahora ya se puede escribir HTML porque toda la lógica se ha hecho antes
- */
- function imprimeArbol($idCategoria, $nivel, $currentId){
- global $db;
- if ( $idCategoria == -1)
- $sql = "SELECT * from categorias where id_padre is null";
- else
- $sql = "SELECT * from categorias where id_padre = $idCategoria";
- $results = mysqli_query($db, $sql);
- if ($results->num_rows > 0) {
- $nivel = $nivel + 1;
- while($row = mysqli_fetch_assoc($results)){
- echo "<option value='" . $row["id"] . "' " . ($currentId == $row["id"] ? "selected" : "") . ">";
- echo str_pad("", $nivel * 4 * 6, " ") . $row["nombre"];
- echo "</option>";
- imprimeArbol($row["id"], $nivel, $currentId);
- }
- }
- }
- function imprimeMenu(){
- global $db, $id;
- $sql = "SELECT * from productos";
- $results = mysqli_query($db, $sql);
- if ($results->num_rows > 0) {
- echo "<ul>";
- while($row = mysqli_fetch_assoc($results)){
- echo "<li>";
- if ($id == $row["id"]){
- echo $row["nombre"];
- }else{
- echo "<a href='productos.php?id=" . $row["id"] . "&view_mode=edit'>" . $row["nombre"] . "</a>";
- }
- echo "</li>";
- }
- echo "</ul>";
- }
- }
- $pageheader = "productos";
- include("./include/header.php");
- ?>
- <script>
- function checkDelete(){
- //Siempre que una acción no se pueda deshacer hay que pedir confirmación al usuario
- if (confirm("¿Seguro que desea borrar este producto?"))
- return true;
- else
- return false;
- }
- </script>
- <div class="row">
- <div class="col-lg-4">
- <?php imprimeMenu(-1); ?>
- </div>
- <div class="col-lg-8">
- <?php
- //Mensajes de depuración
- echo "<pre>";
- for ($i = 0; $i < sizeOf($debug); $i++)
- echo $debug[$i] . "n";
- echo "view_mode: $view_mode | action: $action | id: $id";
- echo "</pre>";
- //Mostrar todos los mensajes de error
- for ($i = 0; $i < sizeOf($errors); $i++)
- echo "<div class='alert alert-danger' role='alert'>$errors[$i]</div>";
- /*
- Cuando llegamos aquí ya sabemos en qué modo estamos porque se ha hecho en el controlador
- Todas las variables también se han informado allí
- */
- if (($view_mode == "edit") || ($view_mode == "add_new")){
- ?>
- <form action="productos.php" method="post">
- <div class="form-group">
- <label for="id">ID</label>
- <!-- Cuidado: Si un campo está disabled NO se envía en el POST, por tanto hay que duplicarlo en uno oculto -->
- <input disabled type="text" class="form-control" id="id" value="<?php echo $id; ?>" placeholder="Campo automático">
- <input type="hidden" name="id" value="<?php echo $id; ?>">
- </div>
- <div class="form-group <?php echo ($nombreErr ? " has-error" : "");?> ">
- <label for="nombre">Nombre</label>
- <input type="text" class="form-control" id="nombre" name="nombre" value="<?php echo $nombre; ?>">
- </div>
- <div class="form-group <?php echo ($descripcionErr ? " has-error" : "");?> ">
- <label for="descripcion">Descripción</label>
- <input type="textarea" class="form-control" id="descripcion" name="descripcion" value="<?php echo $descripcion; ?>">
- </div>
- <div class="form-group <?php echo ($precioErr ? " has-error" : "");?> ">
- <label for="precio">Precio</label>
- <input type="number" class="form-control" id="precio" name="precio" step=".01" value="<?php echo $precio; ?>">
- </div>
- <div class="form-group">
- <label for="categoria">Categoría</label>
- <?php
- echo "<select name='id_categoria' id_categoria='id_categoria'>";
- imprimeArbol(-1, -1, $id_categoria);
- echo "</select>";
- ?>
- </div>
- <button type="submit" name='<?php echo $action; ?>' class="btn btn-primary">Guardar</button>
- <?php if ($view_mode == "edit"){?>
- <button type="submit" name='delete' class="btn btn-default" onclick='return checkDelete();'>Eliminar</button>
- <hr>
- <a class='btn btn-default' href='productos.php?view_mode=add_new'>Nueva</a>
- <?php }else{ ?>
- <a class='btn btn-default' href='productos.php?view_mode=edit'>Cancelar</a>
- <?php } ?>
- </form>
- <?php
- }else{
- //En este caso sólo hay una posibilidad. En otros forms, tal vez haya más opciones
- if (($action == "delete") && (sizeOf($errors) == 0)){
- echo "<div class='alert alert-info'>Producto borrado satisfactoriamente <a class='btn btn-default' href='./productos.php'>Continuar</a></div>";
- }
- }//if (($view_mode == "edit") || ($view_mode == "add_new")){
- ?>
- </div>
- </div>
- <?php
- //En principio no hace falta cerrar la conexión, pero no está de más
- mysqli_close($db);
- include("./include/footer.php");
- ?>
Add Comment
Please, Sign In to add comment