Taller De Php
-
Rating
-
Date
September 2018 -
Size
1.5MB -
Views
8,391 -
Categories
Transcript
1 Taller de PHP Clase 01 : Introducción Este es el primer artículo editorial del Taller de PHP donde podrás conocer de qué se trata este lenguaje, cómo aplicarlo y algunos tips extra para sacarle el máximo provecho. Para empezar, PHP es un lenguaje de programación para páginas web que permite generar páginas dinámicas del lado del servidor. Para ser un poco más preciso, nos referimos por páginas dinámicas a aquellas páginas que van a cambiar su contenido dependiendo de los valores que se le asignen. Sin ir más lejos, este mismo blog está programado en PHP y para ver los artículos se utiliza siempre el mismo archivo, pero se muestra el contenido de acuerdo a la id del artículo que se le está pidiendo. ¿Y por qué del lado del servidor? Esto significa que el código PHP va a ser interpretado en el servidor. Así, lo que el usuario verá en pantalla será el contenido generado por la interpretación del archivo PHP que el usuario está solicitando. Una de las grandes ventajas que tiene PHP es su gran versatilidad a la hora de trabajar con bases de datos, permitiendo realizar páginas con información almacenada en forma persistente en bases de datos y mostrarla según la petición de los usuarios. Primeros pasos Dentro de un archivo PHP se puede alternar entre código html y código PHP. Esto nos permite realizar páginas dinámicas de forma fácil: realizando toda la estructura con html y luego agregando el contenido dinámico. Imaginemos una página html común, pero en lugar de ser index.html es index.php. Cuando se quiera agregar código PHP habrá que hacerlo dentro de las etiquetas o , por ejemplo:incluir código PHP en html
Variables Las variables son elementos que creamos para asignarles un valor o dato específico (que puede cambiar a lo largo de nuestro archivo). En PHP, las variables se definen anteponiendo el signo $, por ejemplo: $hola = "hola mundo"; En el código anterior definimos la variable hola la cual contiene la información hola mundo. Noten que al final agregué un punto y coma (;). En PHP, siempre que se termine una instrucción hay que aclararlo de esta forma. Manual de PHP 2 Tip Lo ideal a la hora de programar es definir todas las variables y realizar las operaciones antes del código html y en ese código mostrar los resultados de nuestras variables. Por ejemplo, un código completo de hola mundo sería:incluir código PHP en html
La funcion echo lo que hace es imprimir una o más cadenas de texto. En nuestro ejemplo anterior, como la variable contenía una cadena de texto (string), lo que el navegador hubiera mostrado es :incluir código PHP en html
hola mundo
En los próximos artículos de este taller ya profundizaremos en el uso de este potente lenguaje. Ver también: XAMPP, servidor web fácil de instalar Clase 02: Variables y Constantes En la clase anterior vimos un ejemplo muy chiquito explicando más o menos qué era una variable, hoy avanzaremos un poco más en detalle, veremos: Reconocimiento de Variables Tipos de Variables ¿Qué son las constantes y en qué se diferencian? Reconociendo variables Como expliqué en la clase anterior las variables anteponen el símbolo $, es decir $variable, $queEsEsto, $no_se, son tres variables que se le pone el nombre que uno quiere. Qué contenido pueden tener mis variables A una variable se le puede asignar cualquier tipo de información: una cadena de texto (string), números enteros (integer), un arreglo (array), true, false, null, etc; Así mismo, a una variable que antes era un string se le puede cambiar el tipo de información sin ningún problema. Manual de PHP 3 Si escribimos todo eso en nuestro código php, el valor final que va a tener la variable $miVariable va a ser true, todo el resto de la información asignada se pierde. Tipo de variables Existen dos tipos de variables en php, locales y globales, locales son aquellas que se ejecutan en un único ámbito, es decir si yo defino una variable $local y a continuación uso una función que adentro contiene una variable llamada $local, van a ser consideradas como dos variables diferentes y no va a pasar lo que pasa en el ejemplo anterior que la información asignada prioritariamente a la variable $local se pierde. Para crear una variable global que sí puede ser accedida desde todos los ámbitos de nuestro script se debe aclarar, caso contrario es local. ¿Qué son las constantes y en qué se diferencian con las variables? Como bien lo dice el nombre, una constante es como una variable pero una vez definida esta no puede cambiar su contenido en todo el script. Para crear una constante debemos definirla de la siguiente manera: De esa forma hemos definido la constante HOLA (por convención se utilizan nombres en mayúscula para las constantes aunque no es obligatorio). Las constantes son más livianas que las variables en el uso de memoria del servidor y no pueden ser reescritas, es decir, si en nuestro script tenemos lo siguiente: Nuestro script de php va a interpretar la constante HOLA con la primer información definida en ella, es decir Hola mundo y en el reporte de errores del servidor va a agregar el error de que se intento definir nuevamente la constante HOLA. Otra ventaja que tienen las constantes es que son GLOBALES, es decir se pueden acceder desde cualquier ámbito, dentro de una función, una clase, etc. Manual de PHP 4 Por último, para usar una constante la usamos directamente por el nombre que definimos en el primer término, volviendo al ejemplo de Hola mundo de nuestra primer clase, usando la constante sería de la siguiente forma:incluir código PHP en html
y en el navegador se verá así: Clase 03: Condicionales (1) A partir de esta clase vamos a empezar a ver con más profundidad como podemos aprovechar al máximo la programación. Los condicionales son básicamente el elemento fundamental a la hora de hacer páginas dinámicas. Con ellos decidimos qué tipo de acción realizar y son parte de la llamada estructura de control. Diferentes tipos de condicionales Tenemos 4 elementos a utilizar a la hora de necesitar una condición: if, else, elseif y switch Casos de uso if, else y elseif La estructura if se utiliza para ejecutar una accion según una determinada condición. Por ejemplo: Por otro lado está muy relacionada con el else, que sirve para continuar con el proceso si no se cumple la condición. ¡Atención! No es obligatorio que figure. Si usamos el else se mostrará o la primer acción o la segunda. Por el contrario, si usamos solo el if, en pantalla se mostrara el bloque de acción –si se cumple la condicion– y seguirá corriendo el script mostrando lo que viene a continuacion por fuera de los { }. Por último, tenemos el elseif que nos permite usar varias condiciones hasta que se cumpla una. Por ejemplo: El script va a correr hasta que se cumpla la condición y entrará únicamente en esa sentencia. Switch La estructura switch es una forma paralela a la usada en el último caso. Se forma de la siguiente manera: Condicionales con HTML Una de las grandes ventajas de PHP es que se puede entrelazar con HTML. Un claro ejemplo de lo aprendido en esta clase, es cómo decidir qué mostrar y qué no en nuestro HTML con un condicional de PHP. En el caso siguiente mostraré el formulario para dejar comentarios de elWebmaster, dependiendo si estamos registrados o no en nuestro sitio. A continuación, verás cómo queda el formulario en ambos casos: Sesión iniciada como usuario registrado. Manual de PHP 7 Usuario invitado. Sesión no iniciada. Clase 04: Condicionales (2) Bienvenidos a la cuarta clase del Taller de PHP. Esta clase en realidad continúa la anterior, donde comenzamos a ver el uso de las Condicionales. Hoy voy a hablar un poco sobre los operadores. A lo largo de esta clase veremos qué son los operadores. Además aprenderemos sobre operadores aritméticos, de asignación, de comparación y operadores lógicos, descubriendo cómo nos ayudará cada uno en nuestros proyectos. ¿Qué son los operadores? Al realizar nuestros scripts constantemente estamos realizando operaciones que le dan complejidad a nuestro trabajo. Existen cuatro tipo de operadores: aritméticos, asignación, lógicos y comparación. Operadores aritméticos + adición de valores. - resta de valores. * multiplicacion de valores. / division de valores. % resto de una division. ++ incrementa en una unidad. -- resta en una unidad. Operadores de asignación = asigna al primer miembro el segundo. Es decir $a = 4, le asigna el valor 4 a $a. asigna al primer miembro la suma del primer miembro con el segundo. += $a =4; $b = 5; $b += $a, ahora $b pasa a valer 9. -= asigna al primer miembro la resta del primer miembro con el segundo. *= asigna al primer miembro la multiplicacion del primer miembro con el segundo. /= asigna al primer miembro la division del primer miembro con el segundo. Manual de PHP 8 %= asigna al primer miembro el resto de la division del primer miembro dividido el segundo. concatena el primer miembro con el segundo y se lo asigna al primero. .= Es decir $a = ‗Hola ‗; $b = ‗Mundo‘. $a .= $b; ahora $a = ‗Hola Mundo‘; Operadores de comparación Este tipo de operadores se van a utilizar mucho en los condicionales, junto con los operadores lógicos son los que le van a dar la complejidad a nuestro script. comprueba si dos valores son iguales, por ejemplo if ($a == $b) si $b es igual $a, el condicional == devuelve TRUE y continua ejecutando el script. != comprueba si dos valores son distintos. comprueba si el valor del primer miembro es mayor al segundo, por ejemplo if ( $a > 5), va a > < devolver TRUE para todos aquellos valores de $a mayor a 5. comprueba si el valor del primer miembro es menor al segundo. >= comprueba si el valor del primer miembro es mayor o igual al segundo. <= comprueba si el valor del primer miembro es menor o igual al segundo. Operadores lógicos operacion de negativa, por ejemplo dentro de un condicional se puede realizar todo tipo de operaciones y funciones, una que veremos mas adelante es una funcion propia de php que ! devuelve TRUE o FALSE dependiendo si la variable esta vacia, entonces si nosotros preguntamos if (!empty($a)) va a devolver si $a = 5, TRUE, ya que empty($a) devuelve FALSE, pero !empty($a) seria como preguntar Si $a NO esta vacia. comparador Y. Dentro de un condicional es necesario que ambas condiciones se cumplan es and decir if ( $a = 4 AND $b = 5 ) continua con el script. comparador O. Dentro de un condicional es necesario que se cumpla una de las dos or condicione, es decir if ( $a = 4 OR $b = 5 ) con que $a = 4 o $b = 5 el script va a continuar su ejecucion. xor va a devolver verdadero si al menos una de las dos condiciones es verdadera pero no ambas. && es igual que el and || es igual que el or Clase 05: Bucles (1) Casi siempre nuestros script van a realizar tareas repetitivas, por ejemplo, una función que muestra un listado de noticias, repite siempre la misma estructura, es decir, mostrar un título, mostrar una imagen, mostrar el autor, lo único que cambia es el contenido, pero la tarea que realiza es siempre la misma. Una forma fácil de realizar una secuencia de instrucciones en forma repetitiva es utilizando los BUCLES. Manual de PHP 9 En PHP existen cuatro tipos de bucles: while, do while, for y foreach. while El while es un bucle que va a realizar una instrucción o conjunto de instrucciones siempre y cuando la condición ( lo vimos en la Clase 4 - Condicionales - ParteII ) se cumpla, es decir sea verdadera. La comprobación de la condición la hace siempre al principio. La estructura es la siguiente:
Explicando un poco la sintaxis del while, lo que va entre ( ) es la condición, puede ser de cualquier tipo, ver si existe una variable, si una variable es menor a otra, si una variable es verdadera, etc. Y entre { } va la instrucción o instrucciones. Un ejemplo sencillo de este bucle puede ser mostrar una cuenta de 1 hasta 10. "; $c++; } ?>
En la primer línea definimos la variable $c con el valor 1, luego evaluamos la condición si $c es menor a 11, como es 1, se ejecutan las instrucciones. En la primer linea de la instrucción mostramos en pantalla el valor de $c, en este caso 1, y luego en la segunda linea de instrucciones le sumamos uno a $c ( con $c++ se le suma un valor a la variable, es lo mismo a poner $c = $c + 1; ), Al final de las instrucciones, el bucle vuelve a analizar la condición, en este caso $c es igual a 2, (recordar que le acabamos de sumar 1), sigue siendo verdadera la condición de que $c < 11, por lo que el bucle va a continuar con este proceso hasta que $c sea igual a 11.
do while Este bucle no difiere mucho del anterior:
Manual de PHP
10 La única diferencia salvando la sintaxis es que primero ejecuta la instrucción y luego se fija si cumple la condición, en caso de ser verdadera la condición, vuelve a ejecutar una vez mas y así. La clase que viene vamos a ver los dos bucles que nos están restando for y foreach
Clase 06: Bucles (2) Bienvenidos a la sexta clase del Taller de PHP. Continuando con la clase de bucles, hoy vamos a ver los dos restantes: for y foreach. Estos son un poco más complejos, por lo que debemos prestar mucha atención para no cometer errores. Vamos a ver que las expresiones tienen un encadenamiento determinado y deben cumplir con ciertos parámetros. Esto es fundamental para que todo funcione de manera correcta. Pero veamos esto en detalle, sin perder más tiempo.
for El bucle for tiene la siguiente sintaxis:
La expresión 1 se ejecuta una vez al comienzo del bucle, la expresión 2 es la condición que se debe cumplir y la expresión 3 se ejecuta al final de ejecutar las instrucciones en cada iteración. Siguiendo el mismo ejemplo de la clase anterior, en la que vimos el bucle while, ahora vamos a usar el mismo, mostrar la secuencia de números del 1 al 10 pero con un for. "; } ?>
Al igual que como hicimos en el ejemplo del while, aquí seteamos $c = 1 (expresión 1 que se ejecuta por única vez antes de comenzar el bucle), $c < 11 es la expresión 2, o sea la condición que queremos que se cumpla, y $c++ es la acción que se va a realizar al finalizar la iteración, igual que el while donde le poníamos el $c++ dentro de las instrucciones. Para bucles for se puede utilizar también una sintaxis alternativa.
foreach Este bucle es una forma rápida y sencilla de recorrer un arreglo o una matriz. En la clase 2 vimos que una variable podía contener un arreglo (array). ¿Qué quiere decir esto? que a una variable se
Manual de PHP
11 le puede asignar un conjunto de elementos, por ejemplo la variable $semana puede contener un arreglo con los días de la semana, para esto la definimos así:
La sintaxis del foreach que nos va a permitir recorrer los array es la siguiente:
En expresion1 ponemos nuestro array y en expresion2 definimos cómo queremos que se llame el valor de cada elemento de nuestro array, en instrucciones lo que queremos hacer cada iteración. Siguiendo nuestro ejemplo de la semana, el bucle va a recorrerse 7 veces, ya que tenemos 7 días, si lo que queremos es mostrar un listado de los días que tenemos en nuestro array debemos hacer lo siguiente: ";
// comienza el bucle foreach ( $semana as $dia ) { echo "$dia "; } ?> De esta forma la variable $dia se va reemplazando con el siguiente valor que le corresponde en el array por cada iteración que realiza el foreach Si todavía no se perdieron, vamos a ver la forma de utilizar el foreach para recorrer un arreglo que tiene definido índices, en el ejemplo anterior vimos un array el cual no tenía definido ningún índice, ahora vamos a ver un array un poco más complejo: 'Php Clase 5 - Bucles', 'cuerpo' => 'Acá va el contenido de la clase 5 de php, mucho texto, mucho mucho', 'autor' => 'Justi' ); ?> Ahora que ya tenemos nuestro array más complejo, vamos a ver el foreach sin mostrar índices y mostrándolos "; } ?> En este ejemplo vamos a imprimir en pantalla lo siguiente: Manual de PHP 12 Php Clase 5 - Bucles Acá va el contenido de la clase 5 de php, mucho texto, mucho mucho Justi Y usando la expresión más compleja: $valor ) { echo "$indice: $valor
"; } ?> obtenemos en pantalla titulo: Php Clase 5 - Bucles cuerpo: Acá va el contenido de la clase 5 de php, mucho texto, mucho mucho autor: Justi Tip Lo bueno de usar esta última expresión es que se puede manipular que mostrar en pantalla dependiendo del índice, supongamos que queremos imprimir nuestra noticia pero queremos que los títulos tengan un
el cuerpo aparezca en un
y el autor en un usando los condicionales hacemos lo siguiente: $valor ) { if ( $indice == 'titulo' ) { echo " $valor Bienvenido - Panel de control - Salir Bienvenido - Salir Bienvenido - Panel de control - Salir Bienvenido - Salir Bienvenido - Panel de control - Salir Bienvenido - Salir Publicado por en Para dejar un comentario hay que ser un usuario registrado. Registrar o Ingresar Bienvenido - Panel de control - Salir Bienvenido - Salir Publicado por en
98.
dijo:$valor
"; } if ( $indice == 'cuerpo' ) {echo "Agregar Nueva Noticia
Si prestan atención verán que el formulario no tiene nada de raro salvo que la acción del mismo apunta al mismo archivo. ¿Por qué es esto? Porque, como dije antes, vamos a trabajar todo sobre un mismo archivo, separando lo que es PHP de lo que es HTML. Arriba del HTML vamos a poner todo nuestro script de PHP que va a ser como sigue:
Fijense un par de cositas, arriba de todo pusimos la conexión con la base de datos (esto lo voy a repetir siempre, para que quede bien grabadito :D). Luego hacemos uso de una condición mediante la sentencia if. Fijense que preguntamos si la variable ―submit‖ no está vacia. Nosotros en nuestro formulario le pusimos valor 1, entonces siempre que se envíe el formulario, va a llegar también una variable $_POST[‘submit‘] con valor 1. Si no está vacia, hacemos la inserción de la noticia. Ya más adelante veremos como hacer que algunos campos sean obligatorios y otros no, pero como siempre los voy a dejar con la intriga. Por otro lado verán que uso unos {} en la sentencia de inserción de datos, esto es para que me tome solamente el indice que le estoy pasando del array $_POST, ya que estoy insertando una variable directamente dentro de un string que esta entre comillas dobles(‖). Si yo no llegase a incluir los {} me insertaria el array $_POST dentro del String en lugar del valor correspondiente al indice ‗titulo‘. Perfecto ya tenemos nuestro script para agregar noticias. Aquí les dejo el script completo Agregar Nueva Noticia
Hasta la semana que viene.
Clase 20: Actualizar y borrar registros (1) Listo, ya aprendieron a insertar datos en una tabla, ahora nos falta saber cómo hacer si esos datos que insertamos los escribimos mal, o los queremos cambiar y, siendo un poquito más extremos, no queremos que existan más. Para ello, en la clase de hoy, les voy a explicar cómo es la sintaxis de las consultas de UPDATE y DELETE con la que lograremos nuestro objetivo.
Sintaxis Básicamente la sintaxis de PHP para estas consultas es bastante sencilla, por ejemplo, para actualizar una tabla: $query = "UPDATE `nombre_tabla` set campo1 = 'valoresCampo1', set campo2 = 'valoresCampo2' WHERE primaryKey = 'valorPrimaryKey' LIMIT 1"; $response = mysql_query($query, $conn);
Manual de PHP
35 Recordar pasar siempre la variable de conexión como primer medida, luego, hay que decirle en qué tabla queremos hacer el UPDATE, y luego le decimos qué campos vamos a modificar y con qué valores. Es muy importante también la cláusula WHERE para indicarle que están modificando una fila únicamente, si ustedes quieren modificar varias filas con el mismo valor, pueden quitar la cláusula ―where‖ y el ―limit 1″, y de esta forma editarían toda la tabla. Para borrar es muy similar: $query = DELETE FROM `nombre_tabla` WHERE primaryKey = 'valorPrimaryKey' LIMIT 1"; $response = mysql_query($query, $conn);
Incisto, tengan mucho cuidado con lo que pongan en el WHERE, pueden poner cualquier condición, borrar por primary key o por muchos campos a la vez, pero mucho OJO porque pueden borrar toda la información que contiene la tabla. La clase que viene veremos algunos casos de usos de ambas consultas, y además añadiremos consultas del tipo SELECT, necesarias para poder hacer un administrador de contenido decente. ¡Hasta la semana que viene! ¡Practiquen mucho!
Clase 21: Actualizar y borrar registros (2) ¡Hola de nuevo! Me imagino que habrán estado estudiando casi todo lo que estuvimos viendo hasta aquí, ya que en la clase de hoy vamos a dar una vueltita por casi todos los temas. Lo que vamos a hacer es continuar con nuestro ejemplo de la tabla de noticias, vamos a traer la noticia que queremos editar y para ello usaremos una variable ―get‖ con la ID de la noticia. Luego con esa ID, haremos una consulta para traer todos los datos que incluiremos en un formulario y a su vez enviaremos las variables ―post‖ con los nuevos datos para editarla. ¿Sencillo, no?
Editando una noticia Supongamos que el archivo nuestro es editar-noticias.php, lo que vamos a hacer es llamarlo de la siguiente manera: http://direccion.com/editar.php?idNoticia=23
Entonces en nuestro archivo (previo nos conectamos con la base de datos como siempre) vamos a tener un if para ver si existe una variable get idNoticia, en caso de que exista hacemos la consulta para traer los datos completos if ( !empty($_GET['idNoticia']) ) { // traemos la noticia $query = "SELECT idNoticia,titulo,cuerpo,estado FROM `noticias` WHERE idNoticia = {$_GET['idNoticia']} limit 1"; $response = mysql_query($query, $conn); $noticia = mysql_fetch_assoc($response); }
Y luego, una vez que tenemos nuestra variable noticia con todos los datos de la base de datos, vamos a completar el formulario con los datos originales de la siguiente manera: Agregar Nueva Noticia
Como verán hay dos cambios importantes con respecto al formulario de ingreso de noticias, en este completamos el atributo value con los datos originales. Y el otro cambio es que agregamos un nuevo campo al formulario de tipo hidden, o sea, oculto con el valor de la ID de la noticia que estamos editando. Este formulario lo enviaremos a un archivo que contendrá el script, puede ser este mismo archivo, de
la
misma
forma
que
lo
hicismos
al
ingresar
una
noticia.
Si hiciéramos eso, tendríamos que tener entonces (antes de hacer nuestra consulta para traer la noticia) otro if para saber si recibimos las variables post para editarla. if ( !empty($_POST['submit']) ) { $query = "UPDATE `noticias` set titulo = '{$_POST['titulo']}', set cuerpo = '{$_POST['cuerpo']}', set estado = '{$_POST['estado']}' WHERE idNoticia = {$_POST['idNoticia']} LIMIT 1"; $response = mysql_query($query, $conn); }
Nuestro archivo terminado queda de la siguiente manera: Agregar Nueva Noticia
Borrando una noticia Para borrar una noticia lo vamos a hacer de la misma manera, utilizando una variable get que contenga la ID de la noticia que estamos borrando. if ( !empty($_GET['idNoticia') ) { $query = DELETE FROM `noticias` WHERE idNoticia = {$_GET['idNoticia']} LIMIT 1"; $response = mysql_query($query, $conn); }
Bueno, espero que les haya gustado la clase de hoy, hasta la semana que viene.
Clase 22: MySQL-Consultas complejas Acá estamos de vuelta, me imagino un poco más experimentados con ―esto‖ de las páginas dinámicas. Ya sabemos prácticamente cómo hacer las consultas, insertar datos en una tabla y modificarlos.
Manual de PHP
38 En la clase de hoy vamos a ir un poquito más allá y tratar de realizar consultas más complejas, uniendo diferentes tablas, relacionándolas, etc.
joins Las consultas con ―joins‖ prácticamente son para unir tablas por medio de un campo. Supongamos que tenemos dos tablas, la tabla usuarios y la tabla noticias. Ambas tienen los siguientes campos: usuarios
[
idUsuario,
nombre,
apellido
]
noticias [ idNoticia, titulo, cuerpo, idAutor ] Fijense que en la tabla noticias no dejamos registro del nombre de la persona que escribió la noticia, dejamos solo la referencia a la tabla usuarios mediante una identificación única. Esto nos permite que a la hora de mostrar la noticia, si el usuario cambia uno de sus datos, ya sea porque el nombre estaba mal escrito, o una mujer que se casó y ahora quiere que se vea el apellido del marido también, o cualquier otro motivo, ahora solo va a tener que editar la tabla de usuarios, si nosotros hubiéramos puesto en la tabla noticias en lugar de idAutor, nombreDelAutor, al momento de actualizar la tabla de usuarios, también tendríamos que actualizar la de noticias. Bueno, más o menos ya entendieron cuál es la idea al relacionar las tablas, ahora, qué pasa si nosotros hacemos una consulta del tipo SELECT en la tabla de noticias para traer el listado completo, no vamos a saber cuál es el autor, solo vamos a tener un numerito que hace referencia a la tabla de usuarios pero no sabemos el nombre, nos tenemos que ir a fijar a esa tabla. Para evitar tener que hacer una nueva consulta es que existe una forma de generar las consultas agregando los ―joins‖ y en una sola consulta chequeamos dos o más tablas al mismo tiempo. La sintaxis es la siguiente: SELECT noticias.titulo, noticias.cuerpo, usuarios.nombre, usuarios.apellido FROM noticias INNER JOIN usuarios ON noticias.idAutor = usuarios.idUsuario
De esta forma unimos ambas tablas, fíjense que en las columnas primero aclaramos a que tabla pertenece lo que queremos traer y después el nombre del campo, lo mismo que cuando declaramos el INNER JOIN le tenemos que indicar con qué tabla queremos unir y después en ON le avisamos de qué forma es que unimos. Al final de esta consulta se puede poner sin problemas filtros del tipo WHERE, también ORDER BY y LIMIT.
Inner, Left y Right Joins Existen varios tipos de joins, los tres más comunes son los que puse en el título :). El inner join no va a mostrar ni un solo resultado si la condición de unión entre tablas no se cumple. Por ejemplo, si tenemos una noticia que tiene idAutor = 5 y en la tabla de usuarios se borró ese usuario, la noticia con el autor 5 no se va a mostrar si hacemos la consulta del tipo INNER. Por el contrario si la consulta es del tipo LEFT se van a mostrar igual los resultados de las noticias con el autor 5 pero los datos del usuario van a aparecer en blanco. Y si es del tipo RIGHT, lo que hace esto es darle más peso a la segunda tabla, por ejemplo, tenemos aparte de las tablas anteriores una tabla más que es noticiasImágenes donde dejamos registro de las imágenes que le asignamos a una noticia noticiasImagenes [idImagen, idNoticia, archivo]
Manual de PHP
39 Se puede dar el caso en que una noticia tenga varias imágenes, si nosotros hacemos la consulta de la siguiente forma: SELECT noticias.titulo, noticias.cuerpo, noticiasImagenes.archivo FROM noticias RIGHT JOIN noticiasImagenes ON noticias.idNoticia = noticiasImagenes.idNoticia
Vamos a lograr que nos traiga como resultado tantas líneas como imágenes tenemos asignadas, repitiendo los datos de las noticias, por ejemplo, puede ser que los resultados sean así: idNoticia - titulo - imagen 1 - Taller de PHP - php.jpg 1 - Taller de PHP - logo.gif
Union Otro tipo de consulta más compleja son los UNION, que sirve para combinar resultados de varias consultas del tipo SELECT. La sintaxis es: SELECT ... UNION [ALL | DISTINCT] SELECT ...
El union puede ser UNION ALL o UNION DISTINCT, con la primer opción va a traer todos los resultados encontrados en ambas tablas, y con DISTINCT solo los diferentes. Supongamos que tenemos dos tablas de noticias, una para las noticias publicadas y otra para el borrador, y nosotros queremos traer en una misma consulta todos los datos de ambas tablas ordenados por orden de fecha de creación, en estos casos es que tenemos que hacer la consulta del tipo UNION, para poder ordenar datos de dos tablas diferentes intercalando los datos entre un conjunto y otro. Espero que les haya gustado la clase de hoy, hasta la semana que viene.
Clase 23: MySql – Consultas más usadas Buenas, en la clase de hoy vamos a ver una forma de traer valores puntuales de la base de datos. También veremos cómo evitar hacer cuentas o cálculos complejos y cómo aplicar ―count―, los tipos de consultas ―max‖ y ―min―, ―sum‖ y ―limit―. Así que manos a la obra y ya saben que cualquier duda que vaya surgiendo pueden dejármela en los comentarios que trataré de responderlos a medida que van llegando.
Count El count nos va a dar el número de veces que se repite un valor en la db, es decir el número de registros almacenados que correspondan con nuestra consulta. Por ejemplo, en nuestra tabla de noticias, si queremos saber cuántas noticias hay publicadas entonces la consulta que hacemos es: SELECT COUNT(*) FROM noticias WHERE estado = 'publicado';
Ahora que pasa si queremos agregar algún otro campo en la consulta, por ejemplo el número de noticias publicadas por cada autor: SELECT autor, count(*) FROM noticias GROUP BY autor;
Fíjense que agregamos a la consulta GROUP BY que nos permite agrupar por el valor que queremos, por ejemplo, la consulta anterior nos traería como resultados posibles:
Manual de PHP
40 Justi - 3 Juan Manuel - 8 Wilkilen - 1
Max y Min Otro tipo de consulta muy común es traer el valor máximo o mínimo de un listado de valores. Supongamos que tenemos una tabla de productos con sus respectivos precios, si queremos traer el precio máximo o mínimo lo hacemos de la siguiente manera: SELECT MAX(precio) FROM productos; SELECT MIN(precio) FROM productos;
Y si queremos saber, por ejemplo, cuál es el precio promedio del producto con id 15 podemos hacer: SELECT AVG(precio) FROM productos WHERE idProducto = 15;
SUM Por último tenemos la suma. Por ejemplo, si tenemos un carrito de compras y seleccionamos 5 productos y queremos saber cuánto es el total a pagar por el usuario con id 3 deberíamos hacer: SELECT sum(precio) FROM carrito WHERE idUsuario = 3;
LIMIT Algo que es muy común también es limitar la cantidad de registros que queremos traer de la base de datos, por lo general algunas tablas pueden llegar a tener miles de registros y traer a todos haría demasiado uso de servidor y demoraría demasiado para lo que realmente necesita el script, es por ello que es muy comun limitar las consultas a la cantidad de resultados que necesitamos (si es que realmente conocemos este dato). Por ejemplo si hacemos una consulta con un count(*) porque queremos saber el total de registros de una tabla, al final le colocaremos LIMIT 1. SELECT count(*) FROM productos LIMIT 1;
Otra forma de usar el limit es pasándole dos argumentos en lugar de uno, por ejemplo, si ponemos: SELECT * FROM productos LIMIT 5,10;
El primer valor que ponemos es desde qué registro queremos empezar a traer (el primero es 0) y el segundo cuántos valores, por lo que la consulta anterior va a traer desde el producto con id 6 al 15. Es muy común utilizar el limit con dos argumentos cuando se desea hacer un paginado. Bueno, eso es todo por hoy, hasta la semana que viene!
Clase 24: Clase de Consulta La clase anterior fue la última en lo que respecta a MySQL y base de datos. Sé que no es un tema sencillo (incluso tuve que añadir una clase extra por allí) pero todo es práctica, constancia y consultas.
Manual de PHP
41 Por eso dejaré esta clase exclusivamente para que dejen sus comentarios con dudas o inquietudes que les puedan surgir. Tienen tiempo hasta el próximo lunes. Prometo responder todos los comentarios e incluso iré dando ejemplos para ser más claro. Prefiero que cerremos el tema de esta forma para retomar el taller luego con Manipulación de Archivos, algo diferente a lo que vimos hasta ahora.
Clase 25: Respuestas a consultas ¡Bienvenidos a otra clase del Taller de PHP! La semana pasada dijimos que íbamos a recavar todas las dudas y consultas para que quede todo claro antes de pasar al siguiente tema. Hoy es el día de las respuestas a todas esas dudas de modo que no veremos solamente un tema sino que el mismo irá variando de acuerdo a cada pregunta. La idea es que todos podamos aprovechar para afianzar lo que estuvimos viendo. ¡Comencemos!
Subiendo Imágenes a un Sitio ―Estoy haciendo un sitio web para una inmobiliaria, ya tengo las tablas y hago consultas y lo que tengo hecho está funcionando.El problema es que no sé cómo insertar fotos a la tabla, lo he intentado como tipo de datos bloc y cuando hago la consulta me da todos los datos pero en la foto sólo me salen garabatos, estoy empezando en esto y me encanta, solo quería saber si me puedes explicar o si puedes hacer una lección de cómo solucionar ese problema―. Cuando agregamos imágenes en forma dinámica a un sitio, a pesar de que las mismas se pueden guardar en base de datos, lo más conveniente, por una cuestión de performance, es guardar toda la información relacionada con la imagen en la base de datos como puede ser el nombre del archivo, peso de la imagen, etc, pero el archivo lo guardamos físicamente en el servidor, en el mismo lugar donde están nuestros scripts de php, puede ser dentro de una carpeta llamada Uploads o Subidas. Para ello php nos da una herramienta para poder recibir imágenes a través de un formulario y guardarla en donde deseamos. El proceso para subir arhivos al servidor será explicado en la clase 26 y la manipulación de imágenes para crear nuevas de diferentes tamaños en la clase 27.
IDE para desarrollar en php ―¿Utilizais algún IDE para desarrollar en php o simplemente un editor de texto?‖ Por IDE nos referimos a la herramienta que utilizamos para programar nuestros script, es más una cuestión de gustos que otra cosa el ―cuál es la mejor‖. En un principio yo utilizaba Dreamweaver, ya que trabajaba un poco en forma visual y un poco en modo código. Luego cuando ya practicamente hacia todo en modo código pase a usar Zend Studio, ambas opciones son desarrolladas por empresas privadas, por lo que hay que abonar por ellas, como alternativa gratuita a estas opciones está Eclipse, excelente programa que compite cabeza a
Manual de PHP
42 cabeza con Zend, de hecho actualmente yo estoy usando Eclipse con un plugin de Zend Studio obteniendo las mejores características de ambos programas.
Importar datos en la db de un CSV ―Me gustaría, si le es posible a alguno de ustedes, que me ayduaran a insertar registros a una tabla usando los datos de un archivo de texto separados por coma―. Excell una de las características que tiene es que nos permite guardar información en un archivo de texto plano separando cada campo por comas, este tipo de archivo se llama CSV. Mediante phpMyAdmin podemos importar directamente este archivo en una tabla de mysql. Algunas cuestiones a tener en cuenta son que en la tabla estén los campos en el mismo número y orden que se encuentran en el archivo de Excell o csv si es que ya está convertido, por ejemplo, si mi tabla mysql que se llama usuarios tiene nombre, apellido y edad como campos, en el csv tendría que tener solo tres campos por línea. Luego de tener en cuenta esto vamos a ingresar en nuestro phpMyAdmin, hacer clic en la tabla donde queremos importar los datos y arriba a la derecha hay una opción que dice importar. Ahí vamos a buscar el archivo que queremos subir, y nos va a preguntar un par de cositas como por ejemplo por que caracter están separados los campos, ya viene por defecto el ;, si esta todo correcto, hacemos clic en GO y listo, ya tenemos nuestra completa desde un CSV.
Conociendo la ip de nuestros navegantes ―En un formulario que he creado, todos los datos que el formulario recolecta se insertan sin problema en la base de datos, menos el campo en el cual va la ip del usuario que navega en mi sitio, siendo que el resultado que me muestra es ‘), esto me deja totalmente desquiciado, porque en otra base de datos y en el servidor de prueba, el campo funciona bien y registra la ip del visitante. ¿Sabría decirme a que puede deberse esta situación?‖ PHP nos brinda una herramienta muy potente para que podamos dejar registro de la ip de los navegantes de nuestro sitio, para ello tenemos que utilizar la variable $_SERVER["REMOTE_ADDR"]
Que nos va a devolver la ip del usuario, con esta variable podemos hacer lo que queremos, o un:
para ser agregado en un formulario en el campo hidden, o sino, mucho más seguro, es agregarlo directamente en el script que vamos a correr para guardar la información recibida desde el formulario y guardar en la db directamente, por más que el script que guarda la información corra en el servidor y el usuario no llega a ver todo el proceso que realiza PHP, igual obtiene la ip del usuario que hizo la petición por lo que no tendremos ningún problema. A medida que van apareciendo nuevas consultas que se encuentran fuera del programa las iré agregando aquí. ¡Saludos!
Manual de PHP
43 Clase 26: Manipulación de Archivos (1) Hola Chicos! ¡Bienvenidos a una nueva clase del Taller de PHP! Hoy vamos a ver un poco de manejo de archivos, más que nada la lectura y creación de un txt. Cómo abrirlo con la función fopen, cerrarlo con fclose o leerlo con fread. Dejaremos para la segunda parte la escritura y borrado del mismo. Con las mismas técnicas que vamos a ver en estas clases vamos a poder manipular no sólo txt sino también html, xml, etc. Abriendo un archivo Para abrir un archivo tenemos que usar la función de php fopen: fopen( "nombre_del_archivo", "modo"); Los diferentes modos que tenemos son: “r”: Abre el archivo para solo lectura y posiciona el puntero al principio del archivo. “r+”: Abre el archivo para lectura y escritura y posiciona el puntero al principio del archivo. “w”: Abre el archivo para escritura únicamente. Posiciona el puntero al principio del archivo y lo trunca con un largo de cero. Si el archivo no existe, intenta crearlo. “w+”: Abre el archivo para lectura y escritura. Posiciona el puntero al principio del archivo y lo trunca con un largo de cero. Si el archivo no existe, intenta crearlo. “a”: Abre el archivo para escritura únicamente pero posiciona el puntero al final del archivo. Si el archivo no existe, intenta crearlo. “a+”: Abre el archivo para lectura y escritura. Posiciona el puntero al final del archivo. Si no existe, intenta crearlo. “x”: Crea y abre para escritura únicamente el archivo. Posiciona el puntero al principio del archivo. Si el archivo ya existe, fopen() va a fallar y va a devolver un FALSE y generará un error de nivel E_WARNING. Si el archivo no existe, intenta crearlo. “x+”: Crea y abre para lectura y escritura. Posiciona el puntero al principio del archivo. Si el archivo ya existe, fopen() devuelve FALSE y genera un error de nivel E_WARNING. Si el archivo no existe, intenta crearlo. Por ejemplo si queremos empezar a manipular un archivo, debemos hacer lo siguiente: $archivo = fopen("/logs.txt","r"); Manual de PHP
44 De esta forma abrimos el archivo logs.txt y posicionamos el puntero en la primer línea para poder comenzar a leerlo. Cerrar Archivos Para cerrar el archivo debemos usar fclose(). A la función fclose debemos pasarle el puntero que abrimos con fopen, de la siguiente manera: fclose( $archivo ); De esta forma le avisamos a php que dejamos de usar el archivo (liberando memoria). Leer un Txt Para leer un archivo primero tenemos que abrir el puntero y luego usar la funcion fread(): fread( $puntero, $largo_del_archivo ); Un ejemplo completo sería: $archivo = "/logs.txt"; $puntero = fopen( $archivo, "r" ); $contenido = fread( $puntero, filesize( $archivo ) ); fclose( $puntero ); ¿Qué hicimos en nuestro script? Primero definimos la ruta a nuestro archivo en una variable, luego abrimos ese archivo pasándole la variable con la ruta y le decimos que sea con el modo sólo lectura y con el puntero al principio del archivo. Luego usamos fread y le pasamos el puntero y le decimos el tamaño de nuestro archivo. Guardamos todo el contenido en un string en la variable $contenido. Y luego cerramos el puntero. Ahora tenemos todo el contenido del archivo en la variable $contenido.
Clase 27: Manipulación de Archivos (2)
¡Hola a todos los lectores del Taller de PHP! ¿Estuvieron practicando bastante? Recuerden que la clase pasada comenzamos a ver cómo crear y manejar archivos (aprendimos a crear un txt, a abrirlo con la función fopen, a cerrarlo con fclose y a leerlo con fread). Manual de PHP
45 Hoy vamos a ver la segunda parte de manejo de archivos. En esta clase veremos como escribir y borrar archivos. Estonos permitirá, por ejemplo, crear un archivo HTML que adentro contenga lo que sea que queramos. ¡Comencemos! fwrite Para comenzar a escribir archivos, usaremos la función fwrite: fwrite( $puntero, "Texto que queremos guardar" ); Un ejemplo de su uso sería algo así: $fp = fopen("archivo.txt", "a"); fwrite($fp, "Escribimos un texto con lo que queremos guardar \r\n"); fclose($fp); ¿Qué fue lo que hicimos? Primero abrimos el archivo archivo.txt con el modo a, es decir que, si el archivo no existía lo creamos, y si existía y tenía contenido, el nuevo contenido que escribimos va a ser al final de todo, ya que el modo “a” posiciona el puntero al final. Luego de eso, usamos fwrite, pasándole el puntero que acabamos de abrir y luego el texto, fíjense que en el string que le pasamos, agregue al final \n\r, esto es para que haga un salto de linea en el archivo.txt que estamos creando, para que, si escribimos más texto, el mismo se ubique en un reglón por debajo y no todo de corrido. Luego de esto, cerramos el puntero. Casos de Uso Recuerdan la clase pasada que yo les dije que podían crear html o xml con este método, pues es muy sencillo, por ejemplo si queremos crear un html podemos hacer simplemente: $fp = fopen("holamundo.html", "a"); fwrite($fp, "Hola Mundo
"); fclose($fp); Sencillo ¿no? incluso si quieren pueden ponerle saltos de línea al html para que cuando lo abran con algún editor, no este todo el texto de corrido. Eliminar un archivo Para borrar directamente un archivo del servidor usamos la función unlink. unlink("url absoluta al archivo"); Por ejemplo si queremos borrar el archivo.txt lo hacemos de la siguiente manera:
Manual de PHP
46 $url = "c:/documentos/archivo.txt"; if ( file_exists( $url ) ) unlink( $url ); Fíjense que primero nos fijamos que exista el archivo ya que, si no existe, unlink nos va a tirar un error. Clase 28: Moviendo Archivos Hola, bienvenidos al Taller de PHP. En la clase de hoy vamos a ver cómo subir archivos al servidor y algunos casos de uso. En realidad suena complicado pero es más sencillo de lo que parece. Hay varias cosas a tener en cuenta para ello, por ejemplo, si vamos a utilizar un formulario para subir los archivos. Además hay que tener en claro el proceso que se llevará a cabo en el back-end, donde usaremos la función $_FILES, que nos permite trabajar mucho más específicamente con los archivos, agregar restricciones, etc. ¡Comencemos!
¿Cómo tiene que ser nuestro formulario? A la hora de querer subir un archivo al servidor desde un formulario para poder agregar imágenes en una noticia, por ejemplo, tenemos que tener en cuenta algunos detallecitos. El más importante de todos y el que casi todo el mundo se olvida es avisarle al formulario que se van a enviar archivos, para ello agregamos el siguiente parámetro en el tag de apertura del formulario: enctype=”multipart/form-data”. Y luego sí, agregamos el input de tipo file para que se pueda enviar un archivo. El formulario básicamente quedaría así:
El Back-End En nuestro back-end, o sea, en nuestro proceso por php para recibir el formulario, lo vamos a hacer exactamente igual que como lo veníamos haciendo con el resto de los formularios, vamos a recibir vía POST las variables titulo y cuerpo, pero no imagen. Sí, ya sé que nuestro input se llama imagen, pero en este caso en lugar de recibirla como $_POST[‘imagen‘], la vamos a recibir como $_FILES[’imagen’]. ―¿Qué diferencia hay con POST?‖ se preguntarán y la respuesta es bastante sencilla, FILES nos da bastante más información respecto al archivo que subimos: $_FILES[’imagen’][’tmp_name’] - nos da la ruta y el nombre temporal al archivo que acabamos de subir, si no queremos perder este archivo, lo que tenemos que hacer es moverlo a
Manual de PHP
47 una carpeta nuestra dentro del hosting, por lo general no se tiene acceso a la carpeta temporal donde se suben los archivos. $_FILES[’imagen’][’size’] - nos dice el tamaño que tiene el archivo, por si se realiza un servicio público y queremos limitar la subida solo a archivos de 1 mega, entonces se puede poner una condición utilizando este valor. $_FILES[’imagen’][’type’] - nos va a indicar el tipo de archivo del que se trate, en nuestro ejemplo, como sólo queremos que se suban imágenes podemos poner un if limitando sólo al caso de las imágenes. $_FILES[’imagen’][’name’] - nos va a indicar el nombre del archivo original, ya que el tmp_name es un nombre generado por el servidor. Entonces ya sabiendo cómo leer el archivo que acabamos de enviar desde el formulario, solo nos resta moverlo a la carpeta de destino. Supongamos que nosotros en el servidor tenemos la carpeta uploads donde vamos a guardar todas las imágenes de las noticias, lo que tenemos que hacer es poner la url absoluta a esa carpeta. Fíjense que no es desde donde están todos nuestros scripts de php, sino que va a ser algo del estilo /var/www/elwebmaster.com/htdocs/uploads, y si están en Windows probablemente sea algo así: c:/archivos de programa/xampp/www/elwebmaster.com/uploads. Si ustedes tienen un servicio de hosting contratado, lo más probable que les hayan enviado un email con la información a su carpeta absoluta en el servidor, ya que ustedes si ingresan por ftp, van a entrar directamente a la carpeta a donde incluyen sus scripts, pero en realidad esta tiene un raíz en otro lado. Si no tienen el email, y no tienen ni idea como es la url absoluta en donde están parados, pueden generar un error de php a propósito, y el mismo error les va a decir dónde se encuentran, por ejemplo, si en sus script ponen:
Les va a aparecer el siguiente error: Parse error: syntax error, unexpected T_STRING in /var/www/elwebmaster.com/www/index.php on line 5
Eso quiere decir que nuestra url absoluta es /var/www/elwebmaster.com/www/ Bueno, ya tenemos nuestro archivo, ya conocemos nuestra url absoluta y ya tenemos nuestra carpeta donde queremos mover, lo que vamos a hacer es usar la función de php move_uploaded_file(), que va a mover un archivo recién subido a una nueva ubicación:
¿Sencillito, no? La semana que viene vamos a ver como recibir imágenes grandotas y convertirlas en imágenes más pequeñas para que se adapten a nuestro sitio. ¡Saludos!
Manual de PHP
48
Clase 29 Manipulación de Imágenes ¡Hola, bienvenidos nuevamente al Taller de PHP! La clase anterior vimos cómo subir imágenes a nuestro sitio a través de un formulario, en la clase de hoy lo que vamos a hacer es aprender a manipular esas imágenes para generar una imagen más pequeña, llamada thumbnail. Para poder manipular imágenes vamos a necesitar que nuestro servicio de hosting tenga instalada la libreria LibraryGD, no se preocupen igual ya que la mayoría de los servidores de hoy en día la incluyen, incluso si instalaron Xampp en sus computadoras también lo tienen.
Generando imágenes Antes que nada guardamos en una variable la dirección absoluta (la que expliqué en la clase anterior) a la imagen de origen, por ejemplo, si tenemos en una variable $imagen con el nombre de la imagen y sabemos dónde se guardó, generamos una variable $archivo: $archivo = "/var/www/elwebmaster.com/uploads/$imagen";
Una vez que tenemos el archivo, debemos corroborar que se trate de una imagen, y obtener la extensión, para ver si se trata de un gif, jpg, png, etc. $separo = explode( '.', strtolower($imagen) ); $nombre = $separo[0]; $extension = $separo[1];
Con explode lo que hacemos es convertir en array un string, indicándole por que patrón queremos separar, en este caso lo separamos por un punto. Con strtolower lo que hacemos es llevar primero a minúsculas todo, así cuando generemos nuevas imágenes se generan con nombres todos en minúsculas. El array que se genera tiene por nombre $separo y tiene dos índices 0 y 1, ya que cada imagen sólo tiene un único punto, por lo que separa el string en dos únicamente. Luego de esto armamos un switch para ver qué tipo de extensión tiene el archivo y creamos una nueva imagen según la extensión que tenga. switch( $extension ) { case 'gif': $imagen_src = imagecreatefromgif( $archivo ); break; case 'jpg': $imagen_src = imagecreatefromjpeg( $archivo ); break; case 'png': $imagen_src = imagecreatefrompng( $archivo ); break; default: trigger_error(”Formato de imagen no soportada!!!”, E_USER_ERROR); }
Con imagecreatefrom* lo que hacemos es crear una nueva imagen desde la url absoluta de la imagen que queremos y nos devuelve el identificador a esa nueva imagen creada.
Manual de PHP
49 Luego, lo que hay que hacer es crear una nueva imagen true color del tamaño de la nueva imagen que queremos generar, por ejemplo, una imagen 100px de ancho por 120px de alto. $imagen_dst = @imagecreatetruecolor(100, 120);
Utilizamos el @ antes de la función imagecreatetruecolor para evitar que se muestre un mensaje de error si es que no se puede llegar a generar la imagen en true color (ya que depende de la versión de php que tenemos instalado en el servidor). Continuamos generándola normal si es que no se generó. if ( empty($imagen_dst) ) { $imagen_dst = imagecreate(100, 120); }
Luego de esto tenemos que setearle el modo de blending a la imagen (para mejorar la calidad de la imagen que vamos a crear), para ello hacemos lo siguiente: imagealphablending($imagen_dst, false);
Luego, tenemos que copiar la imagen original en el tamaño nuevo que queremos obtener, para ello utilizamos: imagecopyresampled ( $imagen_dst , $imagen_src , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h );
Con esta función lo que hacemos es pasarle como parámetros, la imagen blanca que generamos con el tamaño deseado (imagen de destino), luego la imagen creada a partir de la original, luego le indicamos qué punto x queremos dibujar en la imagen de destino, en nuestro caso va a ser 0, ya que vamos a reemplazar toda la imagen blanca por la nueva imagen. Luego, qué coordenada y de destino (dst_y), que también va a ser 0, a continuación a partir de que coordenada x del origen vamos a copiar, nuevamente es 0 ya que queremos copiar absolutamente toda la imagen, luego la coordenada y del origen (src_y). Finalmente le pasamos el ancho del destino, y el alto del destino (dst_w y dst_h) que va a ser el total de la imagen blanca generada anteriormente y el ancho del origen y el alto del origen, que también va a ser igual al ancho y alto de la imagen original. Esto quedaría así: imagecopyresampled($imagen_dst,$imagen_src,0,0,0,0,100,120, imagesx($imagen_src),imagesy($imagen_src));
Ahora generamos un nuevo nombre para la imagen recién generada y en que lugar la queremos guardar $nueva_ruta = "/var/www/elwebmaster.com/uploads/{$imagen}-th.{$extension}";
Finalmente creamos la imagen definitiva que vamos a usar con imagejpeg y destruimos las imágenes generadas en el proceso para liberar memoria: imagejpeg( $imagen_dst, $nueva_ruta ); imagedestroy( $imagen_src ); imagedestroy( $imagen_dst );
Espero que se haya entendido ¡hasta la semana que viene!
Manual de PHP
50 Clase 30: Funciones más útiles predeterminadas de PHP
Hola, la clase de hoy vamos a ver algunas funciones muy comunes que ya vienen con php que nos van a resultar muy útiles a la hora de realizar nuestros scripts. Además veremos las funciones más usadas para manipular arrays, como array_diff, array_search e in_array. ¡No perdamos más tiempo y comencemos con nuestra clase de hoy del Taller de PHP!
Time() No se si están familiarizados con el termino ―unixtime‖, por las dudas se los comento de forma informal, prácticamente es una forma de trabajar con fechas y horas pero con un numero entero. Es un número que representa los segundos pasados desde el primero de enero de 1970. Para trabajar calculando diferencias de fecha, ordenar resultados de la base de datos con campos de fechas, etc, es más práctico, eficiente y liviano trabajar con unixtime en lugar de con la fecha ―2008-07-06 17:48:12″, ya que no hay que parsear el string con la fecha. La función de php time() nos va a devolver la hora unix (unixtime) al momento que la pedimos, por ejemplo, si queremos calcular la hora de la semana pasada para poder traer de la base de datos los últimos artículos de la semana podemos calcularlo de la siguiente forma:
El número que estamos restando luego de time() son los segundos que tiene una semana, es más fácil y practico poner el calculo de segundos por minuto por minutos por hora por horas del día por días de la semana que poner directamente el resultado, ya que de este modo, a la hora de ver el código de nuestro script lo vamos a entender mejor que si estamos viendo el resultado de esa multiplicación directamente.
date() Nos devuelve un string con el formato de hora que le pasemos. Por ejemplo si ponemos: $ahora = date(”Y-m-d H:i:s”);
nos va a devolver 2008-07-06 18:42:00. Si como segundo parámetro le pasan una hora unix, date va a devolver un string de la hora que le pasaron, por ejemplo: $fecha = date("Y-m-d", 123516512 );
nos va a devolver el día correspondiente a esa hora.
Manual de PHP
51
mktime() Sigue con la tónica de Unixtime, esta vez, nos va a devolver un unixtime de la fecha que le pasemos. La sintaxis es la siguiente: mktime (hora, minutos, segundos, mes, dia, año );
Por ejemplo, combinando con date, podemos tener datos mas completos de un día del pasado o del futuro: echo date("F j, Y", mktime(0, 0, 0, 7, 6, 1977));
Y eso me va a mostrar por ejemplo ―Julio 6, 1977″, algo un poco más interesante puede ser: echo date("D j \d\e F \d\e Y", mktime(0, 0, 0, 7, 6, 1977));
y va a mostrar Dom 6 de Julio de 1977 por ejemplo.
Manipulacion de arrays Algúnas de las funciones más utilizadas y utiles con respecto a arrays son: array_diff Muestra las diferencias entre un array y otro: $a = array( "hola", "chau", "como" ); $b = array( “hola”, “va”, “como” ); $dif = array_diff( $a, $b ); print_r($dif);
mostrara algo asi Array ( [1] => “chau” )
array_search Buscara un valor especifico en un array y devuelve el índice si lo encuentra, por ejemplo: $a = array( 0 => "Justi", 1 => "Thor", 2 => "Debi" ); $key = array_search(‟Debi‟, $a);
La variable $key va a tener valor 2. in_array Es similar a la anterior pero en lugar de devolver el indice de la coincidencia, devuelve true o false. Por ejemplo: if ( in_array( "Justi", $a ) ) { $cuerso = “php”; }
Mayúsculas y minúsculas strtolower(): convierte todo el string en minúsculas. strtoupper(): pasa todo el string a mayúsculas. ucfirst(): convierte la primer letra del string en mayúscula. ucwords(): convierte cada primer letra de cada palabra en mayúscula. Por ejemplo si tenemos un string: $titulo = "TALLER DE PHP - FUNCIONES UTILES";
Manual de PHP
52 …y queremos modificarlo para que todos los títulos sean iguales, todos los caracteres en minúscula menos la primer letra de la frase, tenemos que pasar primero el string a minúsculas y después hacer que la primer letra sea mayúscula. $titulo = ucfirst( strtolower( $titulo ) );
Espero que la clase de hoy les haya gustado y los espero la semana que viene.
Clase 31: Expresiones Regulares (1) Hola, bienvenidos a otra clase del Taller de PHP de elWebmaster.com. Hoy veremos expresiones regulares, una herramienta muy útil a la hora de trabajar con strings muy largos, ya que nos permite buscar un patrón especifico dentro de una cadena de texto. Asimismo, veremos que los operadores pueden ayudarnos haciendo que la expresión sea más ―flexible‖ es decir, que se adapte a patrones mucho más complejos. ¡Empecemos!
¿Qué son las expresiones regulares? Básicamente es como puse en el primer párrafo, una expresión regular es una expresión que nos permite encontrar patrones dentro de textos, pero ¿De qué clase de patrones estamos hablando? Por ejemplo las palabras Webmaster, elWebmaster y elWebmaster.com comparten Webmaster, mediante expresiones regulares podemos encontrar qué palabras coinciden con ese patrón para realizar alguna tarea especifica. Es muy común utilizar expresiones regulares por ejemplo a la hora de verificar que un email sea verídico, ya que todos los correos electrónicos van a contener un @ y un .com en alguna parte de la cadena. Ahora bien, no siempre estamos buscando un patrón exacto como fue el primer ejemplo de ―Webmaster‖, hay veces que tenemos que buscar patrones más difíciles como por ejemplo encontrar en una cadena de texto html donde se encuentra una imagen. En este caso ya no es tan sencillo porque sabemos que todas las imágenes si o si van a tener un pero no sabemos si van a tener algo más como puede ser un class=‖" o un style=‖", border=‖", etc. Es en estos casos cuando empezamos a jugar con los operadores en la expresión para que se adapte a lo que estamos buscando.
Operadores más comunes | - significa alternación (ó) por ejemplo ―nen(e|a)‖, eso va a coincidir con nene o con nena. + - significa que el caracter al que sigue debe aparecer al menos una vez. Por ejemplo ―goo+gle‖ coincide con la expresión google, gooogle, gooooooogle, etc. ya que la 2da ―o‖ de google tiene que aparecer por lo menos una vez. ? - significa que el caracter al que sigue debe aparecer por lo mucho una vez pero no es necesario que aparezca, un ejemplo de esto es el patrón ―p?sicologo‖, machea con psicologo y sicologo. * - significa que el caracter al que sigue puede aparecer cero, una o muchas veces. ―gooo*gle‖ va a coincidir con google, gooogle, goooooogle, etc. Fíjense que a diferencia del patrón con el operador +, acá le pusimos tres ―o‖ en google, ya que no es necesario que este la tercer ―o‖.
Manual de PHP
53 () - los paréntesis se utilizan para agrupar un conjunto de caracteres o definir el ámbito de acción de la expresión, por ejemplo el que puse antes de nene o nena y sino uno un poco más complejo puede ser ―(sin)?verguenza‖, fíjense que en ese caso pusimos el conjunto ―sin‖ precedido por el ?, lo que significa que esta expresión va a machear con las palabras sinverguenza, verguenza pero no con sinsinverguenza por ejemplo. ^ - significa que nuestro patrón debe ubicarse al comienzo del string que queremos analizar, por ejemplo el patrón ―pe‖ coincide con ―perro‖, ―pepe‖, ―pelota‖ pero no coincide con ―trompeta‖ o ―campera‖. $ - es similar al ^ pero ahora nuestro patrón debe ubicarse al final del conjunto de caracteres a analizar, por ejemplo ―ta‖, machea con ―carpeta‖, ―bicicleta‖, o ―esta‖ pero no lo hace con ―tambien‖ o ―estampida‖. . - el punto representa cualquier otro caracter, por ejemplo si lo que queremos buscar es la url de una imagen podemos poner en nuestro patrón ―src=‘(.+)‘‖ por ejemplo, en este caso estaríamos buscando una cadena de caracteres que contenga src=‘un caracter por lo menos‘. \ - sirve para escapar un caracter, por ejemplo si en nuestro patrón queremos buscar un símbolo de $, si no lo escapamos, al procesar el string va a buscar el patrón al final de la cadena y nos va a fallar entonces necesitamos escaparlo, y eso se hace con la barra invertida, nuestro patrón quedaría algo así ―\$(.+)‖ y eso coincide con $100, $1388. Si buscamos una cifra de dos números podemos armarlo de la siguiente manera ―\$(.+){2}‖, eso le va a indicar que luego del $ haya dos caracteres, y si queremos que sea una cifra de 0 a 3 por ejemplo, podemos indicarle ―\$(.+){0,3}‖ Básicamente estas son las reglas básicas a la hora de trabajar con expresiones regulares, ya la clase que viene vamos a ver como utilizarlas con php. Saludos y disfruten la semana.
Clase 32: Expresiones Regulares (2) Hola, hoy terminaremos con la clase de expresiones regulares. Para ello vamos a ver las funciones de php más utilizadas a la hora de realizar tareas con las mismas. Entre ellas veremos preg_match (que busca una expresión en un string), preg_match_all (que en lugar de terminar en la primer expresión que encuentra, continua volcando en un array todas las coincidencias) y preg_replace (que busca una expresión regular y reemplaza el contenido de esa expresión por otro predefinido). ¡Comencemos!
preg_match Busca una expresión en un string. La sintaxis es: preg_match ( $patron, $string, $match );
$patron es el patrón como vimos la clase pasada, hay que ponerlo entre barras (/), igual no se preocupen, ya veremos un ejemplo. $string es el lugar donde queremos buscar nuestro patrón. $match es un parámetro opcional, no es necesario que este, si lo incluimos, ahí tendremos un vector con los resultados coincidentes con nuestro patrón, si no lo incluimos preg_match nos va a devolver true o false dependiendo si lo encontró o no. Esta funcion (preg_match()) apenas encuentre una coincidencia va a dejar de correr.
Manual de PHP
54
Otro ejemplo:
En este caso el echo $matches[0] nos va a imprimir def ya que el patrón estaba definido en el resultado, pero si cambiáramos el patrón por algo genérico
Ahora en $matches vamos a tener un vector con $matches[0] = “info@” y en $matches[1] = “info”, esto se debe a que primero pone el resultado general, y segundo lo que esta dentro de los paréntesis (), si hubiésemos puestos varios paréntesis, tendríamos también un $matches[2], $matches[3], etc etc. Siempre que quieran ver el contenido de un vector, con sus índices para saber donde esta el contenido de cada cosa, pueden hacer
Y eso les va a imprimir en pantalla algo asi: array(2) { [0] => string(5) “info@” [1] => string(4) “info” }
De esta forma pueden ir viendo todo el tiempo cual es el contenido de sus vectores.
preg_match_all Esta función es similar a preg_match, pero en lugar de terminar en la primer expresión que encuentra, continua volcando en un array todas las coincidencias. preg_match_all ( $patron, $string, $matches)
En este caso, el resultado del var_dump para $matches va a ser: array(2) { [0]=> array(1) { [0]=> string(5) “info@”
Manual de PHP
55 } [1]=> array(1) { [0]=> string(4) “info” } }
preg_replace Busca una expresión regular y reemplaza el contenido de esa expresión por otro predefinido. preg_replace( $patron, $reemplazo, $sujeto )
En $patron vamos a poner el o los patrones a buscar, en $reemplazo, lo que queremos poner en el lugar del patrón y $sujeto va a ser el string original en el que queremos buscar el contenido para ser reemplazado. Por ejemplo:
Ahora vamos a ver en pantalla ―El taller de dreamweaver de Thor es el mejor‖ Eso es todo por hoy, espero que hayan entendido todo el taller hasta este punto, ya que la clase que viene empezaremos con ¡Practica! Como crear nuestro propio blog.
Clase 33: Creando nuestro propio blog (sistema de administración de contenido) Introducción ¡Hola, bienvenidos al Taller de PHP de elWebmaster.com! El día de hoy veremos la introducción para crear un blog desde cero. La idea de esta etapa final del curso, es que vean más o menos cómo se relaciona todo lo que estuvimos viendo hasta el momento. ¿En qué consiste nuestro blog? Básicamente lo que vamos a hacer es un sistema que muestre noticias, ordenadas por fecha cronológicamente descendente, a las cuales se les podrá dejar comentarios. ¡Comencemos!
Diferentes niveles de accesos Para poder llevar a cabo nuestro blog vamos a necesitar tres niveles diferentes de usuarios, el nivel base va a ser el usuario anónimo, o sea aquel usuario que nunca se registró en nuestro sitio, podrá leer todo el contenido del mismo pero no podrá dejar comentarios. El siguiente nivel es el usuario común o usuario registrado, que podrá dejar comentarios en las noticias. Y por último tenemos el usuario administrador que se va a encargar de publicar noticias y aprobar comentarios de los usuarios.
Manual de PHP
56 Normalmente en los blogs no hace falta ser un usuario registrado para dejar comentarios, pero va a ser útil que aprendan como se puede hacer un sistemita de registro, así que los permisos los incluimos de esta forma para fines prácticos.
Diferentes características del contenido El contenido del sitio va a estar separado por categorías por lo que las noticias no sólo se deberán mostrar cronológicamente sino que también se tendrán que poder filtrar por categorías.
FrontEnd y BackEnd. ¿Qué son? Esto más o menos ya lo expliqué en una de las clases anteriores pero lo vuelvo a comentar ya que es útil. Por FrontEnd entendemos a lo que vé el usuario anónimo o usuario registrado, es la parte frontal o visible del sitio. Por BackEnd nos referimos al panel de control para administrar el sitio. A donde vamos a publicar nuestras noticias, guardar borradores y aprobar comentarios Bueno, todo eso es más o menos lo que vamos a ir viendo en las clases siguientes hasta terminar el tallercito, espero que les guste lo que se viene. Nos vemos el lunes que viene.
Clase 34: Nuestro blog- Creación de la base de datos
Hola, acá estoy de nuevo para continuar con nuestro propio blog. En la clase de hoy vamos a ver como va a ser la estructura de nuestra base de datos. Básicamente vamos a tener cuatro tablas. Una de usuarios, otra de noticias, una tercera con las categorías que van a tener las noticias y finalmente una tabla con los comentarios a las noticias.
Estructura de la base de datos de nuestro blog: Tabla: usuarios Field
Type
idUsuario
int(11)
usuario
varchar(50)
password
char(32)
email
varchar(50)
tipo
enum(‘comun‘,'admin‘)
Null
Key Default
Extra
PRI
auto_increment
NULL
comun
Sintaxis sql para crear la tabla: CREATE TABLE `usuarios` ( `idUsuario` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
Manual de PHP
57 `usuario` VARCHAR( 50 ) NOT NULL , `password` CHAR( 32 ) NOT NULL , `email` VARCHAR( 50 ) NOT NULL , `tipo` ENUM( „comun‟, „admin‟ ) NOT NULL DEFAULT „comun‟ ) ENGINE = MYISAM ;
Hacemos que idUsuario sea la primary key con un autoincrement para que se vaya sumando a medida que se van registrando nuevos usuarios, también ponemos que el campo usuario tenga un varchar de 50, ya que no sabemos qué tan largos pueden llegar a ser los nombres de usuarios elegidos por los mismos, lo que sí podemos hacer es limitárselo a 50. Por otro lado el campo password va a tener siempre un ancho de 32 caracteres, porque para mayor seguridad vamos a usar una codificación md5 y los códigos que genera la misma tienen siempre la misma cantidad de caracteres. El campo email es igual que el del usuario y el de tipo es con un enum, ya que solo vamos a tener dos tipos de usuarios. Por otro lado tenemos la tabla de noticias:
Tabla: noticias Field
Type
idNoticia
int(11)
titulo
varchar(50)
copete
varchar(255)
cuerpo
text
idUsuario
int(11)
idCategoria
int(11)
fPublicacion
timestamp
fCreacion
timestamp
fModificacion
timestamp
Null
Key
Default
Extra
PRI
NULL
auto_increment
Sintaxis sql para crear la tabla: CREATE TABLE `noticias` ( `idNoticia` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `titulo` VARCHAR( 50 ) NOT NULL , `copete` VARCHAR( 255 ) NOT NULL , `cuerpo` TEXT NOT NULL , `idUsuario` INT( 11 ) NOT NULL , `idCategoria` INT( 11 ) NOT NULL , `fPublicacion` TIMESTAMP NOT NULL , `fCreacion` TIMESTAMP NOT NULL , `fModificacion` TIMESTAMP NOT NULL ) ENGINE = MYISAM ;
No hay mucho que explicar en esta, también tenemos una primary key en idNoticia para identificar a cada una, tenemos una relación 1 a muchos entre una noticia y un usuario, es decir, una noticia puede tener un sólo autor pero un autor puede tener muchas noticias. Lo mismo con
Manual de PHP
58 las categorías, una noticia puede tener una sola categoría pero una categoría puede tener muchas noticias. Y también tenemos tres campos de fechas, uno para la fecha de publicación de la noticia, otra para la fecha en que se creó y finalmente cuando se modificó. Para la tabla de categorías vamos a tener:
Tabla: categorías Field
Type
idCategoria
int(11)
valor
varchar(50)
Null
Key
Default
Extra
PRI
NULL
auto_increment
Sql: CREATE TABLE `categorias` ( `idCategoria` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `valor` VARCHAR( 50 ) NOT NULL ) ENGINE = MYISAM ;
Y finalmente la tabla de comentarios:
Tabla: comentarios Field
Type
idComentario
int(11)
comentario
text
idUsuario
int(11)
idNoticia
int(11)
estado
enum(‘sin validar‘,'apto‘)
fCreacion
timestamp
Null Key Default PRI NULL
Extra auto_increment
sin validar
Sql: CREATE TABLE `comentarios` ( `idComentario` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `comentario` VARCHAR( 255 ) NOT NULL , `idUsuario` INT( 11 ) UNSIGNED NOT NULL , `idNoticia` INT( 11 ) UNSIGNED NOT NULL , `estado` ENUM( ‟sin validar‟, „apto‟ ) NOT NULL DEFAULT ‟sin validar‟, `fCreacion` TIMESTAMP NOT NULL ) ENGINE = MYISAM ;
En esta tabla tenemos también una relación 1 a muchos con los usuarios, ya que un comentario puede tener un único usuario pero un usuario puede tener muchos comentarios, lo mismo para las noticias. Por otro lado tenemos un estado, ya que apenas un usuario escribe un comentario el mismo está sin validar por un administrador, en este punto podemos optar por mostrar o no los comentarios no
Manual de PHP
59 validados (igual todavía no estamos en esa disyuntiva) y los mismos aparecerán en un listado general para que un admin los apruebe o los borre. Y por último tenemos la fecha de creación del mismo. Bueno, espero que les haya gustado la forma en que diagramamos nuestro blog, ya apartir de la clase que viene vamos a empezar con la codificación del mismo.
Clase 35: Nuestro blog- Registro de usuario
¡Hola! ¿Cómo les va? En la clase de hoy vamos a ver cómo hacer para crear un formulario para que se registren nuestros usuarios. Por un lado vamos a tener algunos archivos en la carpeta raíz, pero por otro vamos a tener una carpeta llamada “admin” que es donde va a estar nuestro backend. En esta carpeta también tendremos dos archivos adicionales que son necesarios antes de arrancar.
Cómo vamos a organizar nuestros archivos La estructura de archivos por le momento será: + admin ————– - config.php - conexion.php ————– - index.php - registrar.php El primer archivo que vamos a ver, config.php, es un archivo de configuración, en el cual guardaremos constantes que vamos a necesitar a lo largo del sitio. El misma va a contener: admin/config.php
El mismo deberá estar completo con los datos de su base de datos. El siguiente archivo, conexion.php, contiene una función que devuelve ―false‖ o ―el puntero‖ a la conexión con la base de datos, ya que en todas o casi todas las páginas de nuestro sitio necesitaremos una conexión con la db, es práctico mantenerla dentro de una función. admin/conexion.php
Fíjense que estamos usando las constantes que agregamos en el archivo config.php, esto es práctico a la hora de tener que cambiar de base de datos, o migrar el sitio, sólo tendremos que modificar el archivo de configuración. Listo, ya tenemos nuestros dos archivos antes de comenzar el proceso de registro. En el archivo index.php tendremos una presentación por el momento, donde se podrá optar por registrarse o ingresar (más adelante tendremos las noticias, pero todavía estamos muy verdes). index.php Blog Personal
Registro de Usuario
Antes de explicar el código php voy a explicarles el html, lo primero que tenemos es un if preguntando si existe una variable $error, esta variable va a contener un array con los errores que ha cometido el usuario al completar el formulario, por ejemplo no ha completado el nombre de usuario. Fíjense que uso , eso es equivalente a hacer , es muy práctico a la hora de tener que imprimir una sola linea o algo en el medio de html. Luego tenemos el formulario, la acción del mismo es sobre el mismo archivo registrar.php, de esta forma podemos marcar en el momento si hubo algún error, en caso de que no lo haya nosotros nos encargaremos por php de redireccionar al archivo index.php avisando de que el mismo fue exitoso. Otra cosa a tener en cuenta es que en el value de cada campo del formulario hacemos un echo de la variable correspondiente a dicho campo, esto es a que si el usuario se olvido de completar el campo de email, que no pierda los datos que completó anteriormente. Bueno, ya estamos listos para analizar el código php. Primero incluimos nuestros dos archivos necesarios, config y conexion, y llamamos a la función conexion guardando el puntero en una variable. Una vez hecho esto, verificamos si se envió el formulario, para comenzar a registrar el usuario o sólo mostrar el formulario. Guardamos cada campo completado por el usuario en una variable para poder mostrársela al usuario en caso de errores. Luego definimos nuestro array $error con los mensajes de error en caso de que los haya. Si no hay errores, agregamos el usuario en nuestra base de datos mediante la sentencia INSERT de mysql. Y luego de esto redireccionamos a index.php?registro=true utilizando header() Bueno, bastente sencillito ¿no? por las dudas acá les dejo los archivos que utilizamos hoy: Clic aquí para descargar los archivos de ejemplo de este taller >>
Manual de PHP
63 Clase 36: Nuestro blog- Ingreso y reconocimiento de usuarios
Bueno, la clase pasada vimos cómo nuestros usuarios se podían registrar en nuestro sitio, en la clase de hoy vamos a ver cómo van a poder iniciar sesión. Hay una cosita que me quedó pendiente de la clase anterior y es explicar cómo es que hice la consulta para ingresar los datos del usuario a través del sistema de registro. Si prestan atención, en donde va la contraseña le agregué una función que se llama md5(), esta función lo que nos permite es mantener las contraseñas encriptadas, de forma que ninguna persona pueda llegar a conocer jamás la contraseña de un usuario. Es muy común en los sitios serios utilizar este método de encriptación de contraseña. Una forma de verificar que esto se este utilizando en los sitios es con el proceso de recuperación de la misma en caso de olvido. Si les envían su contraseña tal cual la escribieron es porque no se está encriptando, en cambio si les envían una nueva contraseña o la posibilidad de escribirla nuevamente, es muy probable que estén encriptándola. Bueno, aclarado esto, vamos a la clase de hoy. Hoy vamos a utilizar tres archivos, uno ya lo tenemos (index.php) y los otros dos los vamos a crear (ingresar.php y admin/esUsuario.php). Primero veamos qué tiene el archivo que está dentro de la carpeta admin que se llama esUsuario.php PLAIN TEXT
1. function esUsuario ( $usuario, $password, $conexion ) { 2. 3. // verifica que esten los dos campos completos. 4. if ($usuario=='' || $password=='') return false; 5. 6. // busqueda de los datos de usuarios para loguear. 7. $query = "SELECT idUsuario, usuario, password, tipo FROM `usuarios` WHERE usuario = '$usuario'"; 8. $resultado = mysql_query ($query, $conexion); 9. $row = mysql_fetch_array ($resultado); 10.
$password_from_db = $row ['password'];
11.
unset($query);
12. 13.
// verifica que el pass enviado sea igual al pass de la db.
14.
if ( $password_from_db == $password ) {
Manual de PHP
64 15.
return $row;
16.
} else return false;
17. 18.
}
19. 20.
?>
Es una función a la que le pasaremos por parámetros el nombre de usuario, la contraseña (ya encriptada con md5) y el puntero de conexión. Básicamente lo que buscamos con esta función es que nos devuelva un array con los datos del usuario en la base de datos en caso de que complete bien la información solicitada o FALSE en caso de que no exista o la contraseña no coincida. Lo primero que hacemos es verificar que tanto $usuario como $password no se encuentren vacíos. Luego hacemos una consulta a la base de datos tratando de buscar toda la información del usuario correspondiente con $usuario. Luego de esto verificamos que la contraseña ingresada por parámetro $password sea igual con la que se encuentra en la base de datos. En caso de que lo sean devolvemos un array con los datos obtenidos de la db, caso contrario devolvemos FALSE. Creo que quedó bastante sencillita, gracias a Ricardo Kotik me di cuenta que en el proceso de registro me faltó algo fundamental, que es verificar que sea único el nombre de usuario, es decir, que no esté siendo utilizado por otra persona, esto es fundamental, por lo que más adelante veremos la forma de crear una función que verifique esto, o si no la solución que nos brindó Ricardo en el comentario de la clase anterior es muy buena. Sólo hay que incluirlo en el proceso de registro, cuando estamos comprobando los errores. Bueno, ahora sí, vamos a nuestro archivo ingresar.php PLAIN TEXT
1. // iniciamos sesiones 2. session_start (); 3. 4. // archivos necesarios 5. require_once 'admin/config.php'; 6. require_once 'admin/conexion.php'; 7. require_once 'admin/esUsuario.php'; 8. 9. // obtengo puntero de conexion con la db 10.
$dbConn = conectar();
11. 12.
// verificamos que no este conectado el usuario
13.
if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) {
Manual de PHP
65 14.
if ( esUsuario( $_SESSION['usuario'], $_SESSION['password'] ) ) {
15.
header( 'Location: index.php' );
16.
die;
17.
}
18.
}
19. 20.
// si se envio el formulario
21.
if ( !empty($_POST['submit']) ) {
22. 23.
// definimos las variables
24.
if ( !empty($_POST['usuario']) )
$usuario
=
$password
=
$_POST['usuario']; 25.
if ( !empty($_POST['password']) ) $_POST['password'];
26. 27.
// completamos la variable error si es necesario
28.
if ( empty($usuario) )
$error['usuario']
= 'Es
obligatorio completar el nombre de usuario'; 29.
if ( empty($password) ) $error['password']
= 'Es
obligatorio completar la contraseña'; 30. 31.
// si no hay errores registramos al usuario
32.
if ( empty($error) ) {
33. 34.
// verificamos que los datos ingresados corresopndan a un usuario
35.
if ( $arrUsuario = esUsuario($usuario,md5($password),$dbConn) ) {
36. 37.
// definimos las sesiones
38.
$_SESSION['usuario']
= $arrUsuario['usuario'];
39.
$_SESSION['password']
= $arrUsuario['password'];
40. 41.
header('Location: index.php');
42.
die;
43. 44.
} else {
45.
$error['noExiste']
= 'El nombre de usuario o contraseña
no coinciden';
Manual de PHP
66 46.
}
47. 48.
}
49. 50.
}
51. 52.
?>
53.
Inicio de sesión
54.
55.
56.
57.
La parte de html no tiene nada del otro mundo, es igual a la de registro, con las diferencias en el formulario, ahora tenemos menos campos y lo enviamos a ingresar.php, lo que nos importa en esta parte es el script de php más que nada. Vamos a ir explicándolo paso por paso. Como vamos a trabajar con Sesiones de PHP, es fundamental antes que nada, avisarle al proceso que vamos las vamos a utilizar, para ellos vamos a agregar la linea session_start (); Luego de esto, incluimos nuestros archivos necesarios, los mismos que los de la clase pasada más el nuevo que creamos recién para verificar el usuario. Creamos el puntero a la base de datos y mediante un if verificamos que no estén vacíos ni $_SESSION['usuario'] ni $_SESSION['password'], las sesiones estas todavía no las creamos, pero lo haremos en caso de que se envíe correctamente el formulario de ingreso, pero como no queremos que un usuario logueado vuelva a ingresar a este formulario, debido a que ya ha iniciado sesión, lo que hacemos es verificar si no están vacías ambas sesiones, en caso positivo, verificamos mediante
Manual de PHP
67 la utilización de nuestra función esUsuario si pertenece a un usuario registrado, es decir si el usuario y contraseña coinciden. Nuevamente, en caso afirmativo redireccionamos al home de nuestro sitio, ya que no tendría que estar viendo el formulario de ingreso un usuario que ya ha ingresado. Listo, ya superamos la etapa del usuario logueado y no lo estaba, ahora verificamos si se envió el formulario o no (al igual que en el proceso de registro, el formulario de ingreso lo estamos apuntando al mismo archivo ingresar.php, por lo que verificamos si se cargó por primera vez la página o lo hizo el usuario luego de enviar el formulario. En caso de que exista el POST, vamos a definir dos variables con los post del formulario, $usuario y $password, si alguno se encuentra vacio, creamos la variable de $error. Pasada esta verificación, vamos a ver si los datos ingresados en el formulario realmente corresponden con un usuario registrado en nuestro sitio. Para ello, utilizamos nuevamente nuestra funcion esUsuario() pero esta vez la vamos a igualar a una nueva variable $arrUsuario que en caso de que el usuario haya completado los datos bien, contendrá un array con los datos que nos devuelve la funcion esUsuario() de la base de datos, en caso que devuelva un error, $arrUsuario va a ser igual a false y el if donde la incluimos fallará. Fíjense que en el segundo parámetro de la función nuevamente le estoy pasando md5() a $password, en este caso lo estoy haciendo porque en la base de datos ya tenemos la contraseña encriptada, y como en este caso el usuario la escribió directamente en el formulario, la misma no lo está. En el uso anterior de esta función en esta misma página, no fue necesario pasarle md5 ya que la sesión la vamos a guardar encriptada también. Bueno, ya pasó todos los chequeos el envío del formulario, ya verificamos que los datos ingresados por el usuario estén completos, correspondan a un usuario de la base de datos y además coinciden las contraseñas de la db con las del post, es momento de crear las sesiones. Vamos a crear dos sesiones, una sesión que va a contener el nombre de usuario y otra con la contraseña encriptada. Luego de esto, redireccionamos al index.php, ya que un usuario logueado no tendría que por que seguir viendo el formulario de ingreso. Finalmente tenemos nuestra index.php modificada PLAIN TEXT
1. // iniciamos session 2. session_start (); 3. 4. // archivos necesarios 5. require_once 'admin/config.php'; 6. require_once 'admin/conexion.php'; 7. require_once 'admin/esUsuario.php'; 8. 9. // obtengo puntero de conexion con la db 10.
$dbConn = conectar();
11.
Manual de PHP
68 12.
// vemos si el usuario quiere desloguar
13.
if ( !empty($_GET['salir']) ) {
14.
// borramos y destruimos todo tipo de sesion del usuario
15.
session_unset();
16.
session_destroy();
17.
}
18. 19.
// verificamos que no este conectado el usuario
20.
if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) {
21.
$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );
22.
}
23. 24.
?>
25.
Blog Personal
26.
28.
31.
Bienvenido
32.
33.
- Salir
Esta bastante más completa ahora la index de nuestro sitio, veamos el codigo php. Iniciamos sesión, para ver si el usuario esta conectado, agregamos los archivos requeridos y creamos el puntero de conexión. Hasta ahora nada distinto al resto de nuestros scripts. Lo que vamos a agregar ahora es un if que va a verificar si existe una variable del tipo GET que se llame salir, en caso de que exista destruimos y borramos todo tipo de sesión que tenga el usuario, para que lo "desloguee". Luego nos fijamos si tenemos sesiones, en caso de que estén, asignamos a $arrUsuario la función esUsuario(). Y eso es todo nuestro código php. En el html agregamos también un par de if más. El primero es un if verificando si existe el usuario, en caso de que sea un usuario sin iniciar sesión le mostramos el ingresar o registrarse. En caso de que sea un usuario conocido, le damos la bienvenida y la posibilidad de cerrar sesión. El "salir" nuevamente, es un enlace al index con la variable get salir = true.
Manual de PHP
69 En caso de que sea un administrador, le mostramos un enlace al panel de control, mediante otro if que verifique el tipo de usuario del que se trate. Bueno, por ahora eso es todo por hoy, ya la clase que viene vamos a empezar a trabajar en el back-end del sitio. Haz clic aquí para descargar los archivos que utilizamos de ejemplo en la clase de hoy.
Clase 37: Nuestro blog-Sistema de noticias (1)
En la clase de hoy vamos a ver puntualmente un administrador de categorías para nuestro sitio. Vamos a necesitar las mismas para que las diferentes publicaciones de nuestro blog se puedan ubicar en diferentes categorías como pueden ser: editorial, talleres, noticias, etc. Para ello primero vamos a ver como hacer que el administrador del sitio sea únicamente para los usuarios con el tipo "admin" y luego veremos cómo hacer un ABM de categorías, es decir, Altas, Bajas Modificaciones de las mismas.
Panel de admin exclusivo para admines Dentro de la carpeta admin ahora vamos a agregar un archivo "index.php" al que sólo podrán acceder los administradores del sitio, y el cual contendrá el menú para actualizar nuestro sitio. admin/index.php PLAIN TEXT
1. // iniciamos session 2. session_start (); 3. 4. // archivos necesarios 5. require_once 'config.php'; 6. require_once 'conexion.php'; 7. require_once 'esUsuario.php'; 8. 9. // obtengo puntero de conexion con la db 10.
$dbConn = conectar();
11. 12.
// verificamos que no este conectado el usuario
13.
if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) {
14.
$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );
Manual de PHP
70 15.
}
16. 17.
// verificamos que sea un admin
18.
if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' ) {
19.
header( 'Location: ../index.php' );
20.
die;
21.
}
22. 23.
?>
24.
Blog Personal
25.
Bienvenido
26.
27.
- Salir
Al igual que en el index del home de nuestro blog, tenemos el inicio de session, el llamado a los archivos necesarios y el puntero a la conexión de base de datos (última vez que comento esto, ya que va a estar en todos nuestros archivos lo doy por sentado a partir de ahora). Luego si tenemos session completamos un array con los datos del usuario logueado y finalmente abajo preguntamos si el array esta vacío o no es un administrador, en caso de que esta condición se cumpla, quiere decir que, o no estoy logueado o soy un usuario común, por lo que no debería tener acceso a esta sección, entonces en ese caso, redireccionamos al home de nuestro sitio. Eso es todo lo que vamos a tener de php en nuestro index del panel de control, más abajo, en el html tenemos la bienvenida al usuario y el enlace con la opción de salir que apunta directamente al home del blog, que es donde tenemos el condicional que pregunta si tenemos la variable get salir. Siempre debe apuntar a ese archivo. Por ahora como opciones en nuestro menú agregamos el administrador que categorías que es lo que vamos a empezar a ver hoy. Por el momento nuestro archivo de categorías va a tener lo siguiente: admin/categorias.php PLAIN TEXT
1. // iniciamos session 2. session_start (); 3. 4. // archivos necesarios 5. require_once 'config.php'; 6. require_once 'conexion.php'; 7. require_once 'esUsuario.php'; 8.
Manual de PHP
71 9. // obtengo puntero de conexion con la db 10.
$dbConn = conectar();
11. 12.
// verificamos que no este conectado el usuario
13.
if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) {
14.
$arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn );
15.
}
16. 17.
// verificamos que sea un admin
18.
if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' ) {
19.
header( 'Location: ../index.php' );
20.
die;
21.
}
22. 23.
// agregamos una categoria en la db
24.
// si se envio el formulario
25.
if ( !empty($_POST['submit']) ) {
26. 27.
// definimos las variables
28.
if ( !empty($_POST['nombre']) )
$nombre
=
$_POST['nombre']; 29. 30.
// completamos la variable error si es necesario
31.
if ( empty($nombre) )
$error['nombre']
= 'Es
obligatorio completar el nombre de la categoría'; 32. 33.
// si no hay errores registramos al usuario
34.
if ( empty($error) ) {
35. 36.
// inserto los datos de registro en la db
37.
$query
= "INSERT INTO `categorias` (valor) VALUES
('$nombre')"; 38.
$result = mysql_query($query, $dbConn);
39. 40.
header( 'Location: categorias.php?add=true' );
41.
die;
42.
Manual de PHP
72 43.
}
44. 45.
}
46. 47.
// traemos listado de categorias
48.
$arrCategorias = array();
49.
$query = "SELECT idCategoria, valor FROM `categorias` ORDER BY valor ASC";
50.
$resultado = mysql_query ($query, $dbConn);
51.
while ( $row = mysql_fetch_assoc ($resultado)) {
52.
array_push( $arrCategorias,$row );
53.
}
54. 55.
?>
56.
Blog Personal
57.
Bienvenido
- Panel de control - Salir 58.
Categorías
59.
Listado de Categorías
62.
63.
64.
75.
65.
69.
id
66.
categoría
67.
68.
70.
74.
71.
72.
Editar - Borrar
Manual de PHP
73 73.
Agregar nueva categoría
78.
Blog Personal
111.
Categorías
113.
114.
Listado de Categorías
124.
125.
126.
130.
131.
id 127.
categoría 128.
129.
132.
136.
137. 138.
Manual de PHP
78 133.
134.
Editar - Borrar 135.
Agregar nueva
categoría
143.
144.
145.
146.
147.
148.
149.
150.
Editar categoría
166.
167.
168.
169.
170.
171.
172.
173.
183.
Blog Personal
36.
38.
41. 42.
43.
Ahora sí, pego el código de admin/noticias.php y lo paso a explicar PLAIN TEXT
1.
75.
Manual de PHP
85 76.
77.
78.
79.
Blog Personal
85.
Noticias
87.
88.
Listado de Noticias
93.
94.
95.
99.
100.
id
96.
título
97.
98.
101.
105.
106. 107.
102.
103.
Editar - Borrar 104.
Agregar nueva noticia
112.
113.
114.
115.
116.
117.
118.
119.
151. 152.
Blog Personal
47. 48.
49.
54.
57.
Manual de PHP
90 58.
61.
63.
64.
65. 66.
Noticias
67.
68.
72.
73.
74.
Lo más relevante en las modificaciones que le hicimos es en la parte de php la consulta que trae todas las noticias, pero ahora ordenadas por fPubliacion descendente y ademas sólo muestra aquellas que la fecha de publicacion es anterior a "ahora", de esta forma podemos programar noticias para que sean mostradas a todo el mundo cuando se llegue a la fecha y hora deseada. Un último cambio que vamos a destacar, es que en el listado de noticias que estamos mostrando, al titulo le agregué un enlace a una nueva página, la misma va a tener la noticia completa. Bueno, eso es todo por hoy, la semana que viene vamos a ver cómo editar y borrar las noticias y veremos tambien como se ve la noticia completa para los visitantes a nuestro sitio. Aquí les dejo los archivos usados en la clase para que descarguen.
Clase 40: Nuestro blog – Sistema de noticias (4)
Hola, acá estamos de nuevo con el taller de PHP. En el día de hoy vamos a ver cómo editar una noticia y cómo borrarla.
Manual de PHP
91 Si vienen siguiendo el taller más o menos al día verán que no hay grandes diferencias con respecto a las modificaciones y bajas de las categorías. Pero bueno, no nos adelantemos y vamos a lo nuestro. Trabajaremos hoy únicamente sobre el archivo admin/noticias.php. PLAIN TEXT
1.
134.
135.
136.
137.
138. 139.
Blog Personal
144.
Noticias
146.
Manual de PHP
96 147.
Listado de Noticias
156.
157.
158.
162.
163.
id 159.
título 160.
161.
164.
168.
169. 170.
165.
166.
Editar - Borrar 167.
Agregar nueva noticia
175.
176.
177.
178.
179.
180.
181.
182.
Editar noticia
220.
221.
222.
223.
224.
225.
226.
227.
261.
Blog Personal
63. 64.
65.
Manual de PHP
103 66.
69.
70.
73.
75.
76.
77. 78.
79.
Blog Personal
104.
Comentarios sin aprobar
106.
107.
Listado de Comentarios sin aprobar
117.
Editar comentario
261.
262.
263.
264.
265.
266.
267.
268.
278.
Blog Personal
75. 76.
77.
78.
81.
82.
85.
87.
88.
89. 90.
91.
Comentarios
95.
99.
100.