martes, 1 de julio de 2014

crear instalador con php

crear instalador con php 

(parte I)


En esta primera parte intentaré explicar lo mas simple posible como hacer un instalador con php y MySQL, este ejemplo MUY SIMPLE servirá para un pequeño script y solo registrará un nombre en una base de datos MySQL.
Este pequeño experimento lo dividí en 4 pasos para que sea lo mas claro posible (aunque se puede hacer solamente en 1 archivo pero para que sea lo mas claro posible lo dividí en 4 diferentes archivos).

Para comenzar serán necesarios los siguientes pasos:

1.- Creación del archivo de configuración
2.- Creación del instalador
3.- Registrar datos de ejemplo
4.- Recuperar datos registrados
desde luego que este script es solo a modo ilustrativo y se debe expandir muchisimo para que sea utilizable en un script real, tampoco es la única forma que se puede hacer un instalador en php pero es la mas simple que conseguí para hacer este ejemplo, en un futuro haré uno mas complejo.

comencemos!!

1.- Creación del archivo de configuración:

Este script lo que hará es encargarse de crear el archivo de configuración con el que podremos conectarnos a la base de datos (el típico caso del archivo config.php)

index.php:

if (!isset($_POST[enviar])) {
  if(!file_exists("config.php")) {
    define('DB_HOST','');
    define('DB_USER','');
    define('DB_PASS','');
    define('DB_NAME','');
// Si no se incluye el archivo se ponen las variables a 0 (el archivo se creara automaticamente)
  }
  else {
    include("config.php");
  }
?>
<form action="<?php echo $_SERVER[PHP_SELF] ?>" method="post">
  HOST: <input type="text" name="db_host" value="<?php echo DB_HOST ?>" /> (ej: localhost)<br />
  USER: <input type="text" name="db_user" value="<?php echo DB_USER ?>" /> (usuario MySQL)<br />
  PASS: <input type="password" name="db_pass" value="<?php echo DB_PASS ?>" /> (clave del usuario MySQL)<br />
  NAME: <input type="text" name="db_name" value="<?php echo DB_NAME ?>" /> (Nombre de la base de datos)<br />
  <input type="submit" name="enviar" value="Guardar" />
</form>
<?php
}
else {
// El contenido del archivo
  $contenido = "<?php \n";
  $contenido .= "define('DB_HOST','" .$_POST['db_host']."'); \n";
  $contenido .= "define('DB_USER','" .$_POST['db_user']. "'); \n";
  $contenido .= "define('DB_PASS','" .$_POST['db_pass']. "'); \n";
  $contenido .= "define('DB_NAME','" .$_POST['db_name']. "'); \n";
  $contenido .= "?>";

// Se abre el archivo (si no existe se crea)
  $archivo = fopen('config.php', 'w');
  $error = 0;
  if (!isset($archivo)) {
    $error = 1;
    print "No se ha podido crear/abrir el archivo.<br />";
  }
  elseif (!fwrite($archivo, $contenido)) {
    $error = 1;
    print "No se ha podido escribir en el archivo.<br />";
  }
  fclose();
  if ($error == 0) {
    require 'config.php';
    print "
      <h3>DATOS DE CONEXI&Oacute;N</h3>
      <p>DB HOST: " .DB_HOST. "</p>
      <p>DB USER: " .DB_USER. "</p>
      <p>DB PASS: " .DB_PASS. "</p>
      <p>DB NAME: " .DB_NAME. "</p>
      <a href=\"install.php\">siguiente</a>
    ";
  }
}

Ahora vamos a pasar al script que instala la tabla que se necesita en la base de datos (obviamente la base de datos hay que crearla desde el PHPMyAdmin) y se llamará de la misma forma que pongamos en el formulario inicial en DB_NAME.

Ahora bien, por motivos prácticos la base de datos que yo creé se llama "ejemplo" y la tabla se llama "nombres" ya que solo vamos a poner un id auto incremental y un campo nombres con característica unique pero esto se puede modificar.


install.php:

//incluimos el archivo con las configuraciones que introdujimos en el formulario
include ("config.php");
// conectamos al servidor mysql
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ("Could not connect to mysql because ".mysql_error());
// seleccionamos la base de datos
mysql_select_db(DB_NAME) or die ("Could not select database because ".mysql_error());
// creamos las tablas necesarias en la base de datos
$create = "create table `nombres` (
  `id` int(11) NOT NULL auto_increment,
  `nombre` varchar(30) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY nombre (nombre) );";
