Foros del Web » Programando para Internet » PHP »

Creando un CMS

Estas en el tema de Creando un CMS en el foro de PHP en Foros del Web. Buenas, me gustaría aportar para los mas inexpertos una guía de como veo yo el funcionamiento de los CMS, y para eso voy a explicar ...
  #1 (permalink)  
Antiguo 11/01/2011, 17:47
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
Información Creando un CMS

Buenas, me gustaría aportar para los mas inexpertos una guía de como veo yo el funcionamiento de los CMS, y para eso voy a explicar paso a paso como montar uno bastante sencillo, pienso que ya que usamos muchas aplicaciones CMS a diario es bueno ver como funcionan. Prometo continuarla sin dejarla de lado.

1 Parte – Definiendo la base de datos

Un CMS es un un Sistema de Gestión de Contenidos, permite la publicación de contenido en linea de forma ordenada por parte de terceros o del propio administrador, el contenido de los artículos o post enviados se almacena en la base de datos, mientras que de forma separada podemos gestionar la apariencia de nuestro sitio. En la actualidad hay muchos CMS disponibles, dos ejemplos muy importantes podrían ser WordPress y Drupal, ambos muy potentes y con comunidades muy grandes detrás, aunque ambos pueden hacer las mismas funciones, entrar en cual es mejor es una tontería, WordPress es mucho mas practico en sitios cuya función sea un blog, y Drupal es mas practico en blogs en los que intervengan muchas personas o en portales corporativos, al menos así los veo yo, por supuesto configurándolos y instalado plugins adicionales se puede hacer absolutamente de todo con cada uno de ellos, el uso que le demos depende única y exclusivamente de nosotros, intervendrá lo cómodo que nos sintamos trabajando con un sistema en concreto y que es lo que queremos crear.

Aunque cada sistema es único, todos (y no me refiero solo a WordPress y a Drupal) trabajan de forma similar en cuanto a la forma de publicar, moderar y dar formato al contenido.

Los Sistemas de gestión de foros como SMF o PHPBB también se podrían considerar dentro de la categoría de CMS, puesto que hacen lo mismo, permiten publicar, editar y borrar contenido almacenado en la base de datos, ademas de poder cambiar el ‘theme‘ de forma separada al sistema.

Mucha gente usa sin saberlo CMS en Internet, en servicios de blogs ya configurados, en foros etc.. pero muchos de ellos no saben como funcionan o por donde empezar si quisieran hacer algo parecido, es por eso que voy a montar un CMS paso a paso, explicando detalladamente que hace falta y para que se usa cada cosa.

La idea principal (sujeta a cambios), es crear un CMS con foro incluido, que permita añadir módulos sin mucha complicación una vez creado todo el sistema base y que tenga roles para los usuarios donde se distinguirá Inactivo, Usuario, Administrador, y otros que se quieran añadir.

Para este proyecto voy a usar xhtml, css, php5, mysql, y Jquery que es un Framework javascript que me hace mas fácil muchas cosas, entre ellas el uso de ajax.

Si quieres seguir el proceso es conveniente que tengas conocimientos previos de SQL, PHP y XHTML, aunque intentare explicarlo todo para que les resulte fácil a los menos experimentados.

Para empezar debemos de montar la estructura de la base de datos, no sera ni por asomo la estructura definitiva, si no que esta ira sufriendo cambios a lo largo del proceso, pero por algo tenemos que empezar ¿verdad?. Yo la he llamado cms.

Primero necesitamos una tabla donde registrar a los usuarios y controlar quien puede y no puede escribir en nuestro gestor de contenidos ,esta debe de contener:

- ID: Sera el numero de identificación del usuario
- USER: El nombre que el usuario elegirá para entrar en el cms
- NAME: El nombre que el usuario decidirá mostrar una vez dentro del cms
- PASS: La contraseña del usuario (Estará en MD5 para evitar problemas de seguridad)
- EMAIL: Un email de contacto
- DATE: La fecha en la que se registro el usuario
- LAST_DATE: Fecha del ultimo movimiento del usuario en el cms
- IP: Dirección ip desde la que el usuario registro su cuenta
- LAST_IP: Ultima dirección ip que tuvo el usuario
- STATUS: Indicara si el usuario tiene su cuenta inactiva (0), si es un usuario normal (1) o que rol tiene (otro numero)

De momento con esos campos tenemos suficiente, en un futuro se puede ampliar para aportar mas datos, permitir avatares, etc…

Esta es la tabla:

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `users` (
  2.   `id` INT(5) NOT NULL AUTO_INCREMENT,
  3.   `user` VARCHAR(33) NOT NULL,
  4.   `name` VARCHAR(33) NOT NULL,
  5.   `pass` VARCHAR(33) NOT NULL,
  6.   `email` VARCHAR(50) NOT NULL,
  7.   `date` INT(15) NOT NULL,
  8.   `last_date` INT(15) NOT NULL,
  9.   `ip` VARCHAR(128) NOT NULL,
  10.   `last_ip` VARCHAR(128) NOT NULL,
  11.   `status` SMALLINT(2) NOT NULL,
  12.   PRIMARY KEY (`id`),
  13.   UNIQUE KEY `user` (`user`,`email`)
  14. )

Si nos fijamos en el ultimo campo de la tabla users vemos que ahí controlamos si el usuario tiene su cuenta activa, y que rol tiene. ¿Que es un rol? Un rol vendría a ser un papel o funciones que una persona tiene que cumplir, adaptándolo a nuestro sistema el ser Administrador o moderador es tener un rol. Entonces ¿Quien define que tipo de roles hay y cuantos?, fácil, nosotros.

Creamos otra tabla con los siguientes campos:

- ID: Identificación numérica del rol
- NAME: El nombre que elijamos para ese rol, admin, administrador, colaborador, lo que queramos.
- DESCRIPTION: Descripción de las funciones del rol, a nivel informativo solamente.
- PERMISSION: Permisos que tendrá el Rol sobre el cms

El campo permission esta pensado de cara al futuro para posibles funciones que queramos añadir, pero no adelantemos acontecimientos aun.

Esta es la tabla:

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `users_role` (
  2.   `id` INT(5) NOT NULL AUTO_INCREMENT,
  3.   `name` VARCHAR(30) NOT NULL,
  4.   `description` text NOT NULL,
  5.   `permission` VARCHAR(30) NOT NULL,
  6.   PRIMARY KEY (`id`)
  7. )

