Ver Mensaje Individual
  #3 (permalink)  
Antiguo 13/01/2011, 19:08
Avatar de Nazari
Nazari
 
Fecha de Ingreso: febrero-2010
Ubicación: Canarias - Tenerife
Mensajes: 62
Antigüedad: 14 años, 2 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