mysql_query($create) or die ("Could not create tables because ".mysql_error());
echo "La instalaci&oacute;n se realiz&oacute; con &eacute;xito.";
// eso fue todo :D
 



Hasta aquí esta primera parte donde creamos los 2 archivos mas importantes que son el formulario desde donde se insertan los valores de configuración para poder conectarse a la base de datos y el archivo que registra nuestra hermosa tabla en la base de datos, en la proxima parte mostraré como registrar un nombre en la base de datos y recuperar los nombres que haya registrados.

Hasta la proxima parte y gracias por tu tiempo!

domingo, 5 de mayo de 2013

Como incluir una configuración en el documento y en un config.php al mismo tiempo

Como indica el título en esta ocación voy a mostrar una curiosidad que tal vez para muchos sea totalmente natural o normal su uso pero no para quienes andan empezando y no conocen como se podría hacer esto

la forma normal de incluir las constantes de configuración (por ejemplo en los datos de una conexión a la base de datos) es a travez de un archivo incluido (include´config.php' o algo asi...) pero tambien podríamos incluirlo dentro del propio archivo donde tenemos la conexión... entonces... ¿por que no tener las 2 posibilidades a la vez?, esto es posible a travez de este pequeño código:

        include 'tu_archivo_externo.php';
        defined('DB_HOST') or define('DB_HOST', 'tu_servidor');
        defined('DB_USER') or define('DB_USER', 'tu_usuario');
        defined('DB_PASS') or define('DB_PASS', 'tu_clave');
        defined('DB_NAME') or define('DB_NAME', 'nombre_de_tu_db');


El código es bastante simple de explicar, si esta definida la constante carga la constante y si no está definida LA DEFINE!! osea.... linea por linea y letra por letra sería esto: 
        defined('DB_HOST')
Lo que hace es mirar si está definida la constante DB_HOST, si no lo está entonces DB_HOST toma el valor de:
        or define('DB_HOST', 'tu_servidor');
Así lo hace con el resto de las líneas, luego como las utilice es otro cuento... se puede utilizar para ua conexión a base de datos o podrían ser otro tipo de valores, en este ejemplo traigo los valores genéricos de una conexión a una base de datos porque era lo que tenía a mano pero podría ser con cualquier otro tipo de datos que uno debiera utilizar

Espero les sirva y hasta un próximo artículo!!

miércoles, 30 de mayo de 2012

Limitar acceso por URL

Limitar acceso por url

Hay veces en las que queremos limitar el acceso por url, por ejemplo cuando tenemos un index y desde el tomamos varias secciones de código desde otros documentos pero no queremos que esos otros documentos sean accesibles de forma directa, no siempre encontramos la forma y en esta ocasión les traigo una de las tantas formas aunque no sea la única pero que resulta bastante útil y rápida de realizar.

En principio en el documento que incluye a los restantes documentos sea el index.php o el que sea (mediante include o require o como sea que se traiga la información) debe colocarse lo siguiente:

<?php
define("_access", TRUE);
?>

Ahora para las páginas que queramos proteger se debe colocar lo siguiente:

<?php
if(!defined("_access")) {
  die("Error: No tienes permiso para acceder aqu&iacute;...");
}
?>


Lo anterior sirve para asignar un valor vacío (o FALSE) y esto indica que SI el valor es falso entonces detiene el script y muestra el mensaje de error diciendole que no tiene autorización para ver ese documento, se que hay muchas formas de hacer esto, algunas con clases que tienen todo un arsenal de seguridad y otras que son bastante simples y básicas como es simplemente decirle al incauto visitante VOS NO TENES PERMISO PARA VER ESTO y listo...

En ocasiones la simplicidad de un script hace que se vuelvan mucho mas comprensibles a la hora de desarrollar un programa y no complicarse la vida con, por ejemplo, sistemas muy pesados o que requieran demasiados procesos para hacer lo mismo que se logra con estas 3 simples lineas de código, una que le dice que "si" puede ver el documento y otra que le dice que no y le muestra un mensaje al respecto.


Este script se podría personalizar reemplazando "die" por un "header" para redirigir al visitante a una página de error personalizada o también se podría agregar el html directamente dentro de "die("aca todo el html que se te antoje");


Bien, esto fué todo por hoy, espero la próxima traer algo de mayor interes!!

sábado, 19 de mayo de 2012

poo php y mvc

POO PHP Y MVC

Hace unos meses estoy incursionando mucho en un patrón de diseño llamado MVC, después de haber aprendido muchas cosas sobre lo que es un patrón de diseño caigo en la cuenta de que aprendí lo básico de la programación orientada a objetos y me decidí a incursionar aún mas sobre este tema atrapante y misterioso llamado POO...

Ahora me encuentro con una "RECETA DEL POSTRE PERFECTO" como me gusta llamarlo, no entiendo mucho de diseño gráfico y el mantener lejos el código del diseño me facilita muchisimo las cosas por lo que MVC me representa una clara facilidad de mantenerme LEJOS del diseño como si me diera alergia o algo por el estilo y tener mayor posibilidad de hacer ALGO sin luchar demaciado de la parte visual.
Luego de haber aprendido los "como y porque" del patrón de diseño MVC me di cuenta que no era muy fácil extender el script a menos que incursionara en singleton y otras cosas que yo, al ser un pobre NEÓFITO en la materia no entendía muy bien pero me encontré con algo llamado clase... casualmente el fuerte de la orientación a objetos es el utilizar clases y objetos y extender clases me resultó particularmente extraño pero a la vez ÚTIL por lo que lo fui incorporando a mis conocimientos y me ayudó, por fin, a comprender MVC desde adentro y no solo PARA QUE SIRVE sino COMO FUNCIONA y ahí es donde viene la otra parte super interesante que es tener mas posibilidades dentro del script a crear y me di cuenta que simplemente extendiendo las clases se logran muchas cosas y no se rompe el patrón de diseño... antes los controladores (por no saber) los hacia simplemente con funciones que llamaban métodos de clases pero de a poco fui tomando nuevos conocimientos y me di cuenta del potente script que estaba generando... la pregunta es... POO lenguaje PHP y patrón de diseño MVC...

¿SON LA RECETA PERFECTA?

martes, 1 de mayo de 2012

Login en PHP

Login en php - Características deseables:

Ayer hablando con un amigo le pregunté sobre ¿¿QUE PUEDO ESCRIBIR??, este buen amigo mio me dijo "...toba, colgate un buen sistema de logueo...", pero como no tengo ninguno a mano que esté 100% funcional se me ocurrió enumerar algunas características "deseables" en todo sistema de login que se merezca mis respetos (en si, que es lo que yo desearía para un sistema completo de registro de usuarios).

En primer lugar lo mas deseable por un diseñador no es lo mas deseable por un programador, por ejemplo un programador ni se fija si el formulario queda lindo o feo... o si queda bien encuadrado en su lugar o si utilizar un checkbox o un select, sino que se fija en determinadas características que todo sistema de login debe tener (al menos bajo mi punto de vista).

Es bajo el enfoque de un programador que voy a realizar este post tratando de enumerar características deseables de un sistema de logueo.

1.- Ingreso mediante correo electrónico o usuarios segun el usuario quiera loguearse con su correo o con su nombre de usuario.


2.- encriptado de claves seguro (si es doble encriptado y utilizando semillas es mucho mejor).


3.- Activación de cuentas por email y/o número ID.

4.- Recuperación de contraseña facilmente mediante el ingreso de usuario y/o correo electrónico y que envíe un correo electrónico de reactivación previo cambiar la clave por una clave aleatoria y asignar un código de activación/reactivación


5.- La conexión a la base de datos debe realizarse mediante una clase abstracta ya que nunca se sabe cuando será necesario cambiar nuestro servidor de bases de datos).
(gracias GRAN "J")