Bien, hasta el momento ya hemos pensado como va a ser la estructura de las tablas que controlan a los usuarios, pero ¿que es un CMS sin contenido que gestionar?, necesitamos pensar que tablas necesitamos para controlar el contenido.

Ahora necesitamos una con los campos correspondientes para almacenar el contenido, el usuario, y algunas cosas mas, estos serian los campos que vamos a usar:

- ID: Identificación numérica de la revisión (¡Ojo! de la revisión no del contenido)
- CID: Identificación numérica del contenido
- TYPE: El tipo de contenido
- REVISION: La revisión seria una copia de seguridad del contenido
- USER: el usuario que envía el contenido
- DATE: Fecha en la que se envía el contenido
- DATE_PUBLISHED: Fecha de publicación del contenido
- TITLE: Titulo del contenido
- CONTENT: Cuerpo del contenido
- CATEGORY: Categoría en la que se clasifica el contenido
- TAGS: Etiquetas de referencia sobre el contenido
- COMMENT_ALLOWED: Permitir los comentarios o no…

Esta es la tabla:

Código SQL:
Ver original
  1. `id` INT(10) NOT NULL AUTO_INCREMENT,
  2.   `cid` INT(10) NOT NULL,
  3.   `type` INT(5) NOT NULL,
  4.   `revision` INT(10) NOT NULL,
  5.   `user` INT(5) NOT NULL,
  6.   `date` INT(15) NOT NULL,
  7.   `status` SMALLINT(1) NOT NULL,
  8.   `date_published` INT(15) NOT NULL,
  9.   `title` text NOT NULL,
  10.   `content` longtext NOT NULL,
  11.   `category` INT(10) NOT NULL,
  12.   `tags` VARCHAR(150) NOT NULL,
  13.   `comment_allowed` tinyint(1) NOT NULL,
  14.   PRIMARY KEY (`id`)
  15. )

Algo muy importante es poder elegir si el contenido que queremos introducir es una entrada del blog, una pagina, un post, o cualquier otra cosa que queramos, así que vamos a definir una tabla para controlar el tipo de contenido.

- ID: Identificación numérica del tipo de contenido
- NAME: Nombre del tipo, por ejemplo ‘Entrada’ o ‘Pagina’
- DESCRIPTION: Breve descripción sobre el uso de este tipo de contenido
- COMMENT_ALLOWED: Comentarios permitidos
- ACCESS_ROLE: Que roles pueden acceder a los contenidos de este tipo
- DEL_ROLE: Que roles pueden borrar los contenidos de este tipo
- EDIT_ROLE: Que roles pueden editar los contenidos de este tipo

Aunque en la tabla content ya tengamos la opcion comment_allowed para permitir o no el envió de comentarios, es importante usarlo también aquí para darle un valor por defecto al tipo de contenido, luego puede ser que nosotros queramos desactivar los comentarios en alguna situación excepcional aunque el tipo de contenido lo permita.

Esta es la tabla

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `content_type` (
  2.   `id` INT(5) NOT NULL AUTO_INCREMENT,
  3.   `name` VARCHAR(50) NOT NULL,
  4.   `description` text NOT NULL,
  5.   `comment_allowed` tinyint(1) NOT NULL,
  6.   `access_role` VARCHAR(50) NOT NULL,
  7.   `del_role` VARCHAR(50) NOT NULL,
  8.   `edit_role` VARCHAR(50) NOT NULL,
  9.   PRIMARY KEY (`id`)
  10. )

Por ultimo nos quedan dos tablas, una para las categorías y otra para las etiquetas o tags, son ambas muy simples y no necesitan explicación.

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `tags` (
  2.   `id` INT(5) NOT NULL AUTO_INCREMENT,
  3.   `name` VARCHAR(50) NOT NULL,
  4.   PRIMARY KEY (`id`)
  5. )
  6.  
  7. CREATE TABLE IF NOT EXISTS `category` (
  8.   `id` INT(5) NOT NULL AUTO_INCREMENT,
  9.   `name` VARCHAR(50) NOT NULL,
  10.   PRIMARY KEY (`id`)
  11. )

Con estas 6 tablas ya tenemos una estructura básica para seguir avanzando, pero eso sera en otro post. Cualquier duda o sugerencia sera bien recibida.

Un Saludo
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez

Última edición por Nazari; 13/01/2011 a las 15:31
  #2 (permalink)  
Antiguo 13/01/2011, 19:02
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
2 Parte - La Instalacion

2 Parte - La Instalación

Continuando con el tutorial sobre como entender el funcionamiento de un CMS y ser capaz de crear uno propio muy básico, vamos a hablar de la instalación.

Normalmente cuando tenemos pensado instalar un sistema de gestión de contenidos lo primero que debemos hacer es descargarlo, ya sea de pago o libre lo normal es que lo encontremos en Internet en un archivo comprimido, por supuesto hay empresas con CMS propios o que usan sistemas libres y hacen el trabajo de instalarlo por nosotros, pero como el objetivo de la guía es aprender hacemos todo el trabajo nosotros ;) .

Una vez descargado vemos que el archivo comprimido contiene diferentes archivos y directorios, y nuestra labor consiste en descomprimir ese archivo en nuestro servidor, esos archivos son el corazón del CMS, todos y cada uno de ellos tiene una función, ya puede ser individual o relacionándose con otros archivos, cuando estén descomprimidos todos los archivos en nuestro servidor accedemos al dominio para comprobar que funciona correctamente el CMS, pero al entrar nos damos cuenta de que aun no esta todo hecho, el CMS ¡hay que instalarlo!, al acceder por primera vez al dominio suele aparecer una ventana de Instalación que nos pedirá ciertos datos, como nombre de la base de datos, usuario de la base de datos, etc… Al terminar de rellenar esos datos y darle a aceptar es cuando se ‘Instala’ el CMS, realmente lo que ha pasado es que ha volcado todos los datos necesarios para su funcionamiento en la Base de Datos que le hemos indicado, y en algunos casos puede haber realizado alguna pequeña modificación en algún Archivo.