6.- Los datos que vienen por el formulario (vía POST o GET) deben ser correctamente filtrados para proteger de inyecciones de código sql etc.


7.- Debe contar con una buena comprobación pero sin exederse para no ralentizar el proceso de registro.


8.- Si el sistema contendrá un perfil de usuarios, el registro debe ser lo mas simple posible para que luego sea el propio usuario quien actualice sus datos y no cometer el error de obtener todos los datos posible desde el registro ya que eso tiene desventajas y la principal es el tiempo que tardan en ser registrados los datos del usuario(esto por el proceso de filtrado y comprobaciones etc etc).


9.- También debe contar con un buen sistema de envío de email ya que no todos los hostings aceptan o mejor dicho no todos tienen habilitado ese servicio desde el servidor por lo que el sistema debe contar con algun sistema tipo phpMailer o parecido para asegurarnos de que "A PESAR" que el hosting no tenga habilitadas las características de email nosotros podamos enviar igual los correos de activación/recuperación y que podamos estar seguros de que llegan de la forma correcta sin sobresaltos (esto debe ser testeado ampliamente antes de er utilizado porque despues nos encontramos con problemas como que los correos los envian directo a la carpeta de no deseados)

Bueno, creo que esta listita de características deseables en un sistema de login en php son lo mas descriptivo que logré hacer, de echo me dijeron que para que quiero una clase abstracta si solo utilizo MySQL a lo que yo respondo que siempre hay algun marciano o algun androyde jeje

bien, espero alguna otra sugerencia si es que me olvidé de algo y ojala resulte útil esta listita para quien quiera crear un buen sistema de logueo que tenga en cuenta estas características a la hora de crearlo, se que pueden haber muchas mas características pero no se me ocurrieron!!

miércoles, 25 de abril de 2012

include masiva con php

include masivo con php

Hacer include de clases o documentos o lo que fuera necesario en php a veces se puede volver un trabajo bastante complicado o no tan complicado pero cuando se tienen muchos archivos para incluir es bastante engorroso tener que "uno a uno" ir haciendo include tras include hasta haber incluido en el lugar necesario todos los documentos necesarios

este script lo creé en base a varios tutoriales y otras yerbas que encontré en el dios google, es un prototipo simplificado del que utilizo en uno de mis proyectos web así que es 100% funcional, espero no enredarme a la hora de explicar su funcionamiento

vamos al grano, este es el script:

include_masivo.php:
<?php
################################################################################
# * INCLUDE MASIVO:                                                            #
# * esto sirve para cargar archivos sin necesidad de hacer miles de includes   #
# * en un mismo documento                                                      #
# * Por favor conserva mis datos:                                              #
# * Nombre: Mauricio José Tobares - abril 2012 - Argentina                     #
# * Sitio web: http://www.octavoinfierno.com.ar                                #
# * Blog: http://notas-php.blogspot.com.ar                                     #
# * Mail: carrozadelamuerte@gmail.com - carrozadelamuerte@octavoinfierno.com.ar#
# * Este script es solo una reducción de ejemplo de un script aun mas complejo #
# * por lo que si lo utilizas o lo adaptas a tus proyectos me gustaría que me  #
# * lo comentaras en el blog y/o mandándome un correo electrónico              #
################################################################################
// ruta a la carpeta, '.' es la carpeta actual asique se colocará la ruta ./directorio/
// o la carpeta que ustedes utilicen
$path = "directorio/";
// el siguiente array lo que hace es guardar los valores de lo que NO queremos que se muestre
// en nuestro caso "." y ".." ya que iremos imprimiendo uno a uno los documentos que encuentre
$no_mostrar = Array(".","..");
// nótese que también se podría colocar exclusiones de documentos en particular por ejemplo:
// $no_mostrar = Array(".","..","algo-1.php","algo-2.php","algo-3.php",);
// el resultado de hacer eso en nuestro caso será que no se cargarán los
// documentos algo-1.php, algo-2.php y algo-3.php
//
// ahora abrimos la carpeta
$dir_handle = opendir($path) or die("No se pudo abrir $path");
// generamos el bucle que irá cargando archivo por archivo
while ($file = readdir($dir_handle)) {
// esto en el original decía ".php" pero como nosotros
// no vamos a hacer una lista de los archivos encontrados sino un include debemos
// dejarlo así... que lea el archivo.php como viene sin quitarle la extensión
  $pos = strrpos($file,".");
  $extension = substr($file,$pos);
// no_mostrar lo que hace justamente es NO mostrar lo que definimos en el array
  if (!in_array($extension, $no_mostrar)) {
    include_once($path.$file);
// * para comprobar si se carga todo correctamente podemos hacer un echo de esta forma:
//  echo $path.$file;
  }
}
// finalmente cerramos la carpeta
closedir($dir_handle);
################################################################################
?>

Ahora debes crear una carpeta llamada "directorio" y colocar dentro un par de archivos, como ejemplo yo coloqué 5 archivos llamados algo-1.php, algo-2.php y así

algo1.php lo único que tiene es un titulo H1, algo-2.php un titulo H2 y así hasta el H5