En la primera parte de esta guía definimos la estructura de nuestra base de datos, puede sufrir modificaciones a lo largo del proceso del CMS, pero es una estructura básica que nos resultara útil de momento. Siguiendo a partir de ahí debemos de saber que al entrar a un dominio, por ejemplo http://www.nazariglez.com o http://localhost/ el archivo que carga se llama index, este puede ser index.php, index.html, index.htm o otro que este indicado en la configuración del servidor, así que nosotros necesitaremos también un index.php. Ademas necesitamos otro archivo llamado install.php que contendrá todo el código que hará la instalación de nuestro sistema.

De momento nuestro index.php al ejecutarse deberá de comprobar que config.php existe, si la respuesta es negativa redireccionamos a install.php, en caso de que config.php exista significa que ya esta instalado el sistema y se mostrara el index normalmente.

index.php:

Código PHP:
Ver original
  1. <?php
  2.  
  3. //Comprobamos que existe el archivo config.php
  4. if (!file_exists("config.php")){
  5.   //Si existe redireccionamos al archivo install.php
  6.   header("Location: install.php");
  7. } else {
  8.   //Si no existe ejecutamos el index normalmente
  9.   echo "El sistema se ha instalado correctamente";
  10. }
  11.  
  12. ?>

El archivo install.php tiene que contar con varias partes para que se configure todo correctamente, un formulario ha de pedir los datos de la base de datos que vamos a usar y del usuario que hará de administrador de nuestro CMS, otra parte ha de comprobar que se han rellenado todos los datos y por ultimo si esta todo correcto deberá ejecutarse.

install.php:

---------- Continua en el siguiente Post!!! --------------
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez
  #3 (permalink)  
Antiguo 13/01/2011, 19:08
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
Continuacion 2Parte

Continuacion 2 Parte!

install.php
Código PHP:
Ver original
  1. <?php
  2.  
  3. //Si el archivo config.php existe significa que el sistema ya fue instalado
  4. if (file_exists("config.php")){
  5.   die("<strong>El sistema ya esta instalado</strong>");
  6. }
  7.  
  8. //Si se envió el formulario comprobamos que todos los campos estén rellenos
  9. if ($_POST['submit']){
  10.   if (empty($_POST["db-host"])){
  11.     echo "Debes de rellenar el campo 'Host de la base de datos'<br />";
  12.     $return = 1;
  13.   }
  14.   if (empty($_POST["db-name"])){
  15.     echo "Debes de rellenar el campo 'Nombre de la base de datos'<br />";
  16.     $return = 1;
  17.   }
  18.   if (empty($_POST["db-user"])){
  19.     echo "Debes de rellenar el campo 'Usuario de la base de datos'<br />";
  20.     $return = 1;
  21.   }
  22.   if (empty($_POST["db-pass"])){
  23.     echo "Debes de rellenar el campo 'Contraseña de la base de datos'<br />";
  24.     $return = 1;
  25.   }
  26.   if (empty($_POST["admin-name"])){
  27.     echo "Debes de rellenar el campo 'Usuario'<br />";
  28.     $return = 1;
  29.   }
  30.   if (empty($_POST["admin-pass"])){
  31.     echo "Debes de rellenar el campo 'Contraseña'<br />";
  32.     $return = 1;
  33.   }
  34.   if (empty($_POST["admin-email"])){
  35.     echo "Debes de rellenar el campo 'Correo Electrónico'<br />";
  36.     $return = 1;
  37.   }
  38.   if ($_POST["admin-pass"] != $_POST["admin-2pass"]){
  39.     echo "Las Contraseñas de usuario no coinciden<br />";
  40.     $return = 1;
  41.   }
  42.  
  43.   //En el caso de que algún campo no este relleno no se continua con la instalación
  44.   if (isset($return)){
  45.     echo "<br /><br /><a href=\"install.php\">Volver al Formulario</a>";
  46.   } else {
  47.     echo "Comenzando Instalación<br />";
  48.  
  49.     //Conectamos con la base de datos que el usuario nos ha proporcionado
  50.     $con=mysql_connect($_POST["db-host"],$_POST["db-user"],$_POST["db-pass"]);
  51.     mysql_select_db($_POST["db-name"],$con);
  52.     if (!$con){
  53.       die("No se puede establecer conexión con la base de datos, por favor comprueba los datos. <br /><br /><a href=\"install.php\">Volver al Formulario</a>");
  54.     }
  55.  
  56.     //Definimos las tablas en un array(), creamos roles básicos y usuario admin
  57.     $db_tables = array(
  58.     "CREATE TABLE IF NOT EXISTS `category` (
  59.    `id` int(5) NOT NULL AUTO_INCREMENT,
  60.    `name` varchar(50) NOT NULL,
  61.    PRIMARY KEY (`id`)
  62.    )",
  63.     "CREATE TABLE IF NOT EXISTS `content` (
  64.    `id` int(10) NOT NULL AUTO_INCREMENT,
  65.    `cid` int(10) NOT NULL,
  66.    `type` int(5) NOT NULL,
  67.    `revision` int(10) NOT NULL,
  68.    `user` int(5) NOT NULL,
  69.    `date` int(15) NOT NULL,
  70.    `status` smallint(1) NOT NULL,
  71.    `date_published` int(15) NOT NULL,
  72.    `title` text NOT NULL,
  73.    `content` longtext NOT NULL,
  74.    `category` int(10) NOT NULL,
  75.    `tags` varchar(150) NOT NULL,
  76.    `comment_allowed` tinyint(1) NOT NULL,
  77.    PRIMARY KEY (`id`)
  78.    )",
  79.     "CREATE TABLE IF NOT EXISTS `content_type` (
  80.    `id` int(5) NOT NULL AUTO_INCREMENT,
  81.    `name` varchar(50) NOT NULL,
  82.    `description` text NOT NULL,
  83.    `comment_allowed` tinyint(1) NOT NULL,
  84.    `access_role` varchar(50) NOT NULL,
  85.    `del_role` varchar(50) NOT NULL,
  86.    `edit_role` varchar(50) NOT NULL,
  87.    PRIMARY KEY (`id`)
  88.    )",
  89.     "CREATE TABLE IF NOT EXISTS `tags` (
  90.    `id` int(5) NOT NULL AUTO_INCREMENT,
  91.    `name` varchar(50) NOT NULL,
  92.    PRIMARY KEY (`id`)
  93.    )",
  94.     "CREATE TABLE IF NOT EXISTS `users` (
  95.    `id` int(5) NOT NULL AUTO_INCREMENT,
  96.    `user` varchar(33) NOT NULL,
  97.    `name` varchar(33) NOT NULL,
  98.    `pass` varchar(33) NOT NULL,
  99.    `email` varchar(50) NOT NULL,
  100.    `date` int(15) NOT NULL,
  101.    `last_date` int(15) NOT NULL,
  102.    `ip` varchar(128) NOT NULL,
  103.    `last_ip` varchar(128) NOT NULL,
  104.    `status` smallint(2) NOT NULL,
  105.    PRIMARY KEY (`id`),
  106.    UNIQUE KEY `user` (`user`,`email`)
  107.    )",
  108.     "CREATE TABLE IF NOT EXISTS `users_role` (
  109.    `id` int(5) NOT NULL AUTO_INCREMENT,
  110.    `name` varchar(30) NOT NULL,
  111.    `description` text NOT NULL,
  112.    `permission` varchar(30) NOT NULL,
  113.    PRIMARY KEY (`id`)
  114.    )",
  115.     "INSERT INTO users (user, pass, email, date, ip, status) values (
  116.    '".$_POST["admin-name"]."',
  117.    '".md5($_POST["admin-pass"])."',
  118.    '".$_POST["admin-email"]."',
  119.    '".time()."',
  120.    'host',
  121.    '2'
  122.    )",
  123.     "INSERT INTO users_role (name, description) values (
  124.    'Usuario',
  125.    'Usuario registrado'
  126.    )",
  127.     "INSERT INTO users_role (name, description) values (
  128.    'Admin',
  129.    'Usuario Administrador'
  130.    )" );
  131.  
  132.     //Mediante un foreach ejecutamos todas sentencias almacenadas en el array anterior
  133.     foreach($db_tables as $x){
  134.       $query = mysql_query($x)or die(mysql_error());
  135.     }
  136.  
  137.     //Cerramos la conexión con la base de datos
  138.     mysql_close($con);
  139.  
  140.     //Montamos en una variable el contenido del archivo config.php
  141.     $config_info = "<?php\n/* Archivo config.php generado por el sistema */\n\n\$bdhost = \"".$_POST["db-host"]."\";\n\$bdname = \"".$_POST["db-name"]."\";\n\$bduser = \"".$_POST["db-user"]."\";\n\$bdpass = \"".$_POST["db-pass"]."\";\n?>";
  142.  
  143.     //Comprobamos que podemos escribir en la carpeta raíz del sistema
  144.     if (is_writable("./") != 1) {
  145.       echo "No se ha podido crear config.php por un problema con los permisos de la carpeta raíz, tu mismo puedes crear el archivo config.php con el siguiente contenido para terminar la instalación, una vez hecho <a href=\"index.php\">Vuelve al Inicio</a>. <br />";
  146.       echo "<textarea cols=\"40\" rows=\"10\">".$config_info."</textarea>";
  147.     } else {
  148.  
  149.       //Creamos y rellenamos el archivo config.php con la información que nos ha dado el usuario
  150.       $keys_file = fopen("config.php","w");
  151.       fwrite($keys_file, $config_info);
  152.       fclose($keys_file);
  153.       echo "<br />Se ha completado la instalación con éxito<br /><a href=\"index.php\">Volver al Inicio</a>";
  154.     }
  155.   }
  156.  
  157. } else {
  158.  
  159.   //Este es el formulario de instalación
  160.   ?>
  161.   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  162.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  163.   <html xmlns="http://www.w3.org/1999/xhtml">
  164.     <head>
  165.       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  166.       <link type="text/css" rel="stylesheet" media="all" href="style.css" />
  167.       <title>Instalador de Capricorn CMS</title>
  168.     </head>
  169.     <body>
  170.     <div id="install">
  171.       <form action="install.php" method="post">
  172.       <div id="install-title">Instalador</div>
  173.       <table>
  174.         <tr><td colspan="2" class="install-td">Información sobre la Base de datos</td></tr>
  175.         <tr><td>Host de la base de datos:</td><td><input type="text" name="db-host" value="localhost" /></td></tr>
  176.         <tr><td>Nombre de la base de datos:</td><td><input type="text" name="db-name" value="Nombre" /></td></tr>
  177.         <tr><td>Usuario de la base de datos:</td><td><input type="text" name="db-user" value="Usuario" /></td></tr>
  178.         <tr><td>Contraseña de la base de datos:</td><td><input type="password" name="db-pass" /></td></tr>
  179.         <tr><td colspan="2" class="install-td">Información sobre el Administrador</td></tr>
  180.         <tr><td>Usuario:</td><td><input type="text" name="admin-name" value="Nombre" /></td></tr>
  181.         <tr><td>Contraseña:</td><td><input type="password" name="admin-pass" /></td></tr>
  182.         <tr><td>Repetir Contraseña:</td><td><input type="password" name="admin-2pass" /></td></tr>
  183.         <tr><td>Correo Electrónico:</td><td><input type="text" name="admin-email" value="Email" /></td></tr>
  184.         <tr><td colspan="2" class="install-td"><input type="submit" name="submit" value="Instalar" /></td></tr>
  185.       </table>
  186.       </form>
  187.     </div>
  188.     </body>
  189.   </html>
  190. <?php
  191. }
  192. ?>

De momento no entraremos en cuestiones de seguridad ni de requisitos, pero hay que tener en cuenta que el programador no puede fiarse del uso que le darán los Usuarios a su código, así que todo contenido que entre al CMS para ser almacenado en la BD o mostrado en pantalla debería de pasar por unas funciones para limpiar cualquier código malicioso que pueda contener. Sobre los requisitos hablaremos también en otra entrada, ya que por el momento no es necesario complicar mas esta parte, pero tendremos que definir unas reglas para elegir nombre de usuario, contraseña, email, etc… como por ejemplo el numero de caracteres permitidos.

Algo muy importante de install.php es que maneja archivos y directorios, esto conlleva varias dificultades sobretodo relacionadas con los permisos de estos. En caso de que el instalador no pueda crear config.php nos dará su contenido para que lo creemos a mano, aunque si el directorio tiene los permisos adecuados se creara sin que tengamos que intervenir.

Una ultima cosa, si os fijáis he almacenado las sentencias SQL en un array(), y luego las ejecuto mediante un foreach(), estoy seguro de que hay una forma mejor de hacer esto, pero por mucho que intente cargar un *.sql externo o almacenar las sentencias en una sola variable, siempre me daba error de Sintaxis, pero si las ejecuto de forma separada no me da ningún error, si alguien sabe como hacerlo estaré muy agradecido.

Os dejo un archivo rar que contiene los script de la entrada. He añadido una hoja de estilo para que no se vea tan feo el instalador.



Cualquier duda o sugerencia es bienvenida.
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez
  #4 (permalink)  
Antiguo 13/01/2011, 22:14
 
Fecha de Ingreso: enero-2011
Mensajes: 44
Antigüedad: 13 años, 10 meses
Puntos: 1
Respuesta: Creando un CMS

Saludos, si pudieras agregar unas imagenes de todo en funcionamiento, seria mucho mejor, por que dicen que 1 imagen vale mas de 1000 palabras.
  #5 (permalink)  
Antiguo 14/01/2011, 06:04
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
Respuesta: Creando un CMS

Cita:
Iniciado por DiamanteZero Ver Mensaje
Saludos, si pudieras agregar unas imagenes de todo en funcionamiento, seria mucho mejor, por que dicen que 1 imagen vale mas de 1000 palabras.
Buenas, lo cierto es que por el momento no hay muchas imágenes que pueda añadir, aparte de la que esta en el post anterior, que es la del formulario de instalación, porque al darle al botón de instalar lo único que se muestra es "El sistema se ha Instalado correctamente" o si falta algún campo para rellenar, quizás el script del instalador me quedo largo y se hace difícil leer y entender los comentarios, pero es que no encontré la forma de cargar un sql externo, para la próxima parte de la guía intentare hacerla de forma mas simple y mejor explicada, y por supuesto en cuanto pueda subir alguna imagen que sirva de referencia.

Un Saludo!!
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez
  #6 (permalink)  
Antiguo 14/01/2011, 21:19
(Desactivado)
 
Fecha de Ingreso: noviembre-2010
Ubicación: Malaga
Mensajes: 225
Antigüedad: 14 años
Puntos: 0
Respuesta: Creando un CMS

-Siempre me a gustado que pongan un enlace en algun subdominio o web para animarse a hacer estos aportes , pero me da una pereza .
  #7 (permalink)  
Antiguo 18/01/2011, 11:45
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
Respuesta: Creando un CMS

Ahora que tenemos nuestra base de datos instalada, y un index.php (semi vacio) es el momento de preparar algunas cosas básicas.

Un CMS nos permite movernos entre sus paginas de una forma paginada y ordenada, así podemos cambiar a la sección de registrar usuarios, ver entradas, comentar, etc.. sin necesidad de cambiar de script continuamente, esto se hace mediante includes y peticiones _GET. Para el programador es una gran ventaja, puesto que no tiene que repetir código en todos los scripts, y si surge un fallo sabe que lo tiene en un solo script y que no tendrá que modificar todos los demás. De esta forma el mantenimiento y modificación del sistema es mas ordenado y fácil. Esto es llamado comúnmente como programación modular.

Puesto que el desarrollo del sistema se va complicado poco a poco, vamos a preparar y crear diferentes scripts que nos sirvan de cara al futuro.

Primero nos dirigimos al index.php y en la parte superior definimos una constante que nos servirá para evitar que se ejecuten scripts de forma separada al index.

Código PHP:
Ver original
  1. define("CAPRICORN", 1);

Podemos usar el nombre de la constante que nosotros queramos, yo he usado CAPRICORN, mi consejo es que pongamos en mayúsculas siempre las constantes, de esta forma las diferenciaremos rápidamente.

Ahora incluimos un archivo llamado sec.php (el cual aun no hemos creado) que estará dentro de un directorio llamado includes, se encargara de mostrarnos la sección que le pidamos mediante _GET, también debemos incluir el script config.php que nos genero el instalador, pero ambos han de ser incluidos dentro del if() que tiene que comprobar si el sistema ya esta instalado, ademas, en caso de fallo al incluir el script el resto de la pagina no debe de cargar, para esto usaremos require(); y una vez incluido config.php hacemos conexión a la base de datos usando las variables que contiene, el index.php debe de quedar así:

Código PHP:
Ver original
  1. <?php
  2.  
  3. define("CAPRICORN", 1); //Definimos una constante para evitar que se ejecuten scripts por separado.
  4.  
  5. //Comprobamos que existe el archivo config.php
  6. if (!file_exists("config.php")){
  7.  
  8.   //Si existe redireccionamos al archivo install.php
  9.   header("Location: install.php");
  10.  
  11. } else {
  12.  
  13.   //Si no existe ejecutamos el index normalmente
  14.   require("config.php"); //Requerimos config.php
  15.   require("includes/sec.php"); //Requerimos pag.php
  16.  
  17.   //Conectamos con la base de datos
  18.   $con=mysql_connect($bdhost,$bduser,$bdpass);
  19.   mysql_select_db($bdname,$con);
  20.  
  21.   //Incluimos el contenido definido en sec.php
  22.   include($include_scp);
  23.  
  24.   //Cerramos la conexion
  25.   mysql_close($con);
  26.  
  27. }
  28.  
  29. ?>

Lo siguiente es crear el directorio includes y el script sec.php en su interior.

El script sec.php debe ‘morir‘ o redirigirse a el index si alguien entra directamente al directorio http://localhost/includes/sec.php, para eso ya definimos una constante en el index.php, ahora solamente tenemos que comprobar que la constate esta definida cuando se ejecuta sec.php, para eso lo primero que debe contener sec.php es lo siguiente:

Código PHP:
Ver original
  1. if (!defined('CAPRICORN')){
  2. header('Location: index.php');
  3. }

De esta forma evitamos que sea ejecutado de forma separada del index.php.

Ahora usaremos la función switch(), la cual es muy similar a if,else, para comparar la variable que entra por _GET y incluir el archivo necesario. El archivo sec.php debe de quedar asi:

Código PHP:
Ver original
  1. <?php
  2.  
  3. //Si el script se ejecuta de forma separada a index.php redireccionamos al index.
  4. if (!defined('CAPRICORN')){
  5.   header('Location: index.php');
  6. }
  7.  
  8. //Comprobamos que _GET tiene el valor sec
  9. if(isset($_GET['sec'])){
  10.  
  11.   //Si lo tiene definimos scripts a incluir segun su valor.
  12.   switch ($_GET['sec']){
  13.     case registro:
  14.       $include_scp = "includes/register.php";
  15.     break;
  16.     default:
  17.       $include_scp = "includes/index.php";
  18.     break;
  19.   }
  20.  
  21. }else{
  22.  
  23.   //Si _GET no tiene valor o no es sec, definimos una script por defecto a incluir.
  24.   $include_scp = "includes/index.php";
  25.  
  26. }
  27. ?>

Como se ve he incluido una referencia a un script por defecto y otro a ‘registro‘ que dirige a la script register.php, de momento quedan esos dos, pero se añadirán muchos mas que formaran la base de nuestro sistema, y en un futuro inventamos algo para añadir módulos o plugins adicionales sin necesidad de modificar la script.

Ahora lo que tenemos que hacer es crear dentro del directorio includes los archivos index.php y register.php, a los cuales hay que añadirle que compruebe que son ejecutados a través del index principal, podrían ser estos:

register.php:

Código PHP:
Ver original
  1. <?php
  2.  
  3. //Si el script se ejecuta de forma separada a index.php redireccionamos al index.
  4. if (!defined('CAPRICORN')){
  5.   header('Location: index.php');
  6. }
  7.  
  8. echo "Te encuentras ahora mismo en register.php";
  9.  
  10. ?>

index.php:

Código PHP:
Ver original
  1. <?php
  2.  
  3. //Si el script se ejecuta de forma separada a index.php redireccionamos al index.
  4. if (!defined('CAPRICORN')){
  5.   header('Location: index.php');
  6. }
  7.  
  8. echo "Te encuentras ahora mismo en el index.php";
  9.  
  10. ?>

Así al entrar en http://localhost/index.php nos estará mostrando includes/index.php y al entrar en http://localhost/index.php?sec=registro nos mostrara includes/register.php.

De momento ya tenemos montada la base de un sistema de gestión modular, podeis encontrar todos los script usados hasta ahora aquí.

Estaré encantado de leer dudas y sugerencias.
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez
  #8 (permalink)  
Antiguo 23/01/2011, 07:18
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
Respuesta: Creando un CMS

A estas alturas ya tenemos instalado nuestro CMS y preparada la mecánica de nuestro entorno modular, ademas en la instalación definimos un único usuario, que hará de administrador, pero ¿que hacemos si queremos permitir registrar mas usuarios? Pues haremos un sistema de registro :P .

Anteriormente creamos una script en includes/ llamada register.php, nos dirigimos a ella y empezamos a preparar nuestro sistema de registro.

La script register.php va a tener dos partes, una de ellas es el formulario de registro en xhtml y la otra parte servirá para procesar el envío, para esto usaremos if().
Yo estoy a favor de usar todas las script que necesite de forma que las llames cuando te hagan falta siempre dentro de un limite, pero en este caso crear dos archivos separados para un registro no lo veo realmente útil.

Dentro de register.php y siempre debajo de

Código PHP:
Ver original
  1. if (!defined('CAPRICORN')){
  2.   header('Location: index.php');
  3. }

comenzamos nuestro script, siempre debajo porque lo primero que se debe de comprobar es que la constante esta definida para evitar problemas de seguridad.

Añadimos un if() muy simple que controle el valor ‘submit‘ que entra por _POST, si $_POST['submit'] existe procesamos el envío, si no es así presentamos el formulario de registro, seria algo así:

Código PHP:
Ver original
  1. if(isset($_POST['submit'])){
  2.  
  3.   //Ahora procesamos el envio
  4.  
  5. }else{
  6.  
  7.   //Mostramos el formulario
  8.  
  9. }

Ahora dentro del if() en la primera parte que es la que se muestra si se envió el formulario añadimos diferentes parámetros que usaremos de requisitos para el registro, yo lo usare para controlar el máximo y el mínimo de caracteres del usuario y contraseña, pero hay muchas mas posibilidades dependiendo de lo que quieras controlar, también habría que comprobar si el email es valido mediante expresiones regulares, pero por el momento lo dejamos así.

Código PHP:
Ver original
  1. $user_min_len = 4;
  2.   $user_max_len = 32;
  3.   $pass_min_len = 6;
  4.   $pass_max_len = 32;


Una vez definidas las variables pasamos a comprobar que al enviar el formulario se rellenaron todos los campos y que ademas de estar rellenos cumplen con nuestros requisitos, para eso usaremos las funciones empty() y la función strlen() la cual cuenta el numero de caracteres, y en caso de no cumplir lo que buscamos definimos la variable $return = 1. Algo así:

Código PHP:
Ver original
  1. //Comprobamos que el campo usuario no este vacio.
  2.   if(!empty($_POST['user_name'])){
  3.  
  4.     //Comprobamos que cumplan los requisitos que definimos
  5.     if((strlen($_POST['user_name']) < $user_min_len)||(strlen($_POST['user_name']) > $user_max_len)){
  6.       echo "El usuario no puede ser menor de ".$user_min_len." ni mayor de ".$user_max_len." letras. <br />";
  7.       $return = 1;
  8.     }
  9.   }else{
  10.  
  11.     //En caso de que este vacío
  12.     echo "Tienes que rellenar el campo de usuario <br />";
  13.     $return = 1;
  14.  
  15.   }

Debemos de hacer igual pero para el campo password, que sera el que almacene la contraseña, y para el campo email, pero en el caso del correo electrónico solamente comprobaremos que no esta vacío.

Lo siguiente sera comprobar que el nombre de usuario no este ya registrado, asi evitamos errores con la base de datos, para ello hacemos una consulta a la base de datos de la siguiente forma:

Código PHP:
Ver original
  1. //Comprobamos en la base de datos que no existe ya el usuario
  2.   $sql = mysql_query("SELECT * FROM users WHERE user='".$_POST['user_name']."'");
  3.   if($user_ok = mysql_fetch_array($sql)) //si existe pedimos uno nuevo.
  4.   {
  5.       echo "El usuario ya existe <br />";
  6.       $return = 1;
  7.   }

La ultima comprobación que hacemos aquí es si la variable $return fue definida, puesto que si se definió significa que hubo alguna incidencia, si no la hubo registramos al usuario, pasamos por md5() la contraseña y terminamos con el procesos del formulario.

Código PHP:
Ver original
  1. //Nos aseguramos de que la variable return no se haya definido para poder continuar
  2.   if(isset($return)){
  3.     echo "<br /><a href=\"index.php?sec=registro\">Volver al Formulario</a>";
  4.   }else{
  5.  
  6.     //Introducimos los datos del nuevo usuario en la base de datos
  7.     mysql_query("INSERT INTO users (user, pass, email, date, status) values ('".$_POST['user_name']."','".$_POST['password']."','".$_POST['email']."','".time()."','1')")or die(mysql_error());
  8.     echo "Usuario registrado correctamente";
  9.     echo "<br /><a href=\"index.php\">Volver al Indice</a>";
  10.   }

Ya podemos olvidarnos de esta parte del script, ahora nos centramos en el formulario, el cual ha de ser muy simple, solamente pedimos usuarios, contraseña y email, y enviamos el resultado a index.php?sec=registro, este podría ser el resultado final de nuestro script de registro:

register.php:

Código PHP:
Ver original
  1. <?php
  2.  
  3. //Si el script se ejecuta de forma separada a index.php redireccionamos al index.
  4. if (!defined('CAPRICORN')){
  5.   header('Location: index.php');
  6. }
  7.  
  8. //Comprobamos que se envió el fomulario
  9. if(isset($_POST['submit'])){
  10.  
  11.   //Definimos requisitos de maximo y minimo de usuario y contraseña
  12.   $user_min_len = 4;
  13.   $user_max_len = 32;
  14.   $pass_min_len = 6;
  15.   $pass_max_len = 32;
  16.  
  17.   //Comprobamos que el campo usuario no este vacio.
  18.   if(!empty($_POST['user_name'])){
  19.  
  20.     //Comprobamos que cumplan los requisitos que definimos
  21.     if((strlen($_POST['user_name']) < $user_min_len)||(strlen($_POST['user_name']) > $user_max_len)){
  22.       echo "El usuario no puede ser menor de ".$user_min_len." ni mayor de ".$user_max_len." letras. <br />";
  23.       $return = 1;
  24.     }
  25.   }else{
  26.  
  27.     //En caso de que este vacio
  28.     echo "Tienes que rellenar el campo de usuario <br />";
  29.     $return = 1;
  30.  
  31.   }
  32.  
  33.   //Comprobamos que el campo contraseña no este vacio
  34.   if(!empty($_POST['password'])){
  35.  
  36.     //Comprobamos que cumplan los requisitos que definimos
  37.     if((strlen($_POST['password']) < $pass_min_len)||(strlen($_POST['password']) > $pass_max_len)){
  38.       echo "La Contraseña no puede ser menor de ".$user_min_len." ni mayor de ".$user_max_len." letras. <br />";
  39.       $return = 1;
  40.     }
  41.   }else{
  42.  
  43.     //En caso de que este vacio
  44.     echo "Tienes que rellenar el campo de Constraseña <br />";
  45.     $return = 1;
  46.  
  47.   }
  48.  
  49.   //Comprobamos que el campo email este vacio
  50.   if(empty($_POST['email'])){
  51.  
  52.     //En caso de que este vacio
  53.     echo "Tienes que rellenar el campo de Email <br />";
  54.     $return = 1;
  55.  
  56.   }
  57.  
  58.   //Comprobamos en la base de datos que no existe ya el usuario
  59.   $sql = mysql_query("SELECT * FROM users WHERE user='".$_POST['user_name']."'");
  60.   if($user_ok = mysql_fetch_array($sql)) //si existe pedimos uno nuevo.
  61.   {
  62.       echo "El usuario ya existe <br />";
  63.       $return = 1;
  64.   }
  65.  
  66.  
  67.   //Nos aseguramos de que la variable return no se haya definido para poder continuar
  68.   if(isset($return)){
  69.     echo "<br /><a href=\"index.php?sec=registro\">Volver al Formulario</a>";
  70.   }else{
  71.  
  72.     //Introducimos los datos del nuevo usuario en la base de datos
  73.     mysql_query("INSERT INTO users (user, pass, email, date, status) values ('".$_POST['user_name']."','".$_POST['password']."','".$_POST['email']."','".time()."','1')")or die(mysql_error());
  74.     echo "Usuario registrado correctamente";
  75.     echo "<br /><a href=\"index.php\">Volver al Indice</a>";
  76.   }
  77.  
  78.  
  79. }else{  //Mostramos el formulario de envio
  80.  
  81.   ?>
  82.   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  83.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  84.   <html xmlns="http://www.w3.org/1999/xhtml">
  85.     <head>
  86.       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  87.       <link type="text/css" rel="stylesheet" media="all" href="style.css" />
  88.       <title>Registrar nuevo Usuario</title>
  89.     </head>
  90.     <body>
  91.     <div id="install">
  92.       <form action="index.php?sec=registro" method="post">
  93.       <div id="install-title">Registro de Nuevos Usuarios</div>
  94.       <table>
  95.         <tr><td colspan="2" class="install-td">Datos del Usuario</td></tr>
  96.         <tr><td>Nombre de Usuario:</td><td><input type="text" name="user_name" value="Usuario" /></td></tr>
  97.         <tr><td>Contraseña:</td><td><input type="text" name="password" value="Contraseña" /></td></tr>
  98.         <tr><td>Correo Electrónico:</td><td><input type="text" name="email" value="Email" /></td></tr>
  99.         <tr><td colspan="2" class="install-td"><input type="submit" name="submit" value="Registrar" /></td></tr>
  100.       </table>
  101.       </form>
  102.     </div>
  103.     </body>
  104.   </html>
  105.  
  106.   <?
  107.  
  108. }
  109.  
  110. ?>

Ahora que tenemos como registrar usuarios, necesitaremos donde hacer ‘Login‘ y ‘Logout‘ del sistema, pero eso lo explicare en otra entrada. Podéis bajar todos los script hasta el momento aquí.

Dudas, comentarios, criticas, sugerencias, etc… serán agradecidas!

Un Saludo.
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez
  #9 (permalink)  
Antiguo 23/01/2011, 13:20
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Creando un CMS

Hasta ahora va todo muy bien, perfectamente explicado y entendible; pero antes de que sigas avanzando, seria conveniente detenerte un poco en cuestiones de seguridad:

Es un gran error poner en cualquier consulta SQL un dato sin filtrar, sobre todo si proviene de una entrada manipulable por el usuario como $_POST o $_GET.

1- Verifica que el campo viene donde lo esperas o inicializalo en cero/cadena vacia/etc.
- Para cadenas: $cadena = (isset($_POST['cadena'])) ? $_POST['cadena'] : '';
- Para numeros: $numero = (isset($_POST['numero'])) ? $_POST['numero'] * 1 : 0;

Lo de numero, puedes hacer multiplicacion o forzar de acuerdo al tipo:
- Entero: $entero = (int)$_POST['numero'];
- Flotante: $flotante = (float)$_POST['numero'];

2- Verifica que el campo cumpla con requisitos de longitud y/o valores minimo y maximo
3- Si es una cadena, pasala primero por mysql_real_escape_string() para evitar problemas de funcionalidad y seguridad.
4- No me acuerdo, luego te digo.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 23/01/2011, 15:52
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
Respuesta: Creando un CMS

Buenas Triby, muchas gracias por molestarte en ayudarme, sobre los requisitos de seguridad en uno de los post puse

Cita:
De momento no entraremos en cuestiones de seguridad ni de requisitos, pero hay que tener en cuenta que el programador no puede fiarse del uso que le darán los Usuarios a su código, así que todo contenido que entre al CMS para ser almacenado en la BD o mostrado en pantalla debería de pasar por unas funciones para limpiar cualquier código malicioso que pueda contener.
Pero creo que como dices es muy importante y me voy a centrar mas en eso, sobre el punto 1 no se si lo entiendo bien, ya compruebo que están con un empty($_POST['nombre'], te refieres a eso?

Sobre el numero 2, si te refieres a poner un limite de caracteres ya esta añadido.

Código PHP:
Ver original
  1. //Comprobamos que el campo usuario no este vacio.
  2.   if(!empty($_POST['user_name'])){
  3.  
  4.     //Comprobamos que cumplan los requisitos que definimos
  5.     if((strlen($_POST['user_name']) < $user_min_len)||(strlen($_POST['user_name']) > $user_max_len)){
  6.       echo "El usuario no puede ser menor de ".$user_min_len." ni mayor de ".$user_max_len." letras. <br />";
  7.       $return = 1;
  8.     }
  9.   }else{
  10.  
  11.     //En caso de que este vacío
  12.     echo "Tienes que rellenar el campo de usuario <br />";
  13.     $return = 1;
  14.  
  15.   }

Sobre el 3, nunca había usado esa función, normalmente limpiaba los campos con

Código PHP:
Ver original
  1. $texto = htmlspecialchars($texto) ;
  2.  
  3.             $texto = trim($texto) ;
  4.  
  5.             $texto = stripslashes($texto);
  6.  
  7.             $texto = strip_tags($texto);

pero pienso que la función que me has facilitado es imprescindible, la usare a partir de hoy en todos mis proyectos.

4. Muchas gracias por tu apoyo y ayuda! es muy importante para mi arreglar todo lo que noteis que esta mal, para seguir aprendiendo!

Un Saludo
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez
  #11 (permalink)  
Antiguo 27/01/2011, 18:04
Avatar de Nazari  
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 9 meses
Puntos: 7
Respuesta: Creando un CMS

Usando Cookies y Sesiones

Todos los sistemas de gestión de contenidos y muchos portales usan sistemas de usuarios, tu entras te logueas con los datos que te pidan, que suelen ser un nick o un email y una contraseña, y desde ese momento el portal te reconoce siempre aunque estés viendo otra sección de la web, pero ¿Como es posible que te reconozca sin enviar continuamente los datos?, muy sencillo, usando Sesiones y cookies.

Las Sesiones son variables que se almacenan en el servidor (no están al alcance del usuario) y son únicas por cada usuario que accede a la web, por ejemplo el nombre de mi sesión no seria igual al de otro visitante.
Aunque su uso depende de nuestra imaginación normalmente se utilizan para pasar datos de una forma segura y transparente de una sección a otra, como por ejemplo un carrito de compra, las sesiones son la forma mas segura de crear un sistema de ‘logueo‘ de usuarios, una ves abierta una sesión se mantendrá hasta que la destruyamos, su uso es muy simple, usamos session_start(); en el script donde queramos usar sesiones, para definir una variable es tan sencillo como poner $_SESSION['mivariable'] = 0; hay que tener en cuenta que esto es en PHP 5.3, en versiones anteriores, antes de dar valor a una sesión había que registrarla así, session_register(‘mivariable’); y luego darle el valor, pero esta forma quedo descartada y pronto quedara obsoleta en versiones posteriores de PHP. Una ves hemos terminado con el uso de las sesion con session_destroy(); las destruimos, se puede usar para hacer ‘Logout‘ del sistema.

Las Cookies son otra forma de guardar datos y recuperarlos de una sección a otra, pero son menos seguras que las sesiones.
¿Por que? Las cookies son pequeños archivos de texto que se almacenan en el navegador, por lo tanto están al alcance de los usuarios y pueden ser modificadas, esto hace que sea mejor no guardar información sensible en ellas, como contraseñas sin encriptar o otros datos personales.
Las cookies tienen un tiempo de vida y normalmente se usan junto con las sesiones para crear sistemas rápidos y cómodos, evitando tener que introducir continuamente nuestros datos. Su uso en PHP es muy simple usando la función setcookie(); la cual permite definir, nombre, valor, caducidad, directorio, dominio y seguridad.
El nombre como puedes imaginar es para darle un nombre a la cookie, valor define el valor que tendrá, caducidad el tiempo de validez de la cookie creada, directorio la ruta relativa desde la que podemos recuperar la cookie, dominio se refiere al dominio que puede recuperarla y seguridad define si la cookie puede ser mandar si no hay una conexión https (segura). Puede que parezca complicado pero no es tanto, muchos de los parámetros se definen por defecto.

Ahora que sabemos que son las cookies y las sesiones, montaremos nuestro propio sistema de logueo, con un ejemplo se entienden mejor los conceptos, pero esto sera en la siguiente entrada que hoy ya se me ha hecho algo tarde jaja.

Un Saludo
__________________
Nazarí González
http://www.nazariglez.com - @Nazariglez

Etiquetas: cms, mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 7 personas




La zona horaria es GMT -6. Ahora son las 08:33.