bueno, eso es todo, espero les sea de utilidad este script para hacer include masivo

Otras ideas a tener en cuenta:
Con el include masivo no solo se pueden poner archivos de html liso y llano, pueden colocar scripts de php o lo que se les ocurra que se haya que incluir, también se puede hacer un require masivo y utilizarlo por ejemplo para requerir todos los scripts de una carpeta determinada, una gran posibilidad es asignar la ruta mediante una consulta en base de datos para que en determinada sección de la página se requiera la carga de determinados archivos, también se puede asignar dentro del array que se carga en $no_mostrar un array asociativo en donde se le meta otro array que cargue las excepciones desde una db etc etc...

todo queda a libre criterio de lo que se necesite, pero lo básico está echo, ahora solo hay que ver como adaptarlo a cada proyecto ya que no todos los proyectos tienen por que ser exactamente iguales

martes, 24 de abril de 2012

¿scriptofilia copy-paste o recopilación de scripts?

¿scriptofilia copy-paste o recopilación de scripts?


En muchos... muchisimos blogs leemos y tratamos de seguir guías de scripts que NO FUNCIONAN sea por estupidez propia del bloggero o porque no tienen ni el mas minimo reparo en hacer "copy-paste" de obras que ensima que no son de ellos estan mal echas o directamente son para versiones en desuso del lenguaje lleno de cosas que dan el tipico DEPRECATED!
Esos blogs que tienen el sindrome de "scriptofilia copy-paste" son lamentablemente los mejores rankeados en los buscadores como google o el socotroco ese que es de microsoft que por suerte no lo utilizo porque soy linuxero y gracias a dios (o al diablo), si... si hablo de ese navegador... del mas primitivo y despreciable de todos los sistemas como es el caso del IE en todas sus versiones...

pero no estoy aquí para discutir sistemas operativos y ni siquiera navegadores... estoy redactando esto para ver si alguna vez los que tenemos un buen criterio en blog hacemos campaña para FRENAR LA PLAGA de hacer copy-paste al mejor estilo obsesivo-maniaco-compulsivo y empezamos a generar contenidos propios, scripts y sistemas que al menos funcionen y teniendo ejemplos aplicados en nuestros propios proyectos web y no promesas de soluciones incoherentes que hasta que uno no las prueba no se da cuenta de que no funcionan y aquí en este punto quiero detenerme a decirle a los que CON FECHA RECIENTE hacen copy-paste de contenidos de PHP4... hermanos mios... dejense de hinchar los huevos con el php4... actualicense, ya parecen usuarios del INTERNET EXPLORER 6... dejenlo morir en paz pobre php4... que les hizo para que no lo dejen en paz??? todavia no se dieron cuenta que hasta los hostings gratuitos utilizan el php5.(+)??????

yo la verdad a veces me pregunto que tienen en la cabeza los que hacen copy-paste, pero obviamente se la dan de gurues de php y nisiquiera saben darse cuenta que <? es de php4, ya con simplemente ver que la etiqueta corta NO SE UTILIZA MAS EN PHP5 se darían cuenta que si hacen copy-paste de ese contenido, ese contenido es VIEJO, es INUTIL y muchas veces tiene cosas que son DEPRECATED
en php5 en adelante solo se utiliza la etiqueta de apretura <?php y si el script comienza con <? solamente pues estas ante un script de php4 amigo.... no lo hagas copy-paste... deja morir ese lenguaje en paz, actualiza tus neuroticas neuronas o al menos DIGNATE A APRENDER PHP y te daras cuenta que php4 ya no se utiliza porque ya practicamente no hay alojamientos que utilicen ese lenguaje

Yo definiría entonces a los que padecen este horrendo mal de la "scriptofilia copy-paste" como enfermos mentales que en lugar de aprender a programar y progresar solo retrasan el progreso del lenguaje inundando de estupideces la red, los defino como IGNOTAS QUE NO SABEN PROGRAMAR Y PARA SUPLANTAR EL SENTIMIENTO DE PEQUEÑEZ DEBEN INUNDAR INTERNET CON LO QUE SEA CON TAL QUE LOS CONSIDEREN GURU DE LA PROGRAMACIÓN

ojala esta diarrea mental sirva para que mas gente se digne a luchar contra estos enfermos de SCRIPTOFILIA COPY-PASTE!!!!!!!

Gracias por tu lectura