Sie sind auf Seite 1von 128

TALLER DE PHP

Introduccin
Este es el primer artculo editorial del Taller de PHP donde podrs conocer de qu se trata este lenguaje, cmo aplicarlo y algunos tips extra para sacarle el mximo provecho. Para empezar, PHP es un lenguaje de programacin para pginas web que permite generar pginas dinmicas del lado del servidor. Para ser un poco ms preciso, nos referimos por pginas dinmicas a aquellas pginas que van a cambiar su contenido dependiendo de los valores que se le asignen. Y por qu del lado del servidor? Esto significa que el cdigo PHP va a ser interpretado en el servidor. As, lo que el usuario ver en pantalla ser el contenido generado por la interpretacin 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 pginas con informacin almacenada en forma persistente en bases de datos y mostrarla segn la peticin de los usuarios.

Primeros pasos
Dentro de un archivo PHP se puede alternar entre cdigo html y cdigo PHP. Esto nos permite realizar pginas dinmicas de forma fcil: realizando toda la estructura con html y luego agregando el contenido dinmico. Imaginemos una pgina html comn, pero en lugar de ser index.html es index.php. Cuando se quiera agregar cdigo PHP habr que hacerlo dentro de las etiquetas <?php y ?> o <? y ?>, por ejemplo:
<html> <head> <title>hola mundo</title> </head> <body> <h1>incluir cdigo PHP en html</h1> <p><? ac va el cdigo PHP ?></p> </body> </html>

TALLER DE PHP

Variables
Las variables son elementos que creamos para asignarles un valor o dato especfico (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 cdigo anterior definimos la variable hola la cual contiene la informacin hola mundo. Noten que al final agregu un punto y coma (;). En PHP, siempre que se termine una instruccin hay que aclararlo de esta forma.

Tip
Lo ideal a la hora de programar es definir todas las variables y realizar las operaciones antes del cdigo html y en ese cdigo mostrar los resultados de nuestras variables. Por ejemplo, un cdigo completo de hola mundo sera:
<? $hola = "hola mundo"; ?> <html> <head> <title><? echo $hola; ?></title> </head> <body> <h1>incluir cdigo PHP en html</h1> <p><? echo $hola; ?></p> </body> </html>

La funcin echo lo que hace es imprimir una o ms cadenas de texto. En nuestro ejemplo anterior, como la variable contena una cadena de texto (string), lo que el navegador hubiera mostrado es:
<html> <head> <title>hola mundo</title> </head> <body> <h1>incluir cdigo PHP en html</h1> <p>hola mundo</p> </body> </html>

En los prximos artculos de este taller ya profundizaremos en el uso de este potente lenguaje.

TALLER DE PHP

Variables y Constantes
En la clase anterior vimos un ejemplo muy chiquito explicando ms o menos qu era una variable, hoy avanzaremos un poco ms 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 smbolo $, 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 informacin: una cadena de texto (string), nmeros 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 informacin sin ningn problema.
<? $miVariable = una cadena de $miVariable = $miVariable = este, es, $miVariable = ?> hola, esta es texto; 30; array( hola, un, array ); true;

Si escribimos todo eso en nuestro cdigo php, el valor final que va a tener la variable $miVariable va a ser true, todo el resto de la informacin asignada se pierde.

TALLER DE PHP

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 continuacin uso una funcin 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 informacin 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.
<? global $miGlobal = esta es una variable global; ?>

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:
<? define(HOLA, Hola Mundo); ?>

De esa forma hemos definido la constante HOLA (por convencin se utilizan nombres en mayscula para las constantes aunque no es obligatorio). Las constantes son ms 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:
<? define(HOLA, Hola mundo); define(HOLA, Chau mundo); ?>

Nuestro script de php va a interpretar la constante HOLA con la primera informacin definida en ella, es decir Hola mundo y en el reporte de errores del servidor va a agregar el error de que se intent 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 funcin, una clase, etc.
4

TALLER DE PHP

Por ltimo, para usar una constante la usamos directamente por el nombre que definimos en el primer trmino, volviendo al ejemplo de Hola mundo de nuestra primer clase, usando la constante sera de la siguiente forma:
<? define('HOLA', 'Hola mundo'); ?> <html> <head> <title><? echo HOLA; ?></title> </head> <body> <h1>incluir cdigo PHP en html</h1> <p><? echo HOLA; ?></p> </body> </html>

Y en el navegador se ver as:

TALLER DE PHP

Condicionales (Parte I)
A partir de esta clase vamos a empezar a ver con ms profundidad como podemos aprovechar al mximo la programacin. Los condicionales son bsicamente el elemento fundamental a la hora de hacer pginas dinmicas. Con ellos decidimos qu tipo de accin 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 condicin: If, else, elseif y switch

Casos de uso: if, else y elseif


La estructura if se utiliza para ejecutar una accin segn una determinada condicin. Por ejemplo:
<? if ( $fecha == 04.02.2008 ) { echo Hoy es 4 de Febrero de 2008; } ?>

Por otro lado est muy relacionada con el else, que sirve para continuar con el proceso si no se cumple la condicin. Atencin! No es obligatorio que figure.
<? if ( $usuario != false ) { echo "Bienvenido de nuevo $usuario"; } else { echo Hola, si an no estas registrado puedes hacerlo ; } ?>

TALLER DE PHP

Si usamos el else se mostrar o la primer accin o la segunda. Por el contrario, si usamos solo el if, en pantalla se mostrara el bloque de accin 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:
<? if ( $hoy == Lunes ) { echo Hoy es Lunes, tenemos carne para almorzar; } elseif ( $hoy == Martes ) { echo Hoy es Martes, tenemos fideos para almorzar; } elseif ( $hoy == 'Miercoles' ) { echo Hoy es Miercoles, tenemos estofado para almorzar'; } elseif ( $hoy == 'Jueves' ) { echo Hoy es Jueves, tenemos pizza para almorzar'; } elseif ( $hoy == 'Viernes'{ echo Hoy es Viernes, tenemos tarta para almorzar; } elseif ( $hoy == 'Sabado'{ echo Hoy es Sabado, tenemos ravioles para almorzar; } else ( $hoy == 'Domingo'{ echo Hoy es Domingo, no almorzamos :(; } ?>

El script va a correr hasta que se cumpla la condicin 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:
<? switch($hoy) { case Lunes: echo Hoy es Lunes, tenemos carne para almorzar; break; case Martes: echo Hoy es Martes, tenemos fideos para almorzar'; break; case Miercoles: echo Hoy es Miercoles, tenemos estofado para almorzar'; break; case Jueves: echo Hoy es Jueves, tenemos pizza para almorzar'; break; case Viernes: echo Hoy es Viernes, tenemos tarta para almorzar'; break; case Sabado: echo Hoy es Sabado, tenemos ravioles para almorzar'; break; case default: echo Hoy es Domingo, no almorzamos'; break; }?>

TALLER DE PHP

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 cmo 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 continuacin, vers cmo queda el formulario en ambos casos:


Sesin iniciada como usuario registrado.

Usuario invitado. Sesin no iniciada.

TALLER DE PHP

Condicionales (Parte II)


Bienvenidos a la cuarta clase del Taller de PHP. Esta clase en realidad contina 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. Adems aprenderemos sobre operadores aritmticos, de asignacin, de comparacin y operadores lgicos, descubriendo cmo 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: aritmticos, asignacin, lgicos y comparacin. Operadores aritmticos
+ * / % ++ -Adicin de valores. Resta de valores. Multiplicacin de valores. Divisin de valores. Resto de una divisin. Incrementa en una unidad. Resta en una unidad.

Operadores de asignacin
= += -= *= /= %= .= 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 multiplicacin del primer miembro con el segundo. Asigna al primer miembro la divisin del primer miembro con el segundo. Asigna al primer miembro el resto de la divisin 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;

TALLER DE PHP

Operadores de comparacin Este tipo de operadores se van a utilizar mucho en los condicionales, junto con los operadores lgicos 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 lgicos
! Operacin de negativa, por ejemplo dentro de un condicional se puede realizar todo tipo de operaciones y funciones, una que veremos ms adelante es una funcin propia de php que devuelve TRUE o FALSE dependiendo si la variable esta vaca, entonces si nosotros preguntamos if (!empty($a)) va a devolver si $a = 5, TRUE, ya que empty($a) devuelve FALSE, pero !empty($a) sera como preguntar Si $a NO esta vaca. Comparador Y. Dentro de un condicional es necesario que ambas condiciones se cumplan es 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 condicione, es decir if ( $a == 4 OR $b == 5 ) con que $a = 4 o $b = 5 el script va a continuar su ejecucin. 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

and or xor && ||

10

TALLER DE PHP

Bucles (Parte I)
Casi siempre nuestros script van a realizar tareas repetitivas, por ejemplo, una funcin que muestra un listado de noticias, repite siempre la misma estructura, es decir, mostrar un ttulo, mostrar una imagen, mostrar el autor, lo nico que cambia es el contenido, pero la tarea que realiza es siempre la misma. Una forma fcil de realizar una secuencia de instrucciones en forma repetitiva es utilizando los BUCLES.

En PHP existen cuatro tipos de bucles: while, do while, for y foreach. while
El while es un bucle que va a realizar una instruccin o conjunto de instrucciones siempre y cuando la condicin ( lo vimos en la Clase 4 - Condicionales - ParteII ) se cumpla, es decir sea verdadera. La comprobacin de la condicin la hace siempre al principio. La estructura es la siguiente:
<code> <? while ( condicion ) { instrucciones } ?> </code>

Explicando un poco la sintaxis del while, lo que va entre ( ) es la condicin, 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 instruccin o instrucciones. Un ejemplo sencillo de este bucle puede ser mostrar una cuenta de 1 hasta 10.
<code> <? $c = 1; while ( $c < 11) { echo $c <br>; $c++; } ?> </code>

En la primer lnea definimos la variable $c con el valor 1, luego evaluamos la condicin si $c es menor a 11, como es 1, se ejecutan las instrucciones. En la primer lnea de la instruccin mostramos en pantalla el valor de $c, en este caso 1, y luego en la segunda lnea 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;),

11

TALLER DE PHP

Al final de las instrucciones, el bucle vuelve a analizar la condicin, en este caso $c es igual a 2, (recordar que le acabamos de sumar 1), sigue siendo verdadera la condicin 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:
<code> <? do { intrucciones } while ( condicion) ?> </code>

La nica diferencia salvando la sintaxis es que primero ejecuta la instruccin y luego se fija si cumple la condicin, en caso de ser verdadera la condicin, vuelve a ejecutar una vez ms y as. La clase que viene vamos a ver los dos bucles que nos estn restando for y foreach

12

TALLER DE PHP

Bucles (Parte II)


Continuando con la clase de bucles, vamos a ver los dos restantes: for y foreach. Estos son un poco ms complejos, por lo que debemos prestar mucha atencin para no cometer errores. Vamos a ver que las expresiones tienen un encadenamiento determinado y deben cumplir con ciertos parmetros. Esto es fundamental para que todo funcione de manera correcta. Pero veamos esto en detalle, sin perder ms tiempo.

for
El bucle for tiene la siguiente sintaxis:
<? for( expresion 1; expresion 2; expresion 3 ) { instrucciones } ?>

La expresin 1 se ejecuta una vez al comienzo del bucle, la expresin 2 es la condicin que se debe cumplir y la expresin 3 se ejecuta al final de ejecutar las instrucciones en cada iteracin. 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 nmeros del 1 al 10 pero con un for.
<? for ($c = 1; $c < 11; $c++) { echo $c <br />; } ?>

Al igual que como hicimos en el ejemplo del while, aqu seteamos $c = 1 (expresin 1 que se ejecuta por nica vez antes de comenzar el bucle), $c < 11 es la expresin 2, o sea la condicin que queremos que se cumpla, y $c++ es la accin que se va a realizar al finalizar la iteracin, igual que el while donde le ponamos el $c++ dentro de las instrucciones. Para bucles for se puede utilizar tambin una sintaxis alternativa.
<? for ( expresion 1; expresion 2; expresion 3 ): instrucciones endfor; ?>

13

TALLER DE PHP

foreach
Este bucle es una forma rpida y sencilla de recorrer un arreglo o una matriz. En la clase 2 vimos que una variable poda contener un arreglo (array). Qu quiere decir esto? que a una variable se le puede asignar un conjunto de elementos, por ejemplo la variable $semana puede contener un arreglo con los das de la semana, para esto la definimos as:
<? $semana = array( lunes,'martes,'mircoles,jueves,'viernes,sbado,'domingo ); ?>

La sintaxis del foreach que nos va a permitir recorrer los array es la siguiente:
<? foreach ( expresion1 as expresion2 ) { instruccion } ?>

En expresion1 ponemos nuestro array y en expresion2 definimos cmo queremos que se llame el valor de cada elemento de nuestro array, en instrucciones lo que queremos hacer cada iteracin. Siguiendo nuestro ejemplo de la semana, el bucle va a recorrerse 7 veces, ya que tenemos 7 das, si lo que queremos es mostrar un listado de los das que tenemos en nuestro array debemos hacer lo siguiente:
<? // definimos el arreglo con los das de la semana $semana = array( lunes,'martes,'mircoles,jueves,'viernes,sbado,'doming o ); // mostrarnos el mensaje inicial echo Los das de la semana son:<br />;

// comienza el bucle
foreach ( $semana as $dia ) { echo $dia <br />; } ?>

De esta forma la variable $dia se va reemplazando con el siguiente valor que le corresponde en el array por cada iteracin que realiza el foreach. Si todava 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 tena definido ningn ndice, ahora vamos a ver un array un poco ms complejo:
14

TALLER DE PHP

<? $noticia = array( titulo => 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 ms complejo, vamos a ver el foreach sin mostrar ndices y mostrndolos
<? foreach ( $noticia as $valor ) { echo $valor<br />; } ?>

En este ejemplo vamos a imprimir en pantalla lo siguiente:


Php Clase 5 - Bucles Ac va el contenido de la clase 5 de php, mucho texto, mucho mucho Justi

Y usando la expresin ms compleja:


<? foreach ( $noticia as $indice => $valor ) { echo $indice: $valor<br />; } ?>

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

15

TALLER DE PHP

Tip
Lo bueno de usar esta ltima expresin es que se puede manipular que mostrar en pantalla dependiendo del ndice, supongamos que queremos imprimir nuestra noticia pero queremos que los ttulos tengan un <h1> el cuerpo aparezca en un <p> y el autor en un <span> usando los condicionales hacemos lo siguiente:
<? foreach ( $noticia as $indice => $valor ) { if ( $indice == titulo ) { echo <h1>$valor</h1>; } if ( $indice == cuerpo ) {echo <p>$valor</p>; } if ( $indice == autor ) {echo <span>$valor</span>; } } ?>

Y qu tal? Ya va tomando un poco ms de sentido todo lo que venimos leyendo, no?

16

TALLER DE PHP

Envo de datos de un formulario


Hola, bienvenidos a la sptima clase del Taller de PHP! Espero que hayan estado practicando. Muy bien, con lo aprendido en clases anteriores ya sabemos cmo hacer un if y ya sabemos cmo recorrer un bucle, pero ahora nos falta una parte importante que es cmo trabajar con formularios que nos envan los usuarios. Empecemos ya!

Cmo armar un formulario para que sea procesado por Php?


En realidad no hay que hacer nada nuevo, simplemente armar el formulario en HTML, pero como hay muchos diseadores que no saben cules son los campos que s o s hay que tener, vamos a armar uno de cero y para que sea un poquito ms til, vamos a armar un formulario de contacto. Primero y principal hay que crear las etiquetas <form> con sus respectivos atributos.
<form action=contacto_script.php method=post id=contacto></form>

Vamos a explicar un poquito que es cada atributo y para qu sirve: action: aqu es donde vamos a hacer que se enven todos los datos, el archivo contacto_script.php va a procesar toda la informacin enviada y decidir cmo continuar, si hubo un error, si fue correcto, etc. method: le especificamos cmo queremos que se enve la informacin, a travs del mtodo POST o del mtodo GET. Yo s lo que te ests preguntando ahora, qu diferencia hay entre cada mtodo No? El temita es el siguiente, no tiene sentido que yo te escriba un prrafo de 1000 palabras con las diferencias tcnicas que existen entre un mtodo y el otro para el protocolo HTTP por lo que te lo voy a explicar crudamente para que sepas cundo emplear cada mtodo: Bsicamente se enva informacin a travs del mtodo POST cuando se desea que ese envo de informacin sea oculto, o si se est enviando mucha informacin. Por lo general la pgina que recibe esa informacin no va a ser re-cargada, ya que si hacemos refresh en una pgina que acaba de recibir informacin va POST el navegador nos avisar con un cartelito que estamos intentando recargar una pgina y que se va a enviar toda la informacin de nuevo, por un lado es molesto y por otro puede que el navegador no haya guardado correctamente toda la informacin enviada originalmente y falle. El mtodo GET, por el contrario, cuando completamos un formulario que enva los datos a travs de GET, esta informacin nos va a aparecer en la URL del sitio, si se fijan, cuando realizan una bsqueda en Google, esta se hace a travs de un formulario con mtodo GET, ya que en la URL nos aparece toda la informacin que nosotros buscamos ms otras variables.
17

TALLER DE PHP

Ahora bien Cundo es aconsejable usar uno u otro mtodo? Pues como dije justo en el prrafo anterior, cuando se realiza un formulario de bsqueda, o un formulario para filtrar la informacin mostrada o cambiar el orden de la informacin mostrada (En un listado de departamentos en alquiler, cambiar el orden por mejor precio, por nmero de ambientes, etc.) es aconsejable usar el mtodo GET, ya que el usuario es muy probable que entre en una pgina y luego vuelva para atrs, en esta vuelta para atrs, est haciendo refresh de la pgina con los resultados de bsqueda, si hubiese sido por POST, el navegador hubiese mandado la alerta de que se est intentando entrar en una pgina que recibi informacin va POST y podra no mostrar la informacin correctamente. Por el contrario, es aconsejable utilizar el mtodo POST cuando se desea enviar mucha informacin, o es informacin que no va a cambiar por decisin del usuario, es decir, no es un filtro, sino un formulario de contacto, para escribir una nueva entrada en nuestro blog, crear un tema en un foro, etc. id: lo usamos para identificar el formulario, ya que podemos llegar a tener muchos formularios en una misma pgina y queremos que se identifique bien cada formulario. Aqu elegimos el nombre que queremos. Listo, ya sabemos cmo configurar nuestro formulario, la clase que viene vamos a ver que diferentes tipos de campos existen y como vamos a procesar esta informacin con PHP.

18

TALLER DE PHP

Procesar un formulario (Parte I)


Hola, bienvenidos a la octava clase del Taller de PHP! Esta clase estar dividida en dos partes, por una cuestin de prolijidad. En esta primera parte vamos a ver algunos tipos de campos que podemos tener en el formulario. Los diferentes campos que podemos tener en un formulario son inputs, selectbox y textarea. A su vez los inputs se dividen en de tipo texto, radio, checkbox, password, hidden, button, submit, reset. Son un montn, as que veamos uno por uno.

Inputs
El ms comn de todos es el de tipo text. Este sirve para completar una sola lnea de texto y tiene que tener las siguientes propiedades.
<label for=input_campo>Nombre Campo</label> <input id=input_campo type=text name=nombreCampo value=" />

Bueno, ustedes seguramente ven lo de arriba y se estarn diciendo: Un momento, cerebrito! Por lo que intentare explicar qu es cada cosa. Primero van a ver una etiqueta label que no la nombr antes. Esta etiqueta no es obligatoria incluirla, pero es lo correcto, con la misma le van a poder indicar un nombre al campo para que todo el mundo sepa lo que est completando. En el for tienen que incluir la id del campo y esto me da pie para explicar esta ltima. La id del input es un identificador nico, no puede haber ningn otro elemento con este nombre en toda la pgina. El nombre es a gusto de ustedes, pero por convencin se utilizan nombres relacionados con el elemento que estn identificando. Consejo: a la hora de crear una id es muy til, por experiencia propia, ponerle primero el tipo de elemento html que es y luego que representa, si se fijan yo eleg input_campo, ya que es un input y como us un nombre genrico le puse campo, pero ah podra ser input_direccion, input_telefono, input_email. Esto les va a resultar til a la hora de armar un CSS o realizar acciones con JavaScript. Van a poder identificar el elemento muy fcilmente. Con type le indicamos el tipo de input que es, en este caso es un texto, name es obligatorio y lo utilizaremos para levantar la variable POST y value es el contenido del campo, si lo dejamos con las dos comillas y sin contenido por defecto no nos va a aparecer nada en el campo, sino podemos completarlo con alguna frase del estilo para que nos aparezca adentro del campo.

19

TALLER DE PHP
<label for=input_contacto>Nombre Campo</label> <input id=input_contacto type=text name=nombreContacto value=Complete con sus nombres y apellidos />

Estos dos campos se ven de la siguiente manera:

Bueno, los inputs de tipo text los utilizamos para casos en que el usuario debe completar un solo regln. Como completar con sus nombres y apellidos, direccin, telfono, email, etc. Tambin tenemos los inputs de tipo Radio, cuya sintaxis es la siguiente:
<label for=input_si>Si</label><input id=input_si type=radio name=suscribirse value=si /> <label for=input_no>No</label><input id=input_no type=radio name=suscribirse value=no />

Qu tenemos ac? Fjense que name es el mismo para ambos inputs, lo que cambia es el value (y la id obvio, no se puede repetir id en toda la pagina). Este tipo de campos es autoexcluyente, slo se puede marcar una opcin, y por php se recibir nicamente el valor que fue marcado. El mismo se ve de la siguiente manera:

Otro caso similar es el tipo Checkbox, los clsicos cuadraditos que se utilizan para tildar y destildar, es muy comn ver este tipo de inputs antes de registrarnos en algn lugar y que nos pregunten si estamos de acuerdo con los trminos y condiciones. La sintaxis es la siguiente:
<input id=input_acuerdo type=checkbox name=acuerdoLegal value=1 />

En caso de que NO este marcado por el usuario al momento de hacer un submit del formulario, este campo no se enva y al procesarlo por Php, veremos que no existe la variable POST correspondiente a este campo.

20

TALLER DE PHP

Otro tipo de input es Password, esta propiedad hace que el campo en lugar de ver el texto que se escribe en l, aparezcan los clsicos redondelitos negros ocultando la informacin.
<input id=input_password type=password name=password value=" />

Luego tenemos el tipo Hidden, que es un campo oculto, en el podemos poner informacin pre-definida que el usuario no tiene que completar, entonces no se muestra pero si se enva.
<input type=hidden name=idUsuario value=25

Por ltimo vamos a ver el tipo Submit que es el campo que va a enviar nuestro formulario
<input type=submit name=submit value=Enviar consulta />

Que se va a ver de la siguiente forma

Bueno, eso es todo por esta clase, la que viene seguimos con el resto de los campos del formulario que nos faltan.

21

TALLER DE PHP

Procesar un formulario (campo Textarea)


Hola, bienvenidos a la novena clase del Taller de PHP! Hasta ahora hemos aprendido mucho, hemos visto las variables, las constantes, los condicionales, los bucles y, las ltimas clases, el envo de datos de un formulario. De esta manera vimos casi todos los campos de tipo input, que ya sabemos que sirven para que el usuario ingrese una lnea de texto que ser procesada luego. En la clase de hoy vamos a ver los textarea, es decir, donde se deja el cuerpo del mensaje.

Textarea
Los Textarea funcionan muy similar a un campo input de tipo text con la particularidad de que se pueden agregar saltos de lnea, es decir escribir bloque de textos completos con diferentes prrafos. La sintaxis es la siguiente:
<textarea id="textarea_comunicacion" name="comunicacion" rows="10" cols="50"></textarea>

La id es exactamente igual que en los casos anteriores, con name vamos a definir el nombre de la variable que vamos a levantar con PHP va POST, rows es el nmero de filas que queremos que tenga nuestro campo y cols es el ancho. Entre los tags <textarea> y </textarea> se puede incluir un texto para que aparezca por defecto, por ejemplo:
<textarea id="textarea_comunicacion" name="comunicacion" rows="5" cols="50">Escribe aqu lo que quieras</textarea>

Esta imagen es un ejemplo:

La clase que viene aprenderemos sobre SelecBox, con lo cual terminaremos de ver el formulario del lado del front end.
22

TALLER DE PHP

Procesar un formulario (campo SelectBox)


Ya estamos en la dcima clase del Taller de PHP! Estuvieron practicando? Espero que s, jejeje! Como ya saben, estuvimos viendo los campos input de un formulario. Hoy terminaremos con este tema, viendo el campo SelectBox. Los selectbox sirven para presentarle al usuario un listado de opciones pre-fijadas y que no puedan ser modificadas. Existen dos tipos de selectbox, aquellos donde el usuario solo puede seleccionar una opcin, u otros donde se le permite seleccionar ms de una.

SelectBox
La sintaxis del que permite seleccionar slo uno es la siguiente:
<select id="select_sexo" name="sexo"> <option value=M>Masculino</option> <option value=F>Femenino</option> </select>

Nuevamente, el id y el name es lo mismo que los casos anteriores y ac se agrega una nueva etiqueta option que es cada opcin que queremos que aparezca en el formulario. Lo que est entre las etiquetas <option> y </option> es lo que va a ver el usuario, pero PHP va a obtener la informacin que figura en el atributo value. Y nicamente de la opcin seleccionada. Para hacerlo mltiple, hay que agregarle una propiedad extra a la etiqueta select.
<select id="select_gustos" <option value=1>Me gusta <option value=2>Me gusta <option value="3">Me gusta </select> name="gustos" multiple="multiple"> jugar al Tennis</option> jugar al Futbol</option> jugar al Correr</option>

Para poder seleccionar mltiples opciones hay que dejar apretada la tecla Ctrl. Ya terminamos con todo lo que tiene que ver con el formulario del lado del front end, ahora slo nos resta ver el back end que es donde acta todo el proceso de PHP.

23

TALLER DE PHP

Procesar un formulario (Recibiendo los datos)


Hola, bienvenidos a la clase nmero once del Taller de PHP! Ya vimos todo el frontend del formulario, ahora nos resta ver como levantamos las variables enviadas a travs del mismo con PHP. Hay que tener mucho cuidado en esta parte, como en general, dado que un pequeo descuido al tipear el cdigo puede provocar un error al intentar enviar los datos a travs del formulario. Sigue atentamente las indicaciones y no tendrs problemas!

Recibiendo los datos


Antes de ver como recibimos los datos, veamos cmo nos qued el formulario de contacto completo. Supongamos que lo tenemos en el archivo contacto.php
<form action="contacto_script.php" method="post" id="contacto"> <label for=input_nombres>Nombre y Apellido</label><br /> <input id=input_nombres type=text name=nombres value=" /><br /><br /> <label for=input_email>Email</label><br /> <input id=input_email type=text name=email value=" /><br /><br /> <label for=input_sexo>Sexo</label><br /> <select id=select_sexo name=sexo> <option value=M>Masculino</option> <option value=F>Femenino</option> </select><br /><br /> <label for=textarea_mensaje>Mensaje</label><br /> <textarea id=textarea_mensaje name=mensaje rows=5 cols=50></textarea><br /><br /> <input type=submit name=submit value=Enviar consulta /> </form>

Este formulario ser enviado al archivo contacto_script.php por el mtodo post. Ahora la pregunta del milln es qu contiene el archivo contacto_script.php.

contacto_script.php
Este archivo va a interpretar los datos enviados a travs del formulario. Para ello lo que vamos a hacer es primero ver si llegaron todos los parmetros y agregarlos cada uno a una variable.

24

TALLER DE PHP
<? // definimos las variables o marcamos el error if ( !empty($_POST['nombres']) ) $nombres = $_POST['nombres']; else $error = true; if ( !empty($_POST['email']) ) $email = $_POST['email']; else $error = true; if ( !empty($_POST['sexo']) ) $sexo = $_POST['sexo']; else $error = true; if ( !empty($_POST['mensaje']) ) $mensaje = $_POST['mensaje']; else $error = true; ?>

Expliquemos paso por paso.


Lo primero que hacemos es preguntar si NO est vaco el parmetro enviado por post, ya que la funcin empty pregunta si est vaco (va a responder si el contenido es un string vacio, un cero o un false) pero como le anteponemos el ! estamos preguntando por lo contrario. En caso de que nuestra condicin se cumpla, asignamos a una variable el parmetro recibido, caso contrario definimos una variable llamada error con contenido TRUE. Esta ltima nos va a servir para hacer que todos los campos del formulario sean obligatorios a la hora de enviarse. Perfecto, ya tenemos definidas nuestras variables ahora vamos a verificar que no exista la variable error, y si existe redireccionamos a una pgina con el mensaje de error.
// verificamos que no exista un error if ( !empty($error) ) { header( Location: contacto_error.php ); die; }

Qu est pasando ac?


Lo mismo que antes, preguntamos si no est vaco error, si la respuesta a esta pregunta es verdadera, tenemos un problema, uno de los campos del formulario no fue completado, por lo que el script de php lo vamos a frenar y vamos a redireccionar al usuario a una pgina que contenga el mensaje de error, esta pgina va a ser en este caso contacto_error.php. La redireccin la hacemos por medio de la funcin header( Location: ) que va a hacer que recargue la nueva pgina que le estamos pasando, y tenemos que poner la lnea siguiente con el die para que se frene el script en ese momento y pueda ejecutarse la funcin header, ya que si no frenamos el script, primero va a leer y ejecutar todo y despus va a tener accin el header( Location: ).

25

TALLER DE PHP

La pgina contacto_error.php puede contener simplemente un mensaje que diga El formulario de contacto no ha podido ser enviado, por favor asegrese de que haya completado todos los campos correctamente. y un link a la pgina del formulario de contacto para que vuelva a enviarlo.

Cuerpo del Mensaje


Nos resta por definir el cuerpo del mensaje que queremos recibir a travs del formulario de contacto, el mismo puede ser algo as:
// definimos el cuerpo del email $cuerpo = De: $nombres \n\r Email: $email \n\r Sexo: $sexo \n\r Mensaje: \n\r $mensaje ;

Como el e-mail llega como texto plano, debemos definirle los saltos de lnea con \n\r. Perfecto, ya definimos las variables, ya nos aseguramos que no tengo ningn error, creamos el cuerpo del email, ahora lo que vamos a hacer es enviar el mensaje que recibimos a travs del formulario a nuestra casilla de email. Para ello vamos a utilizar una funcin de php que se llama mail()

Funcin mail
mail ( string $para , string $asunto , string $mensaje );

Esta funcin va a responder true o false, dependiendo si se pudo ejecutar correctamente, en nuestro script quedara algo as:
// enviamos el email if ( mail( direccion.del.destinatario@email.com,'Recibiste un mensaje a travs del formulario de contacto de tu sitio,$cuerpo ) ) { header( Location: contacto_exitoso.php ); die; } else { header( Location: contacto_error.php ); die; }

Fjense que en el primer parmetro de la funcin mail agregamos a dnde queremos que se enve el mensaje, en el segundo parmetro ponemos el asunto y en el tercero el cuerpo que definimos anteriormente. Si la condicin es verdadera, es decir, el e-mail se envi correctamente redireccionamos a una nueva pgina llamada contacto_exitoso.php, la cual contendr un mensaje del estilo: El e-mail ha sido enviado correctamente, a la brevedad nos pondremos en contacto con usted. Y en caso de que no se cumpla redireccionamos a la pgina de error.
26

TALLER DE PHP

Script Completo
El script completo quedara algo as:
<? // if if if if definimos las variables o marcamos el error ( !empty($_POST['nombres']) ) $nombres = $_POST['nombres']; else $error = true; ( !empty($_POST['email']) ) $email = $_POST['email']; else $error = true; ( !empty($_POST['sexo']) ) $sexo = $_POST['sexo']; else $error = true; ( !empty($_POST['mensaje']) ) $mensaje = $_POST['mensaje']; else $error = true;

// verificamos que no exista un error if ( !empty($error) ) { header( Location: contacto_error.php ); die; } // definimos el cuerpo del email $cuerpo = De: $nombres \n\r Email: $email \n\r Sexo: $sexo \n\r Mensaje: \n\r $mensaje "; // enviamos el email if ( mail( direccion.del.destinatario@email.com,'Recibiste un mensaje a travs del formulario de contacto de tu sitio,$cuerpo ) ) { header( Location: contacto_exitoso.php ); die; } else { header( Location: contacto_error.php ); die; } ?>

27

TALLER DE PHP

Funciones
Hola! Bienvenidos a otra clase del Taller de PHP. La clase pasada terminamos de ver el tema de los formularios, as que hoy cambiaremos de tema. Aprenderemos el uso de funciones, una de las mejores herramientas a la hora de reutilizar cdigo. Con php podemos armar una funcin que ejecute un conjunto de instrucciones. No perdamos ms tiempo! Comencemos.

Sintaxis
Las funciones se pueden definir con la siguiente sintaxis:
<?php function nomber($argumento1, $argumento2, , $argumento_n) { echo Funcin de ejemplo.; return $resultado; } ?>

Vamos a explicar un poco, en el cuerpo de la funcin puede aparecer cualquier instruccin, incluso otra funcin. Lo que s, recuerden que si definimos una variable por fuera de la misma, nicamente se va a poder acceder a ella dentro de la funcin si es una variable global (lo vimos en la clase 2). Dentro de la funcin se pueden pasar tantos argumentos como se deseen. Los mismos pueden ser una variable, un string, un objeto, etc. En return lo que hacemos es decirle que queremos que nos devuelva la funcin. Veamos un ejemplo ms til:

Calcular la edad de una persona


Por ejemplo una funcin que te dice la edad de una persona pasndole la fecha en formato aaaa-mm-dd (ao-mes-da) puede ser como sigue:
<? public function edad($nacimiento){ //restamos los aos (ao actual - ao cumpleaos) $edad = date(Y) - ereg_replace(^(.{4}).*,\\1,$nacimiento); //si pasamos de ao, pero an no cumplimos aos, resta 1 if( date(m-d) < ereg_replace(.*(.{5})$,\\1,$nacimiento) ) $edad; return $edad; } ?>

28

TALLER DE PHP

No voy a explicar lo que hace adentro de la funcin porque ya lo veremos ms adelante pero s bsicamente cmo se utiliza esta funcin. Por ejemplo nuestro archivo perfil puede contener lo siguiente
Mi nombre es Hernn y tengo <? echo edad(1977-07-06); ?> aos de edad.

Y en pantalla esto se vera as:

Mi nombre es Hernn y tengo 30 aos de edad.

Por ahora seguro que este ejemplo no lo ven muy til, pero ya van a ver que en muchos sitios que hagan con php los usuarios al momento de registrarse ponen su fecha de nacimiento, y no es necesario pedirles su edad, ya que se calcula automticamente cada vez que necesiten mostrarla con esta funcioncita. Consejo: conviene tener un archivo funciones.php con todas las funciones de este tipo que utilizan en el sitio, y lo incluyen en todas las pginas, ya van a ver que a la hora de programar utilizan muchos procesos similares, si estos se incluyen en funciones, los pueden llamar a todo momento y as ahorrar muchas lneas de cdigo y de tiempo. A medida que avanzamos con el curso vamos a ir entendiendo igual la fuerza de tener funciones.

29

TALLER DE PHP

Sesiones y cookies
Hola, bienvenidos nuevamente. En la clase de hoy vamos a ver que son las cookies y las sesiones. Estos conceptos son clave para que los usuarios no pierdan informacin al cambiar de pgina o seccin en un sitio. Seguro tendrs muchas dudas, as que empecemos la clase.

Qu son las cookies?


Bsicamente la definicin dice: Las Cookies son un mecanismo que sirve para almacenar datos en el navegador del usuario remoto, para as poder identificar al usuario cuando vuelva. La definicin anterior seguro que les gener ms dudas que lo que les ayud, es por eso que se los voy a explicar con un ejemplo. Vieron, cuando ingresan a su email en Hotmail o Yahoo!, que se les pregunta si desean recordar su contrasea? Bueno, eso lo que hace es generar una cookie que contenga su email y su contrasea en su propio navegador (se guarda en la computadora de ustedes). De esta forma, cuando ustedes vuelven a abrir la pgina de Hotmail, el sitio busca si tienen almacenada alguna cookie identificada por este sitio y, si la encuentra y el email y la contrasea coinciden con la informacin que Hotmail almacena en la base de datos, los redirecciona directamente a su bandeja de entrada. Cualquier cookie enviada desde un navegador al sitio que estamos realizando, php la va a convertir en una variable, de la misma forma que ocurra con los mtodos $_GET y $_POST.

Qu son las Sesiones?


Las sesiones por otro lado consisten en mecanismos para preservar ciertos datos a lo largo de un sitio, se puede guardar informacin y cambiar de pgina en pgina sin perder esa informacin (y sin necesidad de enviarla a travs de ningn formulario, ni va get, ni va post), ya que la misma es guardada en el servidor con un identificador nico de sesin (es nico por cliente) y en el navegador del usuario (cliente) se guarda una cookie con la informacin de acceso a la sesin (el nmero de identificacin de sesin). De esta forma logramos mantener la informacin del usuario ms segura ya que la misma se guarda en el servidor y no en la PC del usuario, y de esta forma evitamos que solo se pueda acceder a esa informacin desde nuestra aplicacin.

30

TALLER DE PHP

Un caso muy comn en el uso de sesiones es para un carrito de compras, ustedes en este tipo de sitios van eligiendo productos, y se van almacenando en una sesin, de esta forma pueden cambiar de seccin en el sitio sin perder la informacin. Por ejemplo en un supermercado online pueden cambiar de la seccion almacn a productos congelados y su carrito de compras apesar de recargar una nueva pgina contina con los productos seleccionados. Las sesiones por lo general se acceden ms rpido que las cookies, ya que toda la informacin al ser almacenada en el servidor, no hay que estar envindola del cliente al servidor en forma constante. Ya me imagino la siguiente pregunta:

Para qu usar Cookies si con las Sesiones se logra prcticamente lo mismo de forma ms rpida y ms segura?
El problema que tienen las sesiones es que tienen un tiempo de expiracin que no puede ser modificado desde la creacin de la misma, hay que modificarlo desde la configuracin de php. Lo malo de esto es que todas las sesiones duraran el mismo tiempo, a diferencia de las cookies que el tiempo de vida de la misma se configura al momento de crearla. Por otro lado, si se desea usar sesiones hay que inicializarlas antes de empezar a realizar cualquier otra cosa en php y si a una pgina no se le avis que empiece a hacer uso de sesiones, las mismas no van a correr, por lo que la aplicacin web no va a poder acceder a la informacin de la misma, a diferencia de las cookies, donde no hay que avisar nada, si existe la cookie, se lee y santo remedio. Por el momento no voy a profundizar ms en el uso de sesiones y cookies, ya que veremos cmo utilizarlas cuando comencemos con la creacin de nuestro blog, por ahora es informacin suficiente como para que tengan nociones de qu son y en qu casos se utilizan.

31

TALLER DE PHP

Base de datos
Hola! Bienvenidos nuevamente al taller de PHP. La clase de hoy va a ser bastante terica, pero es fundamental para entender la potencia de PHP cuando se relaciona con una base de datos. De esta forma aprenderemos cuestiones bsicas sobre pginas dinmicas, interaccin y SQL. Pero primero lo primero.

Qu es una Base de Datos?


Las bases de datos son un conjunto de datos almacenados sistemticamente para su uso posterior. Gracias al avance de la informtica, la mayora de las bases de datos se encuentran en formato digital, por lo que una de las formas para acceder a la informacin guardada en ellas es a travs de una computadora.

Importancia de las Bases de Datos


Php ofrece interfaces para el acceso a la mayora de las bases de datos, entonces de esta forma podremos almacenar y acceder a estos datos (se dice que los datos guardados de esta forma son datos persistentes) a travs de una pgina web realizada en PHP. Por ejemplo, un sitio como este, almacena todos los talleres en una base de datos, de modo que, cuando ustedes acceden a la clase 10, el archivo encargado de mostrar todas las clases, busca en la base de datos la clase 10 y muestra todo el contenido guardado. Es siempre el mismo archivo el encargado de interactuar con la base de datos y es por eso que se llaman pginas dinamicas, ya que es siempre la misma y slo cambia el contenido que se muestra en ella. La base de datos ms comn para utlizar con PHP es MySql, debido a que es muy potente, gratuito y se encuentra en la mayora de los servicios de hosting de pginas webs. Otras bases utilizadas son PostgreSQL, ODBC, Oracle, IBM DB2, etc.

Interaccin
La interaccin entre php y las base de datos se realiza a travs de herramientas propias del lenguaje Php, por un lado, y escribiendo los pedidos a la base de datos en un idioma universal, SQL (Structured Query Language) por otro, que podremos encontrar en todas las bases de datos. De todas formas no se asustn, SQL es muy sencillo (pero muy potente) y facil de aprender.

32

TALLER DE PHP

MySQL
MySQL es un sistema de base de datos open source (gratuito y modificable), y es gracias a ello que se convirti en la base ms popular del mundo. Incluso su continuo desarrollo y su impresionante popularidad estn haciendo que MySQL sea un competidor directo de las grandes empresas como Oracle o IBM. Este sistema de base de datos muy utilizado sobre todo con PHP es relacional, ya que utiliza mltiples tablas para almacenar y organizar la informacin. Tambin es multihilo porque se pueden realizar varias tareas concurrentemente. Y como ltima caracterstica es multiusuario, pudiendo conectarse varios usuarios simultneamente.

Ventajas de MySQL
Es una base de datos muy rpida en la lectura en aplicaciones web, convirtindola en la herramienta ideal para este tipo de aplicaciones. Por otro lado est disponible en gran cantidad de plataformas y sistemas, brindando a su vez, una conectividad muy segura. Nos da tambin una potencia sin igual, ya que utiliza SQL como lenguaje para consultar la base de datos (usar ese motor nos ahorrar una gran cantidad de trabajo). Tambin es muy portable por la misma caracterstica anterior, SQL es fcilmente portable a otras plataformas y nos brinda una gran escalabilidad, pudiendo manipular base de datos enormes con ms de 50 millones de registros.

Conectarse con PHP a MySQL


PHP nos brinda muchsimas herramientas a la hora de conectarnos con MySQL, pudiendo realizar conexiones simultneas y todo tipo de consultas para obtener informacin (a medida que avance este curso, vamos ir viendo todas estas posibilidades). Bsicamente es necesario tener la IP del servidor de base de datos (por lo general se encuentra en el mismo lugar fsico que el servidor apache con PHP, utilizando como IP para conexin la palabra localhost). El nombre de usuario y contrasea de conexin y el nombre de la base de datos a la que queremos conectarnos. Con esos elementos ya podemos crear un script de conexin a la base de datos y poder utilizar las funciones de PHP predefinidas para interactuar con la misma. La clase que viene veremos una herramienta que es muy fcil de utilizar para la manipulacin de las mismas, pudiendo armar toda nuestra base de datos desde ah.
33

TALLER DE PHP

MySQL - phpMyAdmin
Bueno, los que llegaron hasta ac veo que me tienen paciencia :), hoy vamos a ver una de las herramientas ms comunes a la hora de trabajar con base de datos MySQL. Estoy hablando de phpMyAdmin, un proyecto de cdigo abierto en PHP para administracin de base de datos MySQL. El mismo se maneja desde una interfaz web y es normal encontrarlo pre-instalado en casi todos los servicios de Hosting. De hecho si instalan XAMPP (paquete de instalacin de un servidor PHP - Apache - MySQL) podrn ver como ya viene configurado y listo para usar. Este programa permite acceder a todas las funciones tpicas de la base de datos MySQL de forma muy intuitiva. Bsicamente no se necesita tener conocimientos previos de base de datos para comenzar a crear tablas y agregar contenido.

Qu otras alternativas existen?


Para la administracin de base de datos MySQL existen varias alternativas. Una de las ms populares es un software llamado SQLyog, es un programa muy potente que deben bajarse en sus computadoras, el mismo permite conectarse con varias base de datos, guardar los accesos en el mismo para poder administrarlas fcilmente, se puede acceder a la informacin guardada en ellas de forma muy rpida. La desventaja que tiene es que NO es gratuito.

Por qu usar phpMyAdmin?


Una de las ventajas que tiene es que al tener una interfaz web no se necesita estar en la computadora de cada uno, el mismo se instala en el mismo lugar del Hosting, entonces desde cualquier computadora con acceso a internet van a poder realizar consultas, y acciones sobre la base de datos que estn utilizando para trabajar. Otra ventaja que ya comente antes es que es muy intuitivo y se encuentra instalado en casi todos los servicios de Hosting, por lo que lo hace uno de esos programas que s o s tienen que conocer. Por otro lado si trabajan con sus laptop, que llevan de un lugar a otro, es muy bueno tener tambin instalado SQLyog, el problema que tiene este programa es que el servidor de base de datos tiene que estar configurado para que se pueda acceder desde un lugar remoto (como phpMyAdmin se encuentra instalado en el mismo servidor de Hosting, se accede desde el mismo servidor a la base de datos), ya que en el servidor no hay que instalar nada para comenzar a utilizarlo. Bueno, es todo por ahora, a partir de la clase que viene ya comenzaremos con la creacin de tablas, yo s que estas clases son un poco densas porque son slo teora, pero son muy importantes ya que la importancia de realizar pginas dinmicas radica en las base de datos.
34

TALLER DE PHP

MySQL - Creacin de tablas


Bienvenidos a otra clase del Taller de PHP! Seguimos con el tema de MySQL. La clase pasada vimos que era phpMyAdmin; hoy vamos a ver cmo crear las tablas usndolo (esto siempre y cuando ya tengamos la Base de datos creada). Adems veremos cmo crear una tabla en la base de datos, declarando la longitud y los tipos de datos que manejaremos. Por ltimo conoceremos qu son los ndices y cmo se relacionan con la tabla creada. Comencemos! Como primer medida apenas entramos al sistema vamos a ver una pantalla como la siguiente:

Fjense que a la izquierda (en el sector ms oscuro) est el listado de base de datos y a la derecha hay una serie de informacin. Si la base de datos (a partir de ahora la llamaremos db, por data base, base de datos en ingls) ya existe hacemos clic en la misma, caso contrario, escribimos en el formulario de la derecha donde dice crear nueva base de datos o en ingls create new database con el nombre que nosotros queremos y hacemos clic en el botn crear. Perfecto, en este momento nuestra db no contiene ninguna tabla, para ver como creamos tablas, vamos a crear una tabla que contenga datos de contactos de personas amigas (una agenda).

35

TALLER DE PHP

Cmo crear una tabla?


En realidad esta parte es la ms fcil de todas, simplemente vamos al formulario donde dice crear nueva tabla en la base de datos e incluimos el nombre que queremos usar, para nuestro caso prctico va a ser agenda, en el siguiente campo del formulario debemos incluir el nmero de campos que queremos que contenga nuestra tabla, que va a ser 5. Se nos abre un nuevo formulario con los 5 campos para completar, en donde dice campo o field dependiendo el idioma en que tengan phpMyAdmin, vamos a poner el nombre que queremos que tengan nuestros campos. En tipo o type vamos a poner el tipo de dato que vamos a usar. Los ms utilizados son varchar, char, int, tinyint, text, datetime, timestamp y enum, jaja, ustedes a esta altura del partido ya me habrn sacado la ficha y sabrn que yo los hago esperar un poquito antes de explicar qu es cada cosa, pero estn equivocados, se los voy a explicar ahora mismo. varchar y char son similares, pero a su vez bastante diferentes, jeje. Siempre que se utilicen estos dos tipos, hay que declarar la longitud de los mismos, si prestan atencin al lado de declarar el tipo, tienen que declarar tambin la longitud. Los char tienen un mximo de 255 caracteres (los varchar tambin). Por ejemplo si declaramos un char de 30, se aadirn espacios a la derecha hasta la longitud especfica si lo que se incluye es algo menos a estos caracteres. De todas formas cuando se recuperan los datos, estos espacios se borran. Los varchar tambin son cadenas de caracteres pero la diferencia es que la longitud es variable. Tambin posee un mximo de 255 caracteres (para las versiones anteriores a MySql 5.0.3 y de 65.535 para las superiores), pero la diferencia principal con los char es que solo se almacenan los caracteres utilizados, si yo declaro un campo con 255 caracteres pero almaceno solo la palabra Hernn, no voy a ocupar el resto del espacio. En los dos casos, si asignan un valor mayor al declarado, la cadena de caracteres se trunca. Y esto me da pie para explicar el Text. Text es tambin una cadena de texto pero esta permite almacenar mucha ms informacin incluidos espacios en blanco y saltos de linea. Estos campos son utilizados en general para almacenar informacin recibida a travs de campos de tipo textarea (recuerden la clase de formularios). Los int y tinyint son para almacenar nmeros enteros, el rango con signo del tinyint es de -128 a 127 y sin signo de 0 a 255. Y los int son bastante ms grandes, con signo van del 2147483648 a 2147483647 y sin signo de 0 a 4294967295.

36

TALLER DE PHP

Entre los tipos de datos de fecha y hora los dos ms comunes son datetime y timestamp. La diferencia practicamente esta en la forma en que guarda la informacin, datatime para el valor 0 la guarda como 0000-00-00 00:00:00 y timestamp como 00000000000000. La diferencias practicas entre uno u otro es que por ejemplo TIMESTAMP admite fechas entre 1970 y 2037 solamente, a diferencia de DATETIME que admite desde el rango 100101-01 00:00:00 al 9999-12-31 23:59:59. Una de las ventajas que puede tener TIMESTAMP es que el campo se puede poner que se actualice al momento de cambiar cualquier otro valor almacenado, es muy comn utilizar este tipo para guarda la fecha de modificacin de una lnea. Por ltimo me queda explicar enum que tambin corresponde al tipo de datos de caracteres, como el char y el varchar, la diferencia es que hay que especificar que valores queremos que se puedan utilizar, y solo se va a poder completar el campo con estos valores. Bueno, ahora que expliqu cada tipo de dato, ya podemos crear nuestra tabla agenda, para ello vamos a crear el primer campo con el nombre idAgenda, este campo va a ser un int ya que va a ser el valor de identificacin nico de cada lnea que agreguemos, y como no sabemos el tamao que tendr nuestra agenda, por las dudas le ponemos un largo de 10, o sea, es un campo llamado idAgenda del tipo int(10). Por ltimo, como es el identificador primario y se auto incrementa, vamos a tener que seleccionar en extra el valor auto_increment y marcar el primer radio button con el iconito con una llave que dice Primaria o Primary. Esto le indica que es la llave primaria de la tabla, el valor nico que nos ayudara a identificar una fila almacenada. El segundo campo lo llamaremos nombres y va a ser un varchar(255). El tercero va a ser para almacenar los nmeros de telfono. Ac es donde surge la duda. Es un int o es un varchar? Yo elegira varchar, ya que puede ser que se almacenen nmeros de telfono con letras, o es posible separar un telfono en conjunto de dgitos, por ejemplo 4547-6789, en este caso si se hubiese elegido int, no sera un dato vlido para la tabla. El cuarto campo vamos a llamarlo email, puede ser un varchar(100) y el ltimo un enum llamado grupo, aqu en el campo longitud/valores vamos a incluir los grupos posibles de la siguiente forma: familia, trabajo, amigos. Finalmente hacemos clic en save y listo, ya tenemos nuestra tabla creada.

37

TALLER DE PHP

Qu son los ndices?


Los ndices (Key, o INDEX) son un grupo de datos que MySQL asocia con una o varias columnas de la tabla. Prcticamente son usados para encontrar rpidamente los registros que tengan un determinado valor en alguna de sus columnas. Es como un ndice en un libro, sirve para avisarle por donde comenzar a buscar en lugar de tener que leer a travs de toda la tabla para encontrar los registros que estbamos buscando. Hay cuatro tipo de ndices, primary key (nuestro campo auto incremental es nuestra primary key, es el identificador de nuestra fila, cuando nos refiramos a la informacin guardada con idAgenda = 5, estamos buscando la informacin guardada en la fila donde coincida con el idAgenda), unique, index y fulltext, el unique es para indicarle que no se puede repetir ese valor en toda la tabla, por defecto el primary key ya es un ndice unique. El index es el ndice como lo explique antes y fulltext sirve para realizar bsquedas dentro del contenido con cadena de textos bsicamente. Bueno, eso es todo, a partir de la clase que viene ya vamos a comenzar a hacer consultas sobre nuestra tabla creada, hasta la semana que viene.

38

TALLER DE PHP

MySQL - Consultas
Hola de nuevo! Estuvieron practicando? Espero que s! En la clase de hoy ya vamos a empezar a trabajar con Php y MySQL al mismo tiempo, quiz recin hoy van a empezar a entender todo esto que les vengo diciendo de la creacin de sitios dinmicos obteniendo el contenido de la base de datos. Veamos entonces cmo utilizar Php y MySQL en conjunto

Tipos de Consultas
Bsicamente tenemos cuatro consultas a realizar entre PHP y MySQL que son las siguientes: Select: busca informacin en la base de datos. Insert: ingresa informacin para almacenarla y luego ser obtenida mediante una consulta select. Update: actualiza la informacin guardada. Delete: obviamente borra la informacin.

Con estas cuatro consultas es que nosotros vamos a desarrollar todos nuestros sitios webs, obviamente que a medida que avanza el curso vamos a ir aprendiendo elementos ms complejos, como uniones entre tablas por ejemplo, pero no nos apuremos.

Primeros pasos en PHP


Antes que nada en PHP a la hora de realizar una consulta SQL, debemos indicarle con qu base de datos queremos trabajar y conectarnos a la misma. Supongamos que tenemos nuestro archivo noticias.php, lo primero que tenemos que hacer es conectar con la base de datos:
<? // datos de configuracion $ip = localhost; $usuario = nombre_de_usuario_que_conecta_con_la_db; $password = password_de_la_db; $db_name = nombre_de_la_base_de_datos_que_usamos; // conectamos con la db $conn = mysql_pconnect($ip,$usuario,$password) or die(); // seleccionamos la base de datos $huboerror = mysql_select_db($db_name,$conn) or die(); ?>

39

TALLER DE PHP

Con la funcin mysql_pconnect obtenemos la conexin con el servidor de base de datos, tenemos que completar entonces la ip al servidor, nombre de usuario y contrasea, una vez hecho esto guardamos la conexin en la variable $conn. En caso de que no conecte matamos la aplicacin (para que nuestro script no contine corriendo). Una vez que tenemos nuestra conexin le decimos con qu base de datos queremos trabajar, ya que es posible tener varias bases de datos en un mismo servidor. Con mysql_select_db, le pasamos el nombre de la base de datos y la conexin que acabamos de crear y listo, ya tenemos todo preparado para comenzar con nuestras consultas. Bien, supongamos que tenemos nuestra tabla noticias con los siguientes campos idNoticia, Ttulo, Cuerpo y Estado. Vamos a realizar una consulta para traer el listado completo de noticias que estn almacenadas en esa tabla. A continuacin de lo que escribimos antes, siempre dentro de los <? ?> vamos a poner:
$query = SELECT idNoticia,titulo,cuerpo,estado FROM `noticias`"; $response = mysql_query($query, $conn); $c = 0; while( $row = mysql_fetch_assoc($response) ) { $noticia[$c] = $row; $c++; }

Fjense que hicimos una consulta SELECT y le indicamos los campos que queremos traer (no es necesario traer todos), luego en el FROM le decimos de qu Tabla (OJO, no confundan tabla con base de datos, por un lado tenemos la base de datos que fue la que elegimos al conectar y dentro de la base de datos tenemos muchas tablas, la clase pasada creamos una). Con mysql_query enviamos la consulta a la base de datos activa, le tenemos que decir qu queremos hacer y le pasamos la conexin ($conn). Luego con mysql_fetch_assoc obtenemos un array que corresponde con una fila, devolviendo en ese array los tres campos que nosotros le pedimos en este caso: idNoticia, Ttulo y Cuerpo. Y pasa el puntero a la siguiente lnea, es por eso, que usamos un while, recuerden que mientras que exista la lnea en la base de datos, nos va a devolver un array en la variable row y nosotros a ese array, para no perderlo, lo pasamos a un array que llamamos $noticia, as de esta forma, ya tenemos toda la informacin de la base de datos en esa variable y no tenemos que recurrir de nuevo a la base de datos si lo necesitamos usar ms adelante en el mismo script. Por ejemplo si queremos mostrar el ttulo de la primer noticia que tenemos en la base de datos ponemos <? echo $noticia[0]['titulo']; ?> y nos imprime en pantalla el ttulo.
40

TALLER DE PHP

Ordenar nuestras consultas


Ahora bien, yo quiero que la ltima noticia que ingrese me la traiga primero, como pasa en casi cualquier blog, esto se soluciona muy fcilmente agregando en nuestra consulta la orden ORDER BY y luego indicando cmo queremos que sea: DESC (descendente) o ASC (ascendente). Bsicamente nuestro query queda:
$query = SELECT idNoticia,titulo,cuerpo,estado FROM `noticias` ORDER BY idNoticia DESC";

Filtrar las consultas


Y qu pasa si nosotros ahora queremos traer una consulta donde solo me traiga las noticias publicadas, es decir que estado sea igual a publicado. Para ello entre el FROM y el ORDER debemos ubicar una nueva clusula que es WHERE y ah le indicamos qu campo queremos que sea igual a qu, es decir:
$query = SELECT idNoticia,titulo,cuerpo,estado FROM `noticias` WHERE estado = 'publicado' ORDER BY idNoticia DESC";

Perfecto, eso es todo por hoy, ya a partir de la semana que viene veremos cmo ir insertando datos en la base mediante PHP.

41

TALLER DE PHP

Insertar datos en la base de datos


Buenos das alumnos! Hoy vamos a continuar con la insercin de datos en nuestra base, as ya tienen ms sentido nuestras consultas de la clase anterior. Y para que se entiendan mejor vamos a seguir el ejemplo de la tabla noticias con los campos idNoticia ( int(11) - autoincremental), titulo (varchar( 255)), cuerpo (text) y estado (enum(publicado,'borrador)) que vimos la semana pasada.

Cmo insertar nuevos registros en la base de datos?


En realidad la consulta para insertar los nuevos registros es bastante fcil si entendieron la clase anterior. Bsicamente la sintaxis es como sigue:
$query = "INSERT INTO `nombre_tabla` (campo1,campo2) values (valoresCampo1,valoresCampo2)"; $response = mysql_query($query, $conn);

Recuerden que la tienen que realizar siempre antes de realizar cualquier tarea en el script con base de datos la conexin con la misma. De igual modo esto se hace una vez, por lo general arriba de todo en cualquier script se pone la conexin con la base de datos y despus la variable que la guarda, $conn, en nuestro caso se utiliza para todas las consultas, ya sean de insertar, borrar, consultar, etc.

Casos de uso
Esta es la parte divertida, ver realmente cmo vamos a utilizar esta sentencia de MYSQL. Bsicamente lo que vamos a tener es un archivo que llamaremos subir-noticias.php, el cual separaremos en dos: por un lado todo nuestro script en php y por otro lo que tiene relacion con HTML. Ya van a ver cmo se empieza a complicar todo. Veamos la parte de HTML primero.

42

TALLER DE PHP

<html> <head> <title>Formulario de Notcias</title> </head> <body> <h1>Agregar Nueva Noticia</h1> <form action=subir-noticias.php method=post> <label for=titulo>Titulo</label><br /> <input id=titulo type=text name=titulo value=" /><br /><br /> <label for=cuerpo>Cuerpo</label><br /> <textarea id=cuerpo name=cuerpo rows=5 cols=50></textarea><br /><br /> <label for=estado>Estado</label><br /> <select id=estado name=estado> <option value=publicado>Publicado</option> <option value=borrador>Borrador</option> </select><br /><br /> <button type=submit name=submit value=1>Enviar Noticia</button> </form> </body> </html>

Si prestan atencin vern que el formulario no tiene nada de raro salvo que la accin 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:
<? // datos de configuracion $ip = localhost; $usuario = usuario; $password = password; $db_name = baseDeDatos; // conectamos con la db $conn = mysql_pconnect($ip,$usuario,$password) or die(); // seleccionamos la base de datos $huboerror = mysql_select_db($db_name,$conn) or die(); // si se envia el formulario if ( !empty($_POST['submit']) ) { $query = INSERT INTO `noticias` (titulo,cuerpo,estado) values ({$_POST['titulo']},'{$_POST['cuerpo']},'{$_POST['estado']}); $response = mysql_query($query, $conn); } ?>

43

TALLER DE PHP

Fjense un par de cositas, arriba de todo pusimos la conexin con la base de datos (esto lo voy a repetir siempre, para que quede bien grabadito. Luego hacemos uso de una condicin mediante la sentencia if. Fjense que preguntamos si la variable submit no est vaca. Nosotros en nuestro formulario le pusimos valor 1, entonces siempre que se enve el formulario, va a llegar tambin una variable $_POST['submit'] con valor 1. Si no est vaca, hacemos la insercin de la noticia. Ya ms adelante veremos cmo hacer que algunos campos sean obligatorios y otros no, pero como siempre los voy a dejar con la intriga. Por otro lado vern que uso unos {} en la sentencia de insercin de datos, esto es para que me tome solamente el ndice 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 insertara el array $_POST dentro del String en lugar del valor correspondiente al ndice titulo. Perfecto ya tenemos nuestro script para agregar noticias. Aqu les dejo el script completo:

44

TALLER DE PHP
<? // datos de configuracion $ip = localhost; $usuario = usuario; $password = password; $db_name = baseDeDatos; // conectamos con la db $conn = mysql_pconnect($ip,$usuario,$password) or die(); // seleccionamos la base de datos $huboerror = mysql_select_db($db_name,$conn) or die(); // si se envia el formulario if ( !empty($_POST['submit']) ) { $query = INSERT INTO `noticias` (titulo,cuerpo,estado) values ({$_POST['titulo']},'{$_POST['cuerpo']},'{$_POST['estado']}); $response = mysql_query($query, $conn); } ?> <html> <head> <title>Formulario de Notcias</title> </head> <body> <h1>Agregar Nueva Noticia</h1> <form action=subir-noticias.php method=post> <label for=titulo>Titulo</label><br /> <input id=titulo type=text name=titulo value=" /><br /><br /> <label for=cuerpo>Cuerpo</label><br /> <textarea id=cuerpo name=cuerpo rows=5 cols=50></textarea><br /><br /> <label for=estado>Estado</label><br /> <select id=estado name=estado> <option value=publicado>Publicado</option> <option value=borrador>Borrador</option> </select><br /><br /> <button type=submit name=submit value=1>Enviar Noticia</button> </form> </body> </html>

45

TALLER DE PHP

Actualizar y borrar registros (I)


Listo, ya aprendieron a insertar datos en una tabla, ahora nos falta saber cmo hacer si esos datos que insertamos los escribimos mal, o los queremos cambiar y, siendo un poquito ms extremos, no queremos que existan ms. Para ello, en la clase de hoy, les voy a explicar cmo es la sintaxis de las consultas de UPDATE y DELETE con la que lograremos nuestro objetivo.

Sintaxis
Bsicamente la sintaxis de PHP para estas consultas es bastante sencilla, por ejemplo, para actualizar una tabla:
$query = "UPDATE `nombre_tabla` set campo1 = 'valoresCampo1', campo2 = 'valoresCampo2' WHERE primaryKey = 'valorPrimaryKey' LIMIT 1"; $response = mysql_query($query, $conn);

Recordar pasar siempre la variable de conexin 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 tambin la clusula WHERE para indicarle que estn modificando una fila nicamente, si ustedes quieren modificar varias filas con el mismo valor, pueden quitar la clusula where y el limit 1, y de esta forma editaran 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 condicin, borrar por primary key o por muchos campos a la vez, pero mucho OJO porque pueden borrar toda la informacin que contiene la tabla. La clase que viene veremos algunos casos de usos de ambas consultas, y adems aadiremos consultas del tipo SELECT, necesarias para poder hacer un administrador de contenido decente. Practiquen mucho!

46

TALLER DE PHP

Actualizar y borrar registros (II)


Hola de nuevo! Me imagino que habrn 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:

47

TALLER DE PHP
<h1>Agregar Nueva Noticia</h1> <form action=editar-noticias.php method=post> <label for=titulo>Ttulo</label><br /> <input id=titulo name=titulo value=<? echo $noticia['titulo']; ?> type=text /><br /><br /> <label for=cuerpo>Cuerpo</label><br /> <textarea id=cuerpo name=cuerpo rows=5 cols=50><? echo $noticia['cuerpo']; ?></textarea><br /><br /> <label for=estado>Estado</label> <select id=estado name=estado> <option value=publicado <? if ( $noticia['estado'] == publicado ) echo selected=selected; ?>>Publicado</option> <option value=borrado <? if ( $noticia['estado'] == borrado ) echo selected=selected; ?>>Borrado</option> </select><br /><br /> <button type=submit name=submit value=1>Editar Noticia</button> <input name=idNoticia value=<? echo $noticia['idNoticia']; ?> type=hidden /> </form>

Como vern 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 hicimos al ingresar una noticia. Si hiciramos eso, tendramos 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']}, estado = {$_POST['estado']} WHERE idNoticia = {$_POST['idNoticia']} LIMIT 1; $response = mysql_query($query, $conn); }

48

TALLER DE PHP

Nuestro archivo terminado queda de la siguiente manera:


<? // datos de configuracion $ip = localhost; $usuario = usuario; $password = password; $db_name = baseDeDatos; // conectamos con la db $conn = mysql_pconnect($ip,$usuario,$password) or die(); // seleccionamos la base de datos $huboerror = mysql_select_db($db_name,$conn) or die(); // si se envia el formulario de edicion if ( !empty($_POST['submit']) ) { $query = UPDATE `noticias` set titulo = {$_POST['titulo']}, set cuerpo = {$_POST['cuerpo']}, estado = {$_POST['estado']} WHERE idNoticia = {$_POST['idNoticia']} LIMIT 1; $response = mysql_query($query, $conn); } // si tenemos id de noticia 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); } ?> <html> <head> <title>Formulario de Edicin de Noticias</title> </head> <body> <h1>Agregar Nueva Noticia</h1> <form action=editar-noticias.php method=post> <label for=titulo>Titulo</label><br /> <input id=titulo name=titulo value=<? echo $noticia['titulo']; ?> type=text /><br /><br /> <label for=cuerpo>Cuerpo</label><br /> <textarea id=cuerpo name=cuerpo rows=5 cols=50><? echo $noticia['cuerpo']; ?></textarea><br /><br /> <label for=estado>Estado</label> <select id=estado name=estado> <option value=publicado <? if ( $noticia['estado'] == publicado ) echo selected=selected; ?>>Publicado</option> <option value=borrado <? if ( $noticia['estado'] == borrado ) echo selected=selected; ?>>Borrado</option> </select><br /><br /> <button type=submit name=submit value=1>Editar Noticia</button> <input name=idNoticia value=<? echo $noticia['idNoticia']; ?> type=hidden /> </form> </body>

49

TALLER DE PHP

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.

50

TALLER DE PHP

MySQL Consultas complejas


Ac estamos de vuelta, me imagino un poco ms experimentados con esto de las pginas dinmicas. Ya sabemos prcticamente cmo hacer las consultas, insertar datos en una tabla y modificarlos. En la clase de hoy vamos a ir un poquito ms all y tratar de realizar consultas ms complejas, uniendo diferentes tablas, relacionndolas, etc.

joins
Las consultas con joins prcticamente 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 identificacin 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 tambin, o cualquier otro motivo, ahora solo va a tener que editar la tabla de usuarios, si nosotros hubiramos puesto en la tabla noticias en lugar de idAutor, nombreDelAutor, al momento de actualizar la tabla de usuarios, tambin tendramos que actualizar la de noticias. Bueno, ms o menos ya entendieron cul 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 cul 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 ms 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

51

TALLER DE PHP

De esta forma unimos ambas tablas, fjense que en las columnas primero aclaramos a que tabla pertenece lo que queremos traer y despus el nombre del campo, lo mismo que cuando declaramos el INNER JOIN le tenemos que indicar con qu tabla queremos unir y despus en ON le avisamos de qu forma es que unimos. Al final de esta consulta se puede poner sin problemas filtros del tipo WHERE, tambin ORDER BY y LIMIT. Inner, Left y Right Joins Existen varios tipos de joins, los tres ms comunes son los que puse en el ttulo :). El inner join no va a mostrar ni un solo resultado si la condicin de unin 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 ms peso a la segunda tabla, por ejemplo, tenemos aparte de las tablas anteriores una tabla ms que es noticiasImgenes donde dejamos registro de las imgenes que le asignamos a una noticia noticiasImagenes [idImagen, idNoticia, archivo] Se puede dar el caso en que una noticia tenga varias imgenes, 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 lneas como imgenes 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 ms compleja son los UNION, que sirve para combinar resultados de varias consultas del tipo SELECT. La sintaxis es:
SELECT ... UNION [ALL | DISTINCT] SELECT

52

TALLER DE PHP

El union puede ser UNION ALL o UNION DISTINCT, con la primer opcin 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 creacin, 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 clase que viene.

53

TALLER DE PHP

MySql - Consultas ms usadas


Buenas, en la clase de hoy vamos a ver una forma de traer valores puntuales de la base de datos. Tambin veremos cmo evitar hacer cuentas o clculos complejos y cmo aplicar count, los tipos de consultas max y min, sum y limit.

Count
El count nos va a dar el nmero de veces que se repite un valor en la db, es decir el nmero de registros almacenados que correspondan con nuestra consulta. Por ejemplo, en nuestra tabla de noticias, si queremos saber cuntas noticias hay publicada entonces la consulta que hacemos es:
SELECT COUNT(*) FROM noticias WHERE estado = 'publicado';

Ahora que pasa si queremos agregar algn otro campo en la consulta, por ejemplo el nmero de noticias publicadas por cada autor:
SELECT autor, count(*) FROM noticias GROUP BY autor;

Fjense que agregamos a la consulta GROUP BY que nos permite agrupar por el valor que queremos, por ejemplo, la consulta anterior nos traera como resultados posibles:
Justi - 3 Juan Manuel - 8 Wilkilen - 1

Max y Min
Otro tipo de consulta muy comn es traer el valor mximo o mnimo de un listado de valores. Supongamos que tenemos una tabla de productos con sus respectivos precios, si queremos traer el precio mximo o mnimo lo hacemos de la siguiente manera:
SELECT MAX(precio) FROM productos; SELECT MIN(precio) FROM productos;

Y si queremos saber, por ejemplo, cul es el precio promedio del producto con id 15 podemos hacer:
SELECT AVG(precio) FROM productos WHERE idProducto = 15;

54

TALLER DE PHP

SUM
Por ltimo tenemos la suma. Por ejemplo, si tenemos un carrito de compras y seleccionamos 5 productos y queremos saber cunto es el total a pagar por el usuario con id 3 deberamos hacer:
SELECT sum(precio) FROM carrito WHERE idUsuario = 3;

LIMIT
Algo que es muy comn tambin 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 hara demasiado uso de servidor y demorara 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 pasndole 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 cuntos valores, por lo que la consulta anterior va a traer desde el producto con id 6 al 15. Es muy comn utilizar el limit con dos argumentos cuando se desea hacer un paginado. Bueno, eso es todo por hoy, hasta la clase que viene!

55

TALLER DE PHP

Respuestas a la clase de consulta


Bienvenidos a otra clase del Taller de PHP!

Subiendo Imgenes 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 cmo 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 slo me salen garabatos, estoy empezando en esto y me encanta, solo quera saber si me puedes explicar o si puedes hacer una leccin de cmo solucionar ese problema. Cuando agregamos imgenes en forma dinmica a un sitio, a pesar de que las mismas se pueden guardar en base de datos, lo ms conveniente, por una cuestin de performance, es guardar toda la informacin 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 fsicamente en el servidor, en el mismo lugar donde estn nuestros scripts de php, puede ser dentro de una carpeta llamada Uploads o Subidas. Para ello php nos da una herramienta para poder recibir imgenes a travs de un formulario y guardarla en donde deseamos. El proceso para subir archivos al servidor ser explicado en la clase 26 y la manipulacin de imgenes para crear nuevas de diferentes tamaos en la clase 27.

IDE para desarrollar en php


Utilizas algn 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 ms una cuestin de gustos que otra cosa el cul es la mejor. En un principio yo utilizaba Dreamweaver, ya que trabajaba un poco en forma visual y un poco en modo cdigo. Luego cuando ya prcticamente hacia todo en modo cdigo 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 cabeza con Zend, de hecho actualmente yo estoy usando Eclipse con un plugin de Zend Studio obteniendo las mejores caractersticas de ambos programas.

Importar datos en la db de un CSV


Me gustara, si le es posible a alguno de ustedes, que me ayudaran a insertar registros a una tabla usando los datos de un archivo de texto separados por coma. Excel una de las caractersticas que tiene es que nos permite guardar informacin 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.

56

TALLER DE PHP Algunas cuestiones a tener en cuenta son que en la tabla estn los campos en el mismo nmero 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 tendra que tener solo tres campos por lnea. 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 opcin que dice importar. Ah vamos a buscar el archivo que queremos subir, y nos va a preguntar un par de cositas como por ejemplo porque carcter estn separados los campos, ya viene por defecto l ;, 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 <?php echo, que es una parte de la instrucin (<input type=hidden name=ip value=>), 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. Sabra decirme a que puede deberse esta situacin? 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:
<? echo $_SERVER["REMOTE_ADDR"]; ?>

Para ser agregado en un formulario en el campo hidden, o sino, mucho ms seguro, es agregarlo directamente en el script que vamos a correr para guardar la informacin recibida desde el formulario y guardar en la db directamente, por ms que el script que guarda la informacin 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 peticin por lo que no tendremos ningn problema.

57

TALLER DE PHP

Manipulacin de archivos (I)


Hola Chicos! Bienvenidos a una nueva clase del Taller de PHP! Hoy vamos a ver un poco de manejo de archivos, ms que nada la lectura y creacin de un txt. Cmo abrirlo con la funcin fopen, cerrarlo con fclose o leerlo con fread. Dejaremos para la segunda parte la escritura y borrado del mismo. Con las mismas tcnicas que vamos a ver en estas clases vamos a poder manipular no slo txt sino tambin html, xml, etc.

Abriendo un archivo
Para abrir un archivo tenemos que usar la funcin 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");

De esta forma abrimos el archivo logs.txt y posicionamos el puntero en la primer lnea para poder comenzar a leerlo.

58

TALLER DE PHP

Cerrar Archivos
Para cerrar el archivo debemos usar fclose(). A la funcin 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 sera:


$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 pasndole la variable con la ruta y le decimos que sea con el modo slo lectura y con el puntero al principio del archivo. Luego usamos fread y le pasamos el puntero y le decimos el tamao 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.

59

TALLER DE PHP

Manipulacin de archivos (II)


Hola a todos los lectores del Taller de PHP! Estuvieron practicando bastante? Recuerden que la clase pasada comenzamos a ver cmo crear y manejar archivos (aprendimos a crear un txt, a abrirlo con la funcin fopen, a cerrarlo con fclose y a leerlo con fread). Hoy vamos a ver la segunda parte de manejo de archivos. En esta clase veremos cmo escribir y borrar archivos. Esto nos permitir, por ejemplo, crear un archivo HTML que adentro contenga lo que sea que queramos. Comencemos!

fwrite
Para comenzar a escribir archivos, usaremos la funcin fwrite:
fwrite( $puntero, "Texto que queremos guardar" );

Un ejemplo de su uso sera 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 exista lo creamos, y si exista y tena 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, pasndole el puntero que acabamos de abrir y luego el texto, fjense 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 ms texto, el mismo se ubique en un regln 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 podan crear html o xml con este mtodo, pues es muy sencillo, por ejemplo si queremos crear un html podemos hacer simplemente:
$fp = fopen("holamundo.html", "a"); fwrite($fp, <html><head><title>Hola Mundo</title></head><body><h1>Hola Mundo</h1></body></html>); fclose($fp);

Sencillo no? incluso si quieren pueden ponerle saltos de lnea al html para que cuando lo abran con algn editor, no est todo el texto de corrido.
60

TALLER DE PHP

Eliminar un archivo
Para borrar directamente un archivo del servidor usamos la funcin unlink.
unlink("url absoluta al archivo");

Por ejemplo si queremos borrar el archivo.txt lo hacemos de la siguiente manera:


$url = "c:/documentos/archivo.txt"; if ( file_exists( $url ) ) unlink( $url );

Fjense que primero nos fijamos que exista el archivo ya que, si no existe, unlink nos va a tirar un error.

61

TALLER DE PHP

Moviendo archivos
Hola, bienvenidos al Taller de PHP. En la clase de hoy vamos a ver cmo subir archivos al servidor y algunos casos de uso. En realidad suena complicado pero es ms 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. Adems hay que tener en claro el proceso que se llevar a cabo en el back-end, donde usaremos la funcin $_FILES, que nos permite trabajar mucho ms especficamente con los archivos, agregar restricciones, etc. Comencemos!

Cmo tiene que ser nuestro formulario?


A la hora de querer subir un archivo al servidor desde un formulario para poder agregar imgenes en una noticia, por ejemplo, tenemos que tener en cuenta algunos detallecitos. El ms 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 parmetro 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 bsicamente quedara as:
<form name="nueva-noticia" enctype="multipart/form-data" method="post" action="nueva_noticia.php"> <label>Ttulo <br /><input type=text name=titulo value=" /></label> <label>Cuerpo <br /><textarea cols=80 rows=10 name=cuerpo></textarea></label> <label>Imagen <br /><input type=file name=imagen value=" /></label> </form>

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 venamos haciendo con el resto de los formularios, vamos a recibir va POST las variables ttulo 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 preguntarn y la respuesta es bastante sencilla, FILES nos da bastante ms informacin respecto al archivo que subimos:

- 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 una carpeta nuestra dentro del Hosting, por lo general no se tiene acceso a la carpeta temporal donde se suben los archivos.
$_FILES['imagen']['tmp_name']

62

TALLER DE PHP

nos dice el tamao que tiene el archivo, por si se realiza un servicio pblico y queremos limitar la subida solo a archivos de 1 mega, entonces se puede poner una condicin utilizando este valor.
$_FILES['imagen']['size'] -

nos va a indicar el tipo de archivo del que se trate, en nuestro ejemplo, como slo queremos que se suban imgenes podemos poner un if limitando slo al caso de las imgenes.
$_FILES['imagen']['type'] -

nos va a indicar el nombre del archivo original, ya que el tmp_name es un nombre generado por el servidor.
$_FILES['imagen']['name'] -

Entonces ya sabiendo cmo 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 imgenes de las noticias, lo que tenemos que hacer es poner la url absoluta a esa carpeta. Fjense que no es desde donde estn todos nuestros scripts de php, sino que va a ser algo del estilo /var/www/elwebmaster.com/htdocs/uploads, y si estn en Windows probablemente sea algo as: c:/ archivos de programa/ xampp/ www/ elwebmaster.com/ uploads. Si ustedes tienen un servicio de Hosting contratado, lo ms probable que les hayan enviado un email con la informacin 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 una raz en otro lado. Si no tienen el email, y no tienen ni idea como es la url absoluta en donde estn parados, pueden generar un error de php a propsito, y el mismo error les va a decir dnde se encuentran, por ejemplo, si en sus script ponen:
<? sadfasdf ?>

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/

63

TALLER DE PHP

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 funcin de php move_uploaded_file(), que va a mover un archivo recin subido a una nueva ubicacin:
<? $destino = /var/www/elwebmaster.com/www/uploads; $origen = $_FILES['imagen']['tmp_name']; move_uploaded_file( $origen, $destino ); ?>

Sencillito, no? La clase que viene vamos a ver como recibir imgenes grandotas y convertirlas en imgenes ms pequeas para que se adapten a nuestro sitio. Saludos!

64

TALLER DE PHP

Manipulacin de imgenes
Hola, bienvenidos nuevamente al Taller de PHP! La clase anterior vimos cmo subir imgenes a nuestro sitio a travs de un formulario, en la clase de hoy lo que vamos a hacer es aprender a manipular esas imgenes para generar una imagen ms pequea, llamada thumbnail. Para poder manipular imgenes vamos a necesitar que nuestro servicio de hosting tenga instalada la libreria LibraryGD, no se preocupen igual ya que la mayora de los servidores de hoy en da la incluyen, incluso si instalaron Xampp en sus computadoras tambin lo tienen.

Generando imgenes
Antes que nada guardamos en una variable la direccin 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 dnde 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 extensin, 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, indicndole por qu patrn queremos separar, en este caso lo separamos por un punto. Con strtolower lo que hacemos es llevar primero a minsculas todo, as cuando generemos nuevas imgenes se generan con nombres todos en minsculas. El array que se genera tiene por nombre $separo y tiene dos ndices 0 y 1, ya que cada imagen slo tiene un nico punto, por lo que separa el string en dos nicamente. Luego de esto armamos un switch para ver qu tipo de extensin tiene el archivo y creamos una nueva imagen segn la extensin que tenga.

65

TALLER DE PHP

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. Luego, lo que hay que hacer es crear una nueva imagen true color del tamao 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 funcin 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 versin de php que tenemos instalado en el servidor). Continuamos generndola 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 tamao 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 );

66

TALLER DE PHP

Con esta funcin lo que hacemos es pasarle como parmetros, la imagen blanca que generamos con el tamao 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 tambin va a ser 0, a continuacin 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 tambin va a ser igual al ancho y alto de la imagen original. Esto quedara 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 recin generada y en qu 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 imgenes 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 prxima clase!

67

TALLER DE PHP

Funciones ms tiles 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. Adems veremos las funciones ms usadas para manipular arrays, como array_diff, array_search e in_array. No perdamos ms tiempo y comencemos con nuestra clase de hoy del Taller de PHP!

Time()
No s si estn familiarizados con el trmino unixtime, por las dudas se los comento de forma informal, prcticamente es una forma de trabajar con fechas y horas pero con un numero entero. Es un nmero 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 ms prctico, 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 funcin 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 artculos de la semana podemos calcularlo de la siguiente forma:
<? $ultimaSemana = time() - ( 60 * 60 * 24 * 7 ); ?>

El nmero que estamos restando luego de time() son los segundos que tiene una semana, es ms fcil y practico poner el clculo de segundos por minuto por minutos por hora por horas del da por das de la semana que poner directamente el resultado, ya que de este modo, a la hora de ver el cdigo de nuestro script lo vamos a entender mejor que si estamos viendo el resultado de esa multiplicacin 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 parmetro 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 da correspondiente a esa hora.


68

TALLER DE PHP

mktime()
Sigue con la tnica 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, ao );

Por ejemplo, combinando con date, podemos tener datos ms completos de un da 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 ms 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
Algnas de las funciones ms 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.

69

TALLER DE PHP

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; }

Maysculas y minsculas
strtolower(): convierte todo el string en minsculas. strtoupper(): pasa todo el string a maysculas. ucfirst(): convierte la primer letra del string en mayscula. ucwords(): convierte cada primer letra de cada palabra en mayscula. Por ejemplo si tenemos un string:
$titulo = "TALLER DE PHP - FUNCIONES UTILES";

y queremos modificarlo para que todos los ttulos sean iguales, todos los caracteres en minscula menos la primer letra de la frase, tenemos que pasar primero el string a minsculas y despus hacer que la primer letra sea mayscula.
$titulo = ucfirst( strtolower( $titulo ) );

Espero que la clase les haya gustado.

70

TALLER DE PHP

Expresiones Regulares (I)


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 patrn especfico dentro de una cadena de texto. Asimismo, veremos que los operadores pueden ayudarnos haciendo que la expresin sea ms flexible es decir, que se adapte a patrones mucho ms complejos. Empecemos!

Qu son las expresiones regulares?


Bsicamente es como puse en el primer prrafo, una expresin regular es una expresin 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 patrn para realizar alguna tarea especfica. Es muy comn utilizar expresiones regulares por ejemplo a la hora de verificar que un email sea verdico, ya que todos los correos electrnicos van a contener un @ y un .com en alguna parte de la cadena. Ahora bien, no siempre estamos buscando un patrn exacto como fue el primer ejemplo de Webmaster, hay veces que tenemos que buscar patrones ms difciles 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 imgenes si o si van a tener un <img y un src="> pero no sabemos si van a tener algo ms como puede ser un class=" o un style=", border=", etc. Es en estos casos cuando empezamos a jugar con los operadores en la expresin para que se adapte a lo que estamos buscando.

Operadores ms comunes
| - significa alternacin () 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 expresin 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 patrn p?sicologo, machea con psicologo y sicologo.

71

TALLER DE PHP

* - significa que el caracter al que sigue puede aparecer cero, una o muchas veces. gooo*gle va a coincidir con google, gooogle, goooooogle, etc. Fjense que a diferencia del patrn con el operador +, ac le pusimos tres o en google, ya que no es necesario que este la tercer o. () - los parntesis se utilizan para agrupar un conjunto de caracteres o definir el mbito de accin de la expresin, por ejemplo el que puse antes de nene o nena y sino uno un poco ms complejo puede ser (sin)?verguenza, fjense que en ese caso pusimos el conjunto sin precedido por el ?, lo que significa que esta expresin va a machear con las palabras sinverguenza, verguenza pero no con sinsinverguenza por ejemplo. ^ - significa que nuestro patrn debe ubicarse al comienzo del string que queremos analizar, por ejemplo el patrn pe coincide con perro, pepe, pelota pero no coincide con trompeta o campera. $ - es similar al ^ pero ahora nuestro patrn 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 patrn src=(.+) por ejemplo, en este caso estaramos buscando una cadena de caracteres que contenga src=un caracter por lo menos. \ - sirve para escapar un caracter, por ejemplo si en nuestro patrn queremos buscar un smbolo de $, si no lo escapamos, al procesar el string va a buscar el patrn al final de la cadena y nos va a fallar entonces necesitamos escaparlo, y eso se hace con la barra invertida, nuestro patrn quedara algo as \$(.+) y eso coincide con $100, $1388. Si buscamos una cifra de dos nmeros 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} Bsicamente estas son las reglas bsicas a la hora de trabajar con expresiones regulares, ya la clase que viene vamos a ver cmo utilizarlas con php.

72

TALLER DE PHP

Expresiones Regulares (II)


Hola, hoy terminaremos con la clase de expresiones regulares. Para ello vamos a ver las funciones de php ms utilizadas a la hora de realizar tareas con las mismas. Entre ellas veremos preg_match (que busca una expresin en un string), preg_match_all (que en lugar de terminar en la primer expresin que encuentra, continua volcando en un array todas las coincidencias) y preg_replace (que busca una expresin regular y reemplaza el contenido de esa expresin por otro predefinido). Comencemos!

preg_match
Busca una expresin en un string. La sintaxis es:
preg_match ( $patron, $string, $match );

$patron es el patrn 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 patrn. $match es un parmetro opcional, no es necesario que este, si lo incluimos, ah tendremos un vector con los resultados coincidentes con nuestro patrn, 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.
<? $string = "abcdef"; $patron = /def/; if ( preg_match ( $patron, $string ) ) { echo coincide; } else { echo no coincide; } ?>

Otro ejemplo:
<? $string = "abcdef"; $patron = /def/; preg_match ( $patron, $string, $matches); echo $matches[0]; ?>

En este caso el echo $matches[0] nos va a imprimir def ya que el patrn estaba definido en el resultado, pero si cambiramos el patrn por algo genrico
<? $patron = "/^(.+)@/"; $string = info@elwebmaster.com; preg_match( $patron, $string, $matches ); ?>

73

TALLER DE PHP

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 est dentro de los parntesis (), si hubisemos puestos varios parntesis, tendramos tambin un $matches[2], $matches[3], etc etc. Siempre que quieran ver el contenido de un vector, con sus ndices para saber dnde est el contenido de cada cosa, pueden hacer
<? var_dump( $matches ); ?>

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 funcin es similar a preg_match, pero en lugar de terminar en la primer expresin que encuentra, contina 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@ } [1]=> array(1) { [0]=> string(4) info } }

preg_replace
Busca una expresin regular y reemplaza el contenido de esa expresin por otro predefinido.
preg_replace( $patron, $reemplazo, $sujeto )

74

TALLER DE PHP

En $patron vamos a poner el o los patrones a buscar, en $reemplazo, lo que queremos poner en el lugar del patrn y $sujeto va a ser el string original en el que queremos buscar el contenido para ser reemplazado. Por ejemplo:
<? $sujeto = "El taller de php de Justi es el mejor"; $patron = array( /php/, /Justi/ ); $reemplazo = array( dreamweaver, Thor ); $nuevoTexto = preg_replace( $patron, $reemplazo, $sujeto ); echo $nuevoTexto; ?>

Ahora vamos a ver en pantalla El taller de dreamweaver de Thor es el mejor Eso es todo por ahora, espero que hayan entendido todo el taller hasta este punto, ya que la clase que viene empezaremos con Practica! Como crear nuestro propio blog.

75

TALLER DE PHP

Creando nuestro propio blog


Hola, bienvenidos al Taller de PHP de elWebmaster.com! El da de hoy veremos la introduccin para crear un blog desde cero. La idea de esta etapa final del curso, es que vean ms o menos cmo se relaciona todo lo que estuvimos viendo hasta el momento. En qu consiste nuestro blog? Bsicamente lo que vamos a hacer es un sistema que muestre noticias, ordenadas por fecha cronolgicamente 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 annimo, 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 comn 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. 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 prcticos.

Diferentes caractersticas del contenido


El contenido del sitio va a estar separado por categoras por lo que las noticias no slo se debern mostrar cronolgicamente sino que tambin se tendrn que poder filtrar por categoras.

FrontEnd y BackEnd. Qu son?


Esto ms 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 ve el usuario annimo 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 ms o menos lo que vamos a ir viendo en las clases siguientes hasta terminar el tallercito, espero que les guste lo que se viene.

76

TALLER DE PHP

Nuestro blog Creacin de la base de datos


Hola, aqu estoy de nuevo para continuar con nuestro propio blog. En la clase de hoy vamos a ver cmo va a ser la estructura de nuestra base de datos. Bsicamente vamos a tener cuatro tablas. Una de usuarios, otra de noticias, una tercera con las categoras 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 idUsuario usuario password email tipo Type int(11) varchar(50) char(32) varchar(50) enum('comun','admin') comun Null Key PRI Default NULL Extra auto_increment

Sintaxis sql para crear la tabla:


1. CREATE TABLE `usuarios` ( 2. `idUsuario` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 3. `usuario` VARCHAR( 50 ) NOT NULL , 4. `password` CHAR( 32 ) NOT NULL , 5. `email` VARCHAR( 50 ) NOT NULL , 6. `tipo` ENUM( 'comun', 'admin' ) NOT NULL DEFAULT 'comun' 7. ) ENGINE = MYISAM ;

77

TALLER DE PHP

Hacemos que idUsuario sea la primary key con un autoincrement para que se vaya sumando a medida que se van registrando nuevos usuarios, tambin 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 limitrselo 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 codificacin md5 y los cdigos 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 idNoticia titulo copete cuerpo idUsuario idCategoria fPublicacion fCreacion fModificacion Type int(11) varchar(50) varchar(255) text int(11) int(11) timestamp timestamp timestamp Null Key PRI Default NULL Extra auto_increment

78

TALLER DE PHP

Sintaxis sql para crear la tabla:


1. CREATE TABLE `noticias` ( 2. `idNoticia` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 3. `titulo` VARCHAR( 50 ) NOT NULL , 4. `copete` VARCHAR( 255 ) NOT NULL , 5. `cuerpo` TEXT NOT NULL , 6. `idUsuario` INT( 11 ) NOT NULL , 7. `idCategoria` INT( 11 ) NOT NULL , 8. `fPublicacion` TIMESTAMP NOT NULL , 9. `fCreacion` TIMESTAMP NOT NULL , 10.`fModificacion` TIMESTAMP NOT NULL 11.) ENGINE = MYISAM ;

No hay mucho que explicar en esta, tambin tenemos una primary key en idNoticia para identificar a cada una, tenemos una relacin 1 a muchos entre una noticia y un usuario, es decir, una noticia puede tener un slo autor pero un autor puede tener muchas noticias. Lo mismo con las categoras, una noticia puede tener una sola categora pero una categora puede tener muchas noticias. Y tambin tenemos tres campos de fechas, uno para la fecha de publicacin de la noticia, otra para la fecha en que se cre y finalmente cuando se modific. Para la tabla de categoras vamos a tener:

Tabla: categoras
Field idCategoria valor Type int(11) varchar(50) Null Key PRI Default NULL Extra auto_increment

79

TALLER DE PHP

Sql:
1. CREATE TABLE `categorias` ( 2. `idCategoria` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 3. `valor` VARCHAR( 50 ) NOT NULL 4. ) ENGINE = MYISAM ;

Y finalmente la tabla de comentarios:

Tabla: comentarios
Field idComentario comentario idUsuario idNoticia estado fCreacion Type int(11) text int(11) int(11) enum('sin validar','apto') timestamp sin validar Null Key Default PRI NULL Extra auto_increment

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 ;

80

TALLER DE PHP

En esta tabla tenemos tambin una relacin 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 validados (igual todava no estamos en esa disyuntiva) y los mismos aparecern en un listado general para que un admin los apruebe o los borre. Y por ltimo tenemos la fecha de creacin del mismo. Bueno, espero que les haya gustado la forma en que diagramamos nuestro blog, ya a partir de la clase que viene vamos a empezar con la codificacin del mismo.

81

TALLER DE PHP

Nuestro Blog - Registro de usuario


Hola! En la clase de hoy vamos a ver cmo hacer para crear un formulario para que se registren nuestros usuarios. Por un lado vamos a tener algunos archivos en la carpeta raz, pero por otro vamos a tener una carpeta llamada "admin" que es donde va a estar nuestro backend. En esta carpeta tambin tendremos dos archivos adicionales que son necesarios antes de arrancar.

Cmo vamos a organizar nuestros archivos


La estructura de archivos por el momento ser: + admin -------------- config.php - conexion.php -------------- index.php - registrar.php El primer archivo que vamos a ver, config.php, es un archivo de configuracin, en el cual guardaremos constantes que vamos a necesitar a lo largo del sitio. El misma va a contener:

admin/config.php
1. <?php 2. 3. // constantes de conexion de db 4. define( DB_SERVER, localhost ); 5. define( DB_NAME, blogit); 6. define( DB_USER, root); 7. define( DB_PASS, ); 8. 9. ?>

El mismo deber estar completo con los datos de su base de datos.

82

TALLER DE PHP

El siguiente archivo, conexion.php, contiene una funcin que devuelve "false" o "el puntero" a la conexin con la base de datos, ya que en todas o casi todas las pginas de nuestro sitio necesitaremos una conexin con la db, es prctico mantenerla dentro de una funcin.

admin/conexion.php
1. <?php 2. 3. function conectar () { 4. 5. $db_con = mysql_pconnect (DB_SERVER,DB_USER,DB_PASS); 6. if (!$db_con) return false; 7. if (!mysql_select_db (DB_NAME, $db_con)) return false; 8. return $db_con; 9. 10.} 11. 12.?>

Fjense que estamos usando las constantes que agregamos en el archivo config.php, esto es prctico a la hora de tener que cambiar de base de datos, o migrar el sitio, slo tendremos que modificar el archivo de configuracin. Listo, ya tenemos nuestros dos archivos antes de comenzar el proceso de registro. En el archivo index.php tendremos una presentacin por el momento, donde se podr optar por registrarse o ingresar (ms adelante tendremos las noticias, pero todava estamos muy verdes).

83

TALLER DE PHP

index.php
1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 2. <html xmlns=http://www.w3.org/1999/xhtml> 3. <head> 4. <meta http-equiv=Content-Type content=text/html; charset=iso-8859-1 /> 5. <title>Blog Personal</title> 6. </head> 7. 8. <body> 9. 10. <h1>Blog Personal</h1> 11. 12. <? if ( !empty($_GET['registro']) ) { ?> 13. <div>El registro ha sido exitoso.</div> 14. <? } ?> 15. 16. <ul> 17. <li><a href=ingresar.php>Iniciar sesi&oacute;n</a></li> 18. <li><a href=registrar.php>Reg&iacute;strate gratis</a></li> 19. </ul> 20. 21. </body> 22. </html>

Fjense que en el body hay una sentencia php, es un if preguntando si no est vaca una variable get llamada registro, esta variable la setearemos en el archivo registrar.php en el caso de que el registro sea exitoso. En caso de que el usuario no llegue desde ese punto, jams ver el mensaje dentro del if.

84

TALLER DE PHP

Bueno, finalmente vamos a nuestro archivo registrar.php, que es el que tiene la lgica de nuestro registro. Primero les muestro todo el cdigo y despus les voy explicando qu es lo que hace cada cosa.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. // si se envio el formulario 11. if ( !empty($_POST['submit']) ) { 12. 13. // definimos las variables 14. if ( !empty($_POST['usuario']) ) 15. if ( !empty($_POST['password']) ) $usuario $password = $_POST['usuario']; = $_POST['password']; // obtengo puntero de conexion con la db $dbConn = conectar(); // archivos necesarios require_once admin/config.php; require_once admin/conexion.php; <?php

16. if ( !empty($_POST['re-password']) )$rePassword = $_POST['re-password']; 17. if ( !empty($_POST['email']) ) 18. 19. // completamos la variable error si es necesario 20. if ( empty($usuario) ) usuario; 21. if ( empty($password) ) $error['password'] 22. if ( empty($email) ) $error['email'] = Es obligatorio completar la contrasea; = Es obligatorio completar el email; $error['usuario'] = Es obligatorio completar el nombre de $email = $_POST['email'];

23. if ( $_POST['password'] != $_POST['re-password'] ) { 24. $error['re-password'] = La contrase&ntilde;a no coincide; 25. } 26. 27. // si no hay errores registramos al usuario 28. if ( empty($error) ) { 29. 30. // inserto los datos de registro en la db 31. $query = INSERT INTO `usuarios` (usuario,password,email) VALUES

($usuario,'.md5($password).,$email); 32. $result = mysql_query($query, $dbConn); 33. 34. header( 'Location: index.php?registro=true' ); 35. die; 36. 37. } 38. 39. } 40. 41. ?>

85

TALLER DE PHP
1. <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1strict.dtd> 2. 3. 4. 5. 6. 7. 8. 9. 10. <h1>Registro de Usuario</h1> 11. 12. <? if (!empty($error)) { ?> 13. <ul> 14. <? foreach ($error as $mensaje) { ?> 15. <li><?= $mensaje ?></li> 16. <? } ?> 17. </ul> 18. <? } ?> 19. 20. <form action="registrar.php" method="post"> 21. 22. <p> 23. <label for=usuario>Nombre de usuario</label><br /> 24. <input name=usuario type=text value=<? if ( ! empty($usuario) ) echo $usuario; ?> /> 25. </p> 26. <p> 27. <label for=password>Contrase&ntilde;a</label><br /> 28. <input name=password type=password value=<? if ( ! empty($password) ) echo $password; ?> /> 29. </p> 30. <p> 31. <label for=re-password>Repetir Contrase&ntilde;a</label><br /> 32. <input name=re-password type=password value=<? if ( ! empty($rePassword) ) echo $rePassword; ?> /> 33. </p> 34. <p> 35. <label for=email>Correo Electr&oacute;nico</label><br /> 36. <input name=email type=text value=<? if ( ! empty($email) ) echo $email; ?> /> 37. </p> 38. <p> 39. <input name=submit type=submit value=Reg&iacute;strate /> 40. </p> 41. 42. </form> 43. 44. </body> 45. </html> <body> <html xmlns=http://www.w3.org/1999/xhtml> <head> <meta http-equiv=Content-Type content=text/html; charset=iso-8859-1 /> <title>Blog Personal</title> </head>

86

TALLER DE PHP

Antes de explicar el cdigo 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. Fjense que uso <?= $mensaje ?>, eso es equivalente a hacer <? echo $mensaje; ?>, es muy prctico a la hora de tener que imprimir una sola lnea o algo en el medio de html. Luego tenemos el formulario, la accin del mismo es sobre el mismo archivo registrar.php, de esta forma podemos marcar en el momento si hubo algn 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 olvid de completar el campo de email, que no pierda los datos que complet anteriormente. Bueno, ya estamos listos para analizar el cdigo php. Primero incluimos nuestros dos archivos necesarios, config y conexion, y llamamos a la funcin conexion guardando el puntero en una variable. Una vez hecho esto, verificamos si se envi el formulario, para comenzar a registrar el usuario o slo mostrar el formulario. Guardamos cada campo completado por el usuario en una variable para poder mostrrsela 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, bastante sencillito no? por las dudas les dejo los archivos que utilizamos hoy:

87

TALLER DE PHP

Nuestro blog Ingreso y reconocimiento de usuarios


Bueno, la clase pasada vimos cmo nuestros usuarios se podan registrar en nuestro sitio, en la clase de hoy vamos a ver cmo van a poder iniciar sesin. Hay una cosita que me qued pendiente de la clase anterior y es explicar cmo es que hice la consulta para ingresar los datos del usuario a travs del sistema de registro. Si prestan atencin, en donde va la contrasea le agregu una funcin que se llama md5(), esta funcin lo que nos permite es mantener las contraseas encriptadas, de forma que ninguna persona pueda llegar a conocer jams la contrasea de un usuario. Es muy comn en los sitios serios utilizar este mtodo de encriptacin de contrasea. Una forma de verificar que esto se est utilizando en los sitios es con el proceso de recuperacin de la misma en caso de olvido. Si les envan su contrasea tal cual la escribieron es porque no se est encriptado, en cambio s les envan una nueva contrasea o la posibilidad de escribirla nuevamente, es muy probable que estn encriptndola. 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
1. 2. 3. 4. 5. 6. 7. function esUsuario ( $usuario, $password, $conexion ) {

// verifica que esten los dos campos completos.

if ($usuario=='' || $password=='') return false;

$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 ) { 15. return $row; 16. } else return false; 17. 18. } 19. 20. ?&gt;

// busqueda de los datos de usuarios para loguear.

88

TALLER DE PHP

Es una funcin a la que le pasaremos por parmetros el nombre de usuario, la contrasea (ya encriptada con md5) y el puntero de conexin. Bsicamente lo que buscamos con esta funcin es que nos devuelva un array con los datos del usuario en la base de datos en caso de que complete bien la informacin solicitada o FALSE en caso de que no exista o la contrasea no coincida. Lo primero que hacemos es verificar que tanto $usuario como $password no se encuentren vacos. Luego hacemos una consulta a la base de datos tratando de buscar toda la informacin del usuario correspondiente con $usuario. Luego de esto verificamos que la contrasea ingresada por parmetro $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, 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 ms adelante veremos la forma de crear una funcin que verifique esto. Slo hay que incluirlo en el proceso de registro, cuando estamos comprobando los errores. Bueno, ahora s, vamos a nuestro archivo ingresar.php

89

TALLER DE PHP

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.

// iniciamos sesiones session_start (); // archivos necesarios require_once 'admin/config.php'; require_once 'admin/conexion.php'; require_once 'admin/esUsuario.php'; // obtengo puntero de conexion con la db $dbConn = conectar(); // verificamos que no este conectado el usuario if ( !empty( $_SESSION['usuario'] ) &amp;&amp; !empty($_SESSION['password']) ) { if ( esUsuario( $_SESSION['usuario'], $_SESSION['password'] ) ) { header( 'Location: index.php' ); die; } } // si se envio el formulario if ( !empty($_POST['submit']) ) { // definimos las variables if ( !empty($_POST['usuario']) ) if ( !empty($_POST['password']) ) $usuario $password = $_POST['usuario']; = $_POST['password'];

// completamos la variable error si es necesario if ( empty($usuario) ) $error['usuario'] = 'Es obligatorio completar el nombre de usuario'; 29. if ( empty($password) ) $error['password'] = 'Es obligatorio completar la contrasea'; 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 contrasea no coinciden'; 46. } 47. 48. } 49. 50. } 51. 52. ?&gt; 53. <h1>Inicio de sesin</h1> 54. <ul> 55. <li></li> 56. </ul> 57. <form action="ingresar.php" method="post"><label for="usuario">Nombre de usuario</label> 58. 59. <input name="usuario" type="text" value="&lt;? if ( ! empty($usuario) ) echo $usuario; ?&gt;" /> 60. 61. <label for="password">Contrasea</label> 62. 63. <input name="password" type="password" value="&lt;? if ( ! empty($password) ) echo $password; ?&gt;" /> 64. 65. <input name="submit" type="submit" value="Ingresar" /> 66. 67. </form>

90

TALLER DE PHP

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 ms que nada. Vamos a ir explicndolo 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 ms el nuevo que creamos recin para verificar el usuario. Creamos el puntero a la base de datos y mediante un if verificamos que no estn vacos ni $_SESSION['usuario'] ni $_SESSION['password'], las sesiones estas todava no las creamos, pero lo haremos en caso de que se enve 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 sesin, lo que hacemos es verificar si no estn vacas ambas sesiones, en caso positivo, verificamos mediante la utilizacin de nuestra funcin esUsuario si pertenece a un usuario registrado, es decir si el usuario y contrasea coinciden. Nuevamente, en caso afirmativo redireccionamos al home de nuestro sitio, ya que no tendra 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 pgina 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 verificacin, 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. Fjense que en el segundo parmetro de la funcin nuevamente le estoy pasando md5() a $password, en este caso lo estoy haciendo porque en la base de datos ya tenemos la contrasea 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 funcin en esta misma pgina, no fue necesario pasarle md5 ya que la sesin la vamos a guardar encriptada tambin. Bueno, ya pas todos los chequeos el envo del formulario, ya verificamos que los datos ingresados por el usuario estn completos, correspondan a un usuario de la base de datos
91

TALLER DE PHP

y adems coinciden las contraseas de la db con las del post, es momento de crear las sesiones. Vamos a crear dos sesiones, una sesin que va a contener el nombre de usuario y otra con la contrasea encriptada. Luego de esto, redireccionamos al index.php, ya que un usuario logueado no tendra que por que seguir viendo el formulario de ingreso. Finalmente tenemos nuestra index.php modificada.

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. 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'] ) &amp;&amp; !empty($_SESSION['password']) ) { 21. $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); 22. } 23. 24. ?&gt; 25. <h1>Blog Personal</h1> 26. <div>El registro ha sido exitoso.</div> 27. <ul> 28. <li><a href="ingresar.php">Iniciar sesin</a></li> 29. <li><a href="registrar.php">Regstrate gratis</a></li> 30. </ul> 31. Bienvenido - <a href="index.php?salir=true">Salir</a> 32. <ul> 33. <li><a href="admin/index.php">Panel de administracin</a></li> 34. </ul>

92

TALLER DE PHP

Esta bastante ms completa ahora la index de nuestro sitio, veamos el codigo php. Iniciamos sesin, para ver si el usuario est conectado, agregamos los archivos requeridos y creamos el puntero de conexin. 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 sesin que tenga el usuario, para que lo "desloguee". Luego nos fijamos si tenemos sesiones, en caso de que estn, asignamos a $arrUsuario la funcin esUsuario(). Y eso es todo nuestro cdigo php. En el html agregamos tambin un par de if ms. El primero es un if verificando si existe el usuario, en caso de que sea un usuario sin iniciar sesin le mostramos el ingresar o registrarse. En caso de que sea un usuario conocido, le damos la bienvenida y la posibilidad de cerrar sesin. El "salir" nuevamente, es un enlace al index con la variable get salir = true. 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.

93

TALLER DE PHP

Nuestro blog - Sistema de noticias (I)


En la clase de hoy vamos a ver puntualmente un administrador de categoras para nuestro sitio. Vamos a necesitar las mismas para que las diferentes publicaciones de nuestro blog se puedan ubicar en diferentes categoras como pueden ser: editorial, talleres, noticias, etc. Para ello primero vamos a ver cmo hacer que el administrador del sitio sea nicamente para los usuarios con el tipo "admin" y luego veremos cmo hacer un ABM de categoras, 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 slo podrn acceder los administradores del sitio, y el cual contendr el men para actualizar nuestro sitio.

admin/index.php
1. 2. 3. 4. 5. 6. 7. 8. 9. 11. 12. // verificamos que no este conectado el usuario 13. if ( !empty( $_SESSION['usuario'] ) &amp;&amp; !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. ?&gt; 24. <h1>Blog Personal</h1> 25. Bienvenido 26. <ul> 27. <li><a href="categorias.php">Administrar Categoras</a></li> 28. </ul> - <a href="../index.php?salir=true">Salir</a>

// iniciamos session
session_start ();

// archivos necesarios
require_once 'config.php'; require_once 'conexion.php'; require_once 'esUsuario.php';

// obtengo puntero de conexion con la db

10. $dbConn = conectar();

94

TALLER DE PHP

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 conexin 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 vaco o no es un administrador, en caso de que esta condicin se cumpla, quiere decir que, o no estoy logueado o soy un usuario comn, por lo que no debera tener acceso a esta seccin, 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, ms abajo, en el html tenemos la bienvenida al usuario y el enlace con la opcin 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 categoras que es lo que vamos a empezar a ver hoy. Por el momento nuestro archivo de categoras va a tener lo siguiente:

admin/categorias.php
1. 2. 3. 4. 5. 6. 7. 8. 9. 11. 12. // verificamos que no este conectado el usuario 13. if ( !empty( $_SESSION['usuario'] ) &amp;&amp; !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'];

// iniciamos session
session_start ();

// archivos necesarios
require_once 'config.php'; require_once 'conexion.php'; require_once 'esUsuario.php';

// obtengo puntero de conexion con la db

10. $dbConn = conectar();

95

TALLER DE PHP
29. 30. // completamos la variable error si es necesario 31. if ( empty($nombre) ) categora'; 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 39. 40. header( 'Location: categorias.php?add=true' ); 41. die; 42. 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. ?&gt; 56. <h1>Blog Personal</h1> 57. Bienvenido - <a href="index.php">Panel de control</a> - <a href="../index.php?salir=true">Salir</a> 58. <h2>Categoras</h2> 59. <div style="border: 1px solid #ff8800; padding: 5px; background-color: #fdfdfd; width: 90%;">La categora se agreg con xito.</div> 60. <div> 61. <h3>Listado de Categoras</h3> 62. <table style="border: 1px solid #cccccc; padding: 5px; width: 90%;" border="0"> 63. <tbody> 64. <tr> 65. <th style="background-color:#cccccc;padding:5px;">id</th> 66. <th style="padding: 5px; width: 90%; background-color: #cccccc;">categora</th> 67. <th style="padding: 5px; background-color: #cccccc; width: 10%;"></th> 68. </tr> 69. <tr> 70. <td style="padding:5px;"></td> 71. <td style="padding:5px;"></td> 72. <td style="padding:5px;"><a href="categorias.php?id=&lt;? echo $categoria['idCategoria']; ?&gt;">Editar</a> - <a href="categorias.php?del=&lt;?= $categoria['idCategoria'] ?&gt;">Borrar</a></td> 73. </tr> 74. </tbody></table> 75. </div> 76. <div> 77. <h3 id="add">Agregar nueva categora</h3> 78. <form action="categorias.php" method="post"><label for="nombre">Nombre de la categora</label> 79. 80. <input name="nombre" type="text" /> <input name="submit" type="submit" value="Agregar" /> </form></div> = "INSERT INTO `categorias` (valor) VALUES ('$nombre')"; 38. $result = mysql_query($query, $dbConn); $error['nombre'] = 'Es obligatorio completar el nombre de la

96

TALLER DE PHP

Al igual que como vimos en el index del panel de admin, en este caso tambien verificamos que sea un administrador el usuario logueado, o si no redireccionamos al home del blog. Esta verificacin la vamos a tener a lo largo de todos nuestros archivos dentro del panel de admin. Luego tenemos la comprobacin de si se envi el formulario para agregar nuevas categoras a nuestro sitio. Las comprobaciones son muy similares a las que usamos en la registracin del usuario. Finalmente tenemos una consulta a la base de datos para mostrar todas las categoras existentes hasta el momento. Con array_push, que se encuentra dentro del while que va trayendo todos los resultados, vamos agregando los datos de la db en el array que se llama $arrCategorias. El mismo es recorrido dentro de la tabla que se encuentra en la parte del html para mostrar los resultados. Bueno, eso es todo por hoy, la clase que viene vemos como editar y borrar las categoras y les paso el adjunto de los archivos incluyendo el abm de categoras. Saludos.

97

TALLER DE PHP

Nuestro blog Sistema de noticias (II)


Hola! Hoy vamos a extender la clase anterior en la cual vimos cmo hacer las altas de categoras para nuestro sitio. En la clase de hoy vamos a ver cmo editar las categoras y como borrarlas. Para ello vamos a utilizar un nico archivo, admin/categorias.php, as es, ya lo tenemos creado, slo lo vamos a extender con algunos "if". Antes que nada, como vengo haciendo las ltimas clases, primero les muestro el archivo y despues explico lo que hago.
PLAIN TEXT
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. // obtengo puntero de conexion con la db 12. $dbConn = conectar(); 13. 14. // verificamos que no este conectado el usuario 15. if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { 16. 17. } 18. 19. // verificamos que sea un admin 20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' ) { 21. 22. 23. } 24. 25. // borramos una categoria 26. if ( !empty($_GET['del']) ) { 27. 28. 29. 30. 31. 32. 33. 34. } 35. 36. // agregamos una categoria en la db 37. // si se envio el formulario header( 'Location: categorias.php?dele=true' ); die; $query = "DELETE FROM `categorias` WHERE idCategoria = {$_GET['del']}"; $result = mysql_query($query, $dbConn); header( 'Location: ../index.php' ); die; $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); <?

// iniciamos session
session_start ();

// archivos necesarios
require_once 'config.php'; require_once 'conexion.php'; require_once 'esUsuario.php';

98

TALLER DE PHP
38. if ( !empty($_POST['submit']) ) { 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. } 59. 60. if ( !empty($_POST['submitEdit']) ) { 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. } 83. } header( 'Location: categorias.php?edit=true' ); die; } header( 'Location: categorias.php?add=true' ); die;

// definimos las variables


if ( !empty($_POST['nombre']) ) $nombre = $_POST['nombre'];

// completamos la variable error si es necesario


if ( empty($nombre) ) de la categor&iacute;a'; $error['nombre'] = 'Es obligatorio completar el nombre

// si no hay errores registramos al usuario


if ( empty($error) ) {

// inserto los datos de registro en la db


$query = "INSERT INTO `categorias` (valor) VALUES ('$nombre')"; $result = mysql_query($query, $dbConn);

// definimos las variables


if ( !empty($_POST['nombre']) ) if ( !empty($_POST['idCategoria']) ) $nombre $idCategoria = $_POST['nombre']; = $_POST['idCategoria'];

// completamos la variable error si es necesario


if ( empty($nombre) ) $error['nombre'] = 'Es obligatorio completar el = 'Falta la ID de la nombre de la categor&iacute;a'; if ( empty($idCategoria) ) categor&iacute;a'; $error['idCategoria']

// si no hay errores registramos al usuario


if ( empty($error) ) {

// inserto los datos de registro en la db


$query $idCategoria"; $result = mysql_query($query, $dbConn); = "UPDATE `categorias` set valor = '$nombre' WHERE idCategoria =

99

TALLER DE PHP
84. // traemos listado de categorias 85. $arrCategorias = array(); 86. $query = "SELECT idCategoria, valor FROM `categorias` ORDER BY valor ASC"; 87. $resultado = mysql_query ($query, $dbConn); 88. while ( $row = mysql_fetch_assoc ($resultado)) { 89. 90. } 91. 92. // si tenemos una categoria puntual 93. if ( !empty($_GET['id']) ) { 94. 95. 96. 97. 98. } 99. 100. 101. 102. 103. 104. /> 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. <h1>Blog Personal</h1> <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php">Panel <h2>Categor&iacute;as</h2> <? if ( !empty($_GET['add']) ) { ?> <div style="background-color: #fdfdfd;border:1px solid <body> <title>Blog Personal</title> </head> ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" array_push( $arrCategorias,$row );

// traemos una categoria


$query = "SELECT idCategoria, valor FROM `categorias` WHERE idCategoria = {$_GET['id']}"; $resultado = mysql_query ($query, $dbConn); $row = mysql_fetch_assoc ($resultado);

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

de control</a> - <a href="../index.php?salir=true">Salir</a></p>

#ff8800;width:90%;padding:5px">La categor&iacute;a se agreg&oacute; con &eacute;xito.</div> 115. 116. <? } elseif ( !empty($_GET['dele']) ) { ?> <div style="background-color: #fdfdfd;border:1px solid

#ff8800;width:90%;padding:5px">La categor&iacute;a ha sido borrada con &eacute;xito.</div> 117. 118. <? } elseif ( !empty($_GET['edit']) ) { ?> <div style="background-color: #fdfdfd;border:1px solid

#ff8800;width:90%;padding:5px">La categor&iacute;a ha sido editada con &eacute;xito.</div> 119. 120. 121. 122. 123. <div> <h3>Listado de Categor&iacute;as</h3> <? } ?>

100

TALLER DE PHP
124. 125. 126. 127. 128. 129. 130. 131. 132. ?></td> 133. ?></td> 134. <td style="padding:5px;"><a href="categorias.php?id=<? echo $categoria['idCategoria']; ?>">Editar</a> - <a href="categorias.php?del=<?= $categoria['idCategoria'] ?>">Borrar</a> 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. <? if ( !empty($_GET['id']) ) { ?> <div style="background-color:#ff8800;padding:5px; margin-top:10px;"> <h3 id="add">Editar categor&iacute;a</h3> <? if (!empty($error)) { ?> <? } ?> </div> </p> </form> </p> <p> <input name="submit" type="submit" value="Agregar" /> <p> <label for="nombre">Nombre de la <input name="nombre" type="text" value="" /> <? if ( empty($_GET['id']) ) { ?> <div> <h3 id="add">Agregar nueva categor&iacute;a</h3> <? if (!empty($error)) { ?> <ul> <? foreach ($error as $mensaje) { ?> <li><?= $mensaje ?></li> <? } ?> </ul> <? } ?> <form action="categorias.php" method="post"> </div> </tr> <? } ?> </table> <td style="padding:5px;"><? echo $categoria['valor']; <table style="width:90%;padding:5px;border:1px solid #cccccc"> <tr> <th style="background-color:#cccccc;padding:5px;">id</th> <th style="width:90%;background<th style="background</tr> <? foreach ($arrCategorias as $categoria) { ?> <tr> <td style="padding:5px;"><? echo $categoria['idCategoria'];

color:#cccccc;padding:5px;">categor&iacute;a</th> color:#cccccc;padding:5px;width:10%"></th>

categor&iacute;a</label><br />

101

TALLER DE PHP
167. 168. 169. 170. 171. 172. 173. 174. 175. 176. $row['valor']; ?>" /> 177. 178. 179. $row['idCategoria']; ?>" /> 180. 181. 182. 183. 184. 185. 186. 187. </body> </html> <? } ?> </div> </p> </form> <input name="submitEdit" type="submit" value="Editar" /> </p> <p> <input name="idCategoria" type="hidden" value="<? echo <ul> <? foreach ($error as $mensaje) { ?> <li><?= $mensaje ?></li> <? } ?> </ul> <? } ?> <form action="categorias.php" method="post"> <p> <label for="nombre">Nombre de la <input name="nombre" type="text" value="<? echo

categor&iacute;a</label><br />

Como podrn ver luego de nuestras comprobaciones de rutina, si estamos logueados, si somos administrador, etc, que hay un condicional preguntando si enviamos la variable del por get. Si esta condicin se cumple ejecutamos el query a la base de datos borrando la fila que le estamos pasando por get. Luego, tenemos nuestro submit de la nueva categora que vimos la clase anterior y a continuacin, nos fijamos si se envi otro post pero ahora es submitEdit, el cual va a llevar los datos para editar la categora. En caso de que estn todos los campos obligatorios, editamos la categora. Tango en la edicin como en el borrado, luego de realizar los cambios en la base de datos, redireccionamos a la misma pgina pero con una variable get que va a informar que la accin se realiz correctamente. Bueno, luego de la edicin tenemos la consulta para traer el listado de categoras y finalmente una nueva condicin preguntando si tenemos la variable get id, esta variable va a contener la id de la categora que queremos editar, para que podamos rellenar el formulario de edicin con los datos de la misma de la base de datos, por lo que, si se
102

TALLER DE PHP

cumple la condicin quiere decir que queremos editar una categora y hacemos la consulta para traer toda la informacin guardada en la db. Luego pasamos al html, tenemos varias condiciones tambin. La primera que encontramos es una que pregunta si tenemos la variable get add, o dele o edit, que son las que vamos a editar luego de realizar las acciones del ABM correctamente. En caso de tener una de ellas, mostramos el mensaje diciendo que la accin se realizo con xito. Luego de esto, mostramos el listado con las categoras, fjense que tenemos una columna al final que contiene dos enlaces, uno para editar la categora, y el otro para borrarla. Los dos enlaces apuntan a la misma pgina pero con diferentes variables get, dependiendo si tenemos esas variables es que vamos a realizar las acciones que expliqu ms arriba. Ojo, es muy comn al principio, cuando somos principiantes pisarnos las variables con nombres iguales, tienen que prestar mucha atencin de elegir variables con diferentes nombres a lo largo de todo nuestro script, en este caso el archivo admin/categorias.php. A continuacin tenemos dos condiciones nuevas ms (la condicin que pregunta si hay errores no cuenta, ya la expliqu la clase anterior :p), una que pregunta si esta vaca la variable get ID, en cuyo caso mostramos el formulario para agregar una nueva categora, y la siguiente condicin es si NO esta vaca, entonces mostramos el formulario de edicin. Presten atencin que en el formulario de edicin agregamos un campo input hidden con la id de la categora que queremos editar. Esta va a ser necesaria para poder hacer el UPDATE en la base de datos.

103

TALLER DE PHP

Nuestro blog Sistema de noticias (III)


Hola, antes que nada pido disculpas por no haber podido hacer el taller estas ltimas dos semanas. Estuve con mucho trabajo en un proyecto importante y no he podido hacerme un tiempito para escribir ac. En la clase de hoy vamos a ver cmo dar de alta noticias y mostrarlas en la home. Una particularidad a diferencia del alta de las categoras es que ahora para dar de alta una noticia, tambin vamos a necesitar de la tabla de categoras y la de usuarios, por lo que ya empezamos a interactuar entre las diferentes tablas. Antes de continuar, tengo que hacer una correccin a la base de datos, cuando la creamos en la tabla de noticias le pusimos al campo fPublicacion, la propiedad "ON UPDATE CURRENT_TIMESTAMP" y lo mismo para el valor por defecto "CURRENT_TIMESTAMP", bueno, esto en realidad va en el campo fModificacion, fPublicacion tiene que quedar exactamente igual que fCreado. Bueno, hecha esta salvedad, vamos a lo nuestro. En la clase de hoy vamos a tocar tres archivos index.php, admin/index.php y un nuevo archivo admin/noticias.php. Arranquemos por el archivo admin/index.php. Lo nico que le hacemos a este archivo es agregar el enlace a nuestro administrador de noticias, osea admin/noticias.php
PLAIN TEXT
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. // obtengo puntero de conexion con la db 12. $dbConn = conectar(); 13. 14. // verificamos que no este conectado el usuario 15. if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { 16. 17. } 18. 19. // verificamos que sea un admin 20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' ) { 21. header( 'Location: ../index.php' ); $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); <?

// iniciamos session
session_start ();

// archivos necesarios
require_once 'config.php'; require_once 'conexion.php'; require_once 'esUsuario.php';

104

TALLER DE PHP
22. 23. } 24. 25. ?> 26. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 27. <html xmlns="http://www.w3.org/1999/xhtml"> 28. <head> 29. 30. 32. 33. <body> 34. 35. 36. 37. 38. 39. 40. 41. 42. </body> 43. </html> <h1>Blog Personal</h1> <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="../index.php?salir=true">Salir</a></p> <ul> <li><a href="categorias.php">Administrar Categor&iacute;as</a></li> <li><a href="noticias.php">Administrar Noticias</a></li> </ul> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Blog Personal</title> die;

31. </head>

Ahora s, pego el cdigo de admin/noticias.php y lo paso a explicar


PLAIN TEXT
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. // obtengo puntero de conexion con la db 12. $dbConn = conectar(); 13. 14. // verificamos que no este conectado el usuario 15. if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { 16. 17. } 18. 19. // verificamos que sea un admin 20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' ) { 21. header( 'Location: ../index.php' ); $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); <?

// iniciamos session
session_start ();

// archivos necesarios
require_once 'config.php'; require_once 'conexion.php'; require_once 'esUsuario.php';

105

TALLER DE PHP
22. 23. } 24. 25. // agregamos una categoria en la db 26. // si se envio el formulario 27. if ( !empty($_POST['submit']) ) { 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. die;

// definimos las variables


if ( !empty($_POST['titulo']) ) if ( !empty($_POST['copete']) ) if ( !empty($_POST['cuerpo']) ) if ( !empty($_POST['idCategoria']) ) if ( !empty($_POST['fPublicacion']) ) $_POST['fPublicacion']; $titulo $copete $cuerpo $idCategoria $fPublicacion = $_POST['titulo']; = $_POST['copete']; = $_POST['cuerpo']; = $_POST['idCategoria']; =

// completamos la variable error si es necesario


if ( empty($titulo) ) if ( empty($copete) ) la noticia'; if ( empty($cuerpo) ) la noticia'; if ( empty($idCategoria) ) $error['idCategoria'] = 'Es obligatorio seleccionar una categor&iacute;a para la noticia'; $error['cuerpo'] = 'Es obligatorio completar el cuerpo de $error['titulo'] $error['copete'] = 'Es obligatorio completar el = 'Es obligatorio completar el copete de t&iacute;tulo de la noticia';

// si no hay errores registramos al usuario


if ( empty($error) ) {

// inserto los datos de registro en la db


$fCreacion = date("Y-m-d H:i:s"); $fModificacion = date("Y-m-d H:i:s"); if ( empty($fPublicacion) ) $fPublicacion = date("Y-m-d H:i:s"); $idUsuario = $arrUsuario['idUsuario']; $query = "INSERT INTO `noticias` (titulo,copete,cuerpo,idCategoria,idUsuario,fCreacion,fModificacion,fPublicacion) VALUES ('$titulo','$copete','$cuerpo','$idCategoria','$idUsuario','$fCreacion','$fModificacion', '$fPublicacion')";

51. 52. 53. 54. 55. 56. 57. } 58. }

$result = mysql_query($query, $dbConn); header( 'Location: noticias.php?add=true' ); die;

59. // traemos listado de categorias 60. $arrCategorias = array(); 61. $query = "SELECT idCategoria, valor FROM `categorias` ORDER BY valor ASC"; 62. $resultado = mysql_query ($query, $dbConn); 63. while ( $row = mysql_fetch_assoc ($resultado)) { 64. 65. } 66. 67. // traemos listado de noticias array_push( $arrCategorias,$row );

106

TALLER DE PHP
68. $arrNoticias = array(); 69. $query = "SELECT idNoticia, titulo FROM `noticias` ORDER BY idNoticia DESC"; 70. $resultado = mysql_query ($query, $dbConn); 71. while ( $row = mysql_fetch_assoc ($resultado)) { 72. 73. } 74. ?> 75. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 76. <html xmlns="http://www.w3.org/1999/xhtml"> 77. <head> 78. 79. 81. 82. <body> 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. <div> <h3>Listado de Noticias</h3> <table style="width:90%;padding:5px;border:1px solid #cccccc"> <tr> <th style="background-color:#cccccc;padding:5px;">id</th> <th style="width:90%;backgroundcolor:#cccccc;padding:5px;">t&iacute;tulo</th> <th style="background-color:#cccccc;padding:5px;width:10%"></th> </tr> <? foreach ($arrNoticias as $noticias) { ?> <tr> <td style="padding:5px;"><? echo $noticias['idNoticia']; ?></td> <td style="padding:5px;"><? echo $noticias['titulo']; ?></td> <td style="padding:5px;"><a href="noticias.php?id=<? echo <h1>Blog Personal</h1> <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php">Panel de control</a> - <a href="../index.php?salir=true">Salir</a></p> <h2>Noticias</h2> <? if ( !empty($_GET['add']) ) { ?> <div style="background-color: #fdfdfd;border:1px solid #ff8800;width:90%;padding:5px">La noticia se agreg&oacute; con &eacute;xito.</div> <? } ?> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Blog Personal</title> array_push( $arrNoticias,$row );

80. </head>

$noticias['idNoticia']; ?>">Editar</a> - <a href="noticias.php?del=<?= $categoria['idNoticia'] ?>">Borrar</a> 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. <? if ( empty($_GET['id']) ) { ?> <div> <h3 id="add">Agregar nueva noticia</h3> <? if (!empty($error)) { ?> <ul> <? foreach ($error as $mensaje) { ?> <li><?= $mensaje ?></li> </div> </tr> <? } ?> </table>

107

TALLER DE PHP
116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. </body> </html> <? } ?> </div> </form> <p> <input name="submit" type="submit" value="Agregar" /> </p> <p> <label for="cuerpo">Cuerpo</label><br /> <textarea rows="10" cols="50" name="cuerpo"></textarea> </p> <p> <label for="copete">Copete</label><br /> <textarea rows="5" cols="50" name="copete"></textarea> </p> <p> <label for="fPublicacion">Fecha de publicacion (aaaa-mm-dd <input name="fPublicacion" type="text" value="" /> </p> </p> <p> <label for="idCategoria">Categora</label><br /> <select name="idCategoria"> <option value="">Seleccione una categora</option> <option value="">------------------------</option> <? foreach ( $arrCategorias as $categoria ) { ?> <option value="<? echo $categoria['idCategoria']; ?>"><? <? } ?> </select> <p> <label for="titulo">T&iacute;tulo de la noticia</label><br /> <input name="titulo" type="text" value="" /> </p> <? } ?> </ul> <? } ?> <form action="noticias.php" method="post">

echo $categoria['valor']; ?></option>

hh:mm:ss) Ej: 2008-10-29 17:20:00 </label><br />

108

TALLER DE PHP

Van a notar que no es muy diferente al administrador de categorias. Igual vamos por partes: Lo primero que cambia obviamente es la cantidad de variables post que debemos ver si existen y que son obligatorias. Luego, como segunda opcin si es que no tenemos errores, debemos crear algunas variables que vamos a necesitar para guardar en la base de datos: las tres de fecha. Para fCreacion y fModificacion no vamos a tener ningn problema ya que como estamos creando la noticia van a tener ambas date(), y para fPublicacion debemos verificar si se completo el campo o no, en caso de que se dej vaca, la fecha de publicacin es la misma que las otras dos, caso contrario, rellenamos con el post. Otra variable que tenemos que crear es la idUsuario, para ello usamos nuestro array con los datos del usuario logueado para asignarle a la noticia el autor logueado. Por ltimo en la parte de php vamos a ver como diferencia que ahora no slo traemos todas las noticias para mostrar sino que tambin traemos todas las categoras. Esto es as porque usaremos el listado de categoras para elegir la categora de cada noticia. Si prestamos atencin a la parte del formulario, vamos a ver cmo ahora tenemos un SELECT BOX con un FOREACH que va a recorrer todas las categoras y le va a asignar un value a cada OPTION con la id de la misma, ese valor es el que vamos a recibir por POST y agregar en la noticia en la base de datos. Fuera de eso no hay ninguna otra diferencia con las altas de categoras.

109

TALLER DE PHP

Finalmente vamos a modificar nuestra home para mostrar las noticias que vamos agregando.
PLAIN TEXT
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. // obtengo puntero de conexion con la db 12. $dbConn = conectar(); 13. 14. // vemos si el usuario quiere desloguar 15. if ( !empty($_GET['salir']) ) { 16. 17. 18. 19. } 20. 21. // verificamos que no este conectado el usuario 22. if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { 23. ); 24. } 25. 26. // listado de noticias 27. // traemos listado de noticias 28. $arrNoticias = array(); 29. $query = "SELECT idNoticia, titulo, copete FROM `noticias` WHERE fPublicacion <'".date('Y-m-d H:i:s')."' ORDER BY fPublicacion DESC"; 30. $resultado = mysql_query ($query, $dbConn); 31. while ( $row = mysql_fetch_assoc ($resultado)) { 32. 33. } 34. 35. 36. ?> 37. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 38. <html xmlns="http://www.w3.org/1999/xhtml"> 39. <head> 40. 41. 43. 44. <body> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Blog Personal</title> array_push( $arrNoticias,$row ); $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn <?

// iniciamos session
session_start ();

// archivos necesarios
require_once 'admin/config.php'; require_once 'admin/conexion.php'; require_once 'admin/esUsuario.php';

// borramos y destruimos todo tipo de sesion del usuario


session_unset(); session_destroy();

42. </head>

110

TALLER DE PHP
45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. <h2>Noticias</h2> <? foreach ( $arrNoticias as $noticias ) { ?> <div> <h3><a href="vernoticia.php?idNoticia=<? echo $noticias['idNoticia']; ?>"><? echo $noticias['titulo']; ?></a></h3> <p><? echo $noticias['copete']; ?></p> </div> <? } ?> <? if ( empty($arrUsuario['usuario']) ) { ?> <ul> <li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li> <li><a href="registrar.php">Reg&iacute;strate gratis</a></li> </ul> <? } else { ?> <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php?salir=true">Salir</a></p> <? if ( $arrUsuario['tipo'] == 'admin' ) { ?> <ul> <li><a href="admin/index.php">Panel de administraci&oacute;n</a></li> </ul> <? } ?> <? } ?> <? if ( !empty($_GET['registro']) ) { ?> <div>El registro ha sido exitoso.</div> <? } ?> <h1>Blog Personal</h1>

73. </body> 74. </html>

Lo ms 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 slo 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 pgina, la misma va a tener la noticia completa. Bueno, eso es todo por hoy, la semana que viene vamos a ver cmo editar y borrar las noticias y veremos tambien como se ve la noticia completa para los visitantes a nuestro sitio.

111

TALLER DE PHP

Nuestro blog Sistema de noticias (IV)


Hola, ac estamos de nuevo con el taller de PHP. En el da de hoy vamos a ver cmo editar una noticia y cmo borrarla. Si vienen siguiendo el taller ms o menos al da vern que no hay grandes diferencias con respecto a las modificaciones y bajas de las categoras. Pero bueno, no nos adelantemos y vamos a lo nuestro. Trabajaremos hoy nicamente sobre el archivo admin/noticias.php.
PLAIN TEXT
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. // obtengo puntero de conexion con la db 12. $dbConn = conectar(); 13. 14. // verificamos que no este conectado el usuario 15. if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { 16. 17. } 18. 19. // verificamos que sea un admin 20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' ) { 21. 22. 23. } 24. 25. // borramos una noticia si obtenemos la variable GET del 26. if ( !empty($_GET['del']) ) { 27. 28. 29. 30. 31. 32. 33. 34. } 35. header( 'Location: noticias.php?dele=true' ); die; $query = "DELETE FROM `noticias` WHERE idNoticia = {$_GET['del']}"; $result = mysql_query($query, $dbConn); header( 'Location: ../index.php' ); die; $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); <?

// iniciamos session
session_start ();

// archivos necesarios
require_once 'config.php'; require_once 'conexion.php'; require_once 'esUsuario.php';

112

TALLER DE PHP
36. // agregamos una noticia en la db 37. // si se envio el formulario 38. if ( !empty($_POST['submit']) ) { 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. VALUES ('$titulo','$copete','$cuerpo','$idCategoria','$idUsuario','$fCreacion','$fModificac ion','$fPublicacion')"; 62. 63. 64. 65. 66. 67. 68. } 69. 70. // si se envio el formulario de edicion 71. if ( !empty($_POST['submitEdit']) ) { 72. 73. 74. 75. 76. } $result = mysql_query($query, $dbConn); header( 'Location: noticias.php?add=true' ); die;

// definimos las variables


if ( !empty($_POST['titulo']) ) if ( !empty($_POST['copete']) ) if ( !empty($_POST['cuerpo']) ) if ( !empty($_POST['idCategoria']) ) if ( !empty($_POST['fPublicacion']) ) $_POST['fPublicacion']; $titulo $copete $cuerpo $idCategoria $fPublicacion = $_POST['titulo']; = $_POST['copete']; = $_POST['cuerpo']; = $_POST['idCategoria']; =

// completamos la variable error si es necesario


if ( empty($titulo) ) if ( empty($copete) ) de la noticia'; if ( empty($cuerpo) ) de la noticia'; if ( empty($idCategoria) ) $error['idCategoria'] = 'Es obligatorio seleccionar una categor&iacute;a para la noticia'; $error['cuerpo'] = 'Es obligatorio completar el cuerpo $error['titulo'] $error['copete'] = 'Es obligatorio completar el = 'Es obligatorio completar el copete t&iacute;tulo de la noticia';

// si no hay errores registramos al usuario


if ( empty($error) ) {

// inserto los datos de registro en la db


$fCreacion = date("Y-m-d H:i:s"); $fModificacion = date("Y-m-d H:i:s"); if ( empty($fPublicacion) ) $fPublicacion = date("Y-m-d H:i:s"); $idUsuario = $arrUsuario['idUsuario']; $query = "INSERT INTO `noticias` (titulo,copete,cuerpo,idCategoria,idUsuario,fCreacion,fModificacion,fPublicacion)

// definimos las variables


if ( !empty($_POST['idNoticia']) ) if ( !empty($_POST['titulo']) ) if ( !empty($_POST['copete']) ) $idNoticia $titulo $copete = $_POST['idNoticia']; = $_POST['titulo']; = $_POST['copete'];

113

TALLER DE PHP
77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. if ( !empty($_POST['cuerpo']) ) if ( !empty($_POST['idCategoria']) ) if ( !empty($_POST['fPublicacion']) ) $_POST['fPublicacion']; $cuerpo $idCategoria $fPublicacion = $_POST['cuerpo']; = $_POST['idCategoria']; =

// completamos la variable error si es necesario


if ( empty($idNoticia) ) if ( empty($titulo) ) t&iacute;tulo de la noticia'; if ( empty($copete) ) copete de la noticia'; if ( empty($cuerpo) ) cuerpo de la noticia'; if ( empty($idCategoria) ) $error['idCategoria'] = 'Es obligatorio seleccionar una categor&iacute;a para la noticia'; $error['cuerpo'] = 'Es obligatorio completar el $error['copete'] = 'Es obligatorio completar el $error['idNoticia'] $error['titulo'] = 'Es obligatorio tener la id de la noticia que se desea modificar'; = 'Es obligatorio completar el

// si no hay errores editamos la noticia


if ( empty($error) ) {

// actualizamos la fecha de modificacion y de publicacion


$fModificacion = date("Y-m-d H:i:s"); if ( empty($fPublicacion) ) $fPublicacion = date("Y-m-d H:i:s"); $idUsuario = $arrUsuario['idUsuario'];

// inserto los datos de registro en la db


$query = "UPDATE `noticias` set titulo = '$titulo', copete = '$copete', cuerpo = '$cuerpo', idCategoria = $idCategoria, idUsuario = $idUsuario, fModificacion = '$fModificacion', fPublicacion = '$fPublicacion' WHERE idNoticia = $idNoticia";

99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117.

$result = mysql_query($query, $dbConn); header( 'Location: noticias.php?edit=true' ); die; } }

// traemos listado de categorias


$arrCategorias = array(); $query = "SELECT idCategoria, valor FROM `categorias` ORDER BY valor ASC"; $resultado = mysql_query ($query, $dbConn); while ( $row = mysql_fetch_assoc ($resultado)) { array_push( $arrCategorias,$row ); }

// traemos listado de noticias


$arrNoticias = array();

114

TALLER DE PHP
118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. /> 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. <div> <h3>Listado de Noticias</h3> <table style="width:90%;padding:5px;border:1px solid #cccccc"> <tr> <th style="background-color:#cccccc;padding:5px;">id</th> <th style="width:90%;background<h1>Blog Personal</h1> <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php">Panel <h2>Noticias</h2> <? if ( !empty($_GET['add']) ) { ?> <div style="background-color: #fdfdfd;border:1px solid <? } elseif ( !empty($_GET['dele']) ) { ?> <div style="background-color: #fdfdfd;border:1px solid <? } elseif ( !empty($_GET['edit']) ) { ?> <div style="background-color: #fdfdfd;border:1px solid <? } ?> <body> <title>Blog Personal</title> </head> ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" } } $query = "SELECT idNoticia, titulo FROM `noticias` ORDER BY idNoticia DESC"; $resultado = mysql_query ($query, $dbConn); while ( $row = mysql_fetch_assoc ($resultado)) { array_push( $arrNoticias,$row );

// si tenemos una categoria puntual


if ( !empty($_GET['id']) ) {

// traemos una categoria


$query = "SELECT idNoticia, titulo, copete, cuerpo, idCategoria, $resultado = mysql_query ($query, $dbConn); $row = mysql_fetch_assoc ($resultado);

fPublicacion FROM `noticias` WHERE idNoticia = {$_GET['id']}";

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

de control</a> - <a href="../index.php?salir=true">Salir</a></p>

#ff8800;width:90%;padding:5px">La noticia se agreg&oacute; con &eacute;xito.</div>

#ff8800;width:90%;padding:5px">La noticia ha sido borrada con &eacute;xito.</div>

#ff8800;width:90%;padding:5px">La noticia ha sido editada con &eacute;xito.</div>

color:#cccccc;padding:5px;">t&iacute;tulo</th>

115

TALLER DE PHP
160. 161. 162. 163. 164. ?></td> 165. ?></td> 166. <td style="padding:5px;"><a href="noticias.php?id=<? echo $noticias['idNoticia']; ?>">Editar</a> - <a href="noticias.php?del=<?= $noticias['idNoticia'] ?>">Borrar</a> 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. noticia</label><br /> 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. </p> </p> <p> <label for="fPublicacion">Fecha de publicacion (aaaa-mm<input name="fPublicacion" type="text" value="" /> </p> <p> <label for="idCategoria">Categora</label><br /> <select name="idCategoria"> <option value="">Seleccione una categora</option> <option value="">------------------------</option> <? foreach ( $arrCategorias as $categoria ) { ?> <option value="<? echo $categoria['idCategoria']; <? } ?> </select> <input name="titulo" type="text" value="" /> <p> <label for="titulo">T&iacute;tulo de la <? if ( empty($_GET['id']) ) { ?> <div> <h3 id="add">Agregar nueva noticia</h3> <? if (!empty($error)) { ?> <ul> <? foreach ($error as $mensaje) { ?> <li><?= $mensaje ?></li> <? } ?> </ul> <? } ?> <form action="noticias.php" method="post"> </div> </tr> <? } ?> </table> <td style="padding:5px;"><? echo $noticias['titulo']; <th style="background</tr> <? foreach ($arrNoticias as $noticias) { ?> <tr> <td style="padding:5px;"><? echo $noticias['idNoticia'];

color:#cccccc;padding:5px;width:10%"></th>

?>"><? echo $categoria['valor']; ?></option>

dd hh:mm:ss) Ej: 2008-10-29 17:20:00 </label><br />

116

TALLER DE PHP
202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. noticia</label><br /> 230. $row['titulo']; ?>" /> 231. 232. 233. 234. 235. 236. 237. 238. </p> <p> <label for="idCategoria">Categora</label><br /> <select name="idCategoria"> <option value="">Seleccione una categora</option> <option value="">------------------------</option> <? foreach ( $arrCategorias as $categoria ) { ?> <option value="<? echo $categoria['idCategoria']; <input name="titulo" type="text" value="<? echo <? if ( !empty($_GET['id']) ) { ?> <div style="background-color:#ff8800;padding:5px; margin-top:10px;"> <h3 id="add">Editar noticia</h3> <? if (!empty($error)) { ?> <ul> <? foreach ($error as $mensaje) { ?> <li><?= $mensaje ?></li> <? } ?> </ul> <? } ?> <form action="noticias.php" method="post"> <p> <label for="titulo">T&iacute;tulo de la <? } ?> </div> </p> </form> </p> <p> <input name="submit" type="submit" value="Agregar" /> </p> <p> <label for="cuerpo">Cuerpo</label><br /> <textarea rows="10" cols="50" name="cuerpo"></textarea> <p> <label for="copete">Copete</label><br /> <textarea rows="5" cols="50" name="copete"></textarea>

?>" <? if ( $categoria['idCategoria'] == $row['idCategoria'] ) echo 'selected="selected"' ?>><? echo $categoria['valor']; ?></option> 239. 240. 241. 242. 243. 244. 245. </p> </p> <p> <label for="fPublicacion">Fecha de publicacion (aaaa-mm<input name="fPublicacion" type="text" value="<? echo <? } ?> </select>

dd hh:mm:ss) Ej: 2008-10-29 17:20:00 </label><br /> $row['fPublicacion']; ?>" />

117

TALLER DE PHP
246. 247. 248. 249. 250. 251. 252. 253. 254. 255. $row['idNoticia']; ?>" /> 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. </body> </html> <? } ?> </form> </div> </p> <input name="submitEdit" type="submit" value="Editar" /> </p> <p> <input name="idNoticia" type="hidden" value="<? echo </p> <p> <label for="cuerpo">Cuerpo</label><br /> <textarea rows="10" cols="50" name="cuerpo"><? echo <p> <label for="copete">Copete</label><br /> <textarea rows="5" cols="50" name="copete"><? echo

$row['copete']; ?></textarea>

$row['cuerpo']; ?></textarea>

Fjense que al archivo que tenamos la semana pasada le agregamos algunas condiciones extras, como ser si se tiene una id de borrado, borramos la linea de la base de datos. Y lo mismo si se tiene la variable post de edicin, verificamos que estn todos los datos obligatorios y editamos. En la parte del html lo mismo, la nica gran diferencia con respecto a la edicin de categoras es que ahora tenemos un "selectbox" que hay que seleccionar. En realidad no tiene gran ciencia, al foreach que usamos para rellenar el selectbox le agregamos una nueva condicin, preguntando si la id de la categora que le corresponde coincide con la id de categora que posee la noticia, en caso verdadero, vamos a imprimir un select="select" para que al editar la noticia no perdamos ese dato. Bueno, bastante sencilla la clase de hoy, pero sirve para ir afianzando los conocimientos. Hasta la semana que viene.

118

TALLER DE PHP

Nuestro blog Sistema de comentarios (I)


Hola, mis alumnitos! Como pasaron la semana? En la clase de hoy vamos a ver como los usuarios registrados pueden dejar comentarios en nuestras noticias. Para ello vamos a tener que crear primero la pagina donde se vera la noticia completa, la dificultad que tendr esto es que vamos a tener que hacer un join con dos tablas, la de categoras y la de usuarios. Como en todas nuestras clases del blog primero voy a mostrar el cdigo y despus lo voy a pasar a explicar.
PLAIN TEXT
1. <? 2. 3. // iniciamos session 4. session_start (); 5. 6. // archivos necesarios 7. require_once 'admin/config.php'; 8. require_once 'admin/conexion.php'; 9. require_once 'admin/esUsuario.php'; 10. 11. // obtengo puntero de conexion con la db 12. $dbConn = conectar(); 13. 14. // verificamos que este conectado el usuario 15. if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { 16. $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); 17. } 18. 19. if ( !empty($_POST['submit']) ) { 20. 21. if ( !empty($_POST['comentario']) ) $comentario = $_POST['comentario']; 22. if ( !empty($_GET['idNoticia']) ) $idNoticia = $_GET['idNoticia']; 23. if ( !empty($arrUsuario['idUsuario'])) $idUsuario = $arrUsuario['idUsuario']; 24. 25. // completamos la variable error si es necesario 26. if ( empty($comentario) ) $error['comentario'] = true; 27. if ( empty($idNoticia) ) $error['idNoticia'] = true; 28. if ( empty($idUsuario) ) $error['idUsuario'] = true; 29. 30. // si no hay errores registramos al usuario 31. if ( empty($error) ) { 32. 33. // inserto los datos de registro en la db 34. $query = "INSERT INTO `comentarios` (comentario, idUsuario, idNoticia) VALUES ('$comentario','$idUsuario','$idNoticia')"; 35. $result = mysql_query($query, $dbConn); 36. 37. header( 'Location: vernoticia.php?idNoticia='.$idNoticia ); 38. die; 39. 40. } 41. 42. } 43.

119

TALLER DE PHP
44. // traemos la noticia 45. $query = "SELECT noticias.idNoticia, noticias.titulo, noticias.copete, noticias.cuerpo, categorias.valor as categoria, usuarios.usuario FROM `noticias` 46. INNER JOIN `categorias` ON categorias.idCategoria = noticias.idCategoria 47. INNER JOIN `usuarios` ON usuarios.idUsuario = noticias.idUsuario 48. WHERE noticias.idNoticia = " . $_GET['idNoticia'] . " LIMIT 1"; 49. $resultado = mysql_query ($query, $dbConn); 50. $noticia = mysql_fetch_assoc ($resultado); 51. 52. ?> 53. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 54. <html xmlns="http://www.w3.org/1999/xhtml"> 55. <head> 56. <meta http-equiv="Content-Type" content="text/html; charset=iso-88591" /> 57. <title>Blog Personal</title> 58. </head> 59. 60. <body> 61. 62. <h1>Blog Personal</h1> 63. 64. <? if ( empty($arrUsuario['usuario']) ) { ?> 65. <ul> 66. <li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li> 67. <li><a href="registrar.php">Reg&iacute;strate gratis</a></li> 68. </ul> 69. <? } else { ?> 70. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php?salir=true">Salir</a></p> 71. <? if ( $arrUsuario['tipo'] == 'admin' ) { ?> 72. <ul> 73. <li><a href="admin/index.php">Panel de administraci&oacute;n</a></li> 74. </ul> 75. <? } ?> 76. <? } ?> 77. 78. <h2><?php echo $noticia['titulo']; ?></h2> 79. <p>Publicado por <b><?php echo $noticia['usuario']; ?></b> en <i><?php echo $noticia['categoria']; ?></i></p> 80. <div><?php echo $noticia['cuerpo']; ?></div> 81. 82. <div> 83. <?php if ( !empty( $arrUsuario ) ) { ?> 84. 85. <form action="vernoticia.php?idNoticia=<?php echo $_GET['idNoticia']; ?>" method="post"> 86. <p> 87. <label for="comentario">Dejar un comentario</label><br /> 88. <textarea rows="3" cols="50" name="comentario"></textarea> 89. </p> 90. <p> 91. <input name="submit" type="submit" value="Enviar" /> 92. </p> 93. </form> 94. 95. <?php } else { ?> 96. <p>Para dejar un comentario hay que ser un usuario registrado. <a href="registrar.php">Registrar</a> o <a href="ingresar.php">Ingresar</a></p> 97. <?php } ?> 98. </div> 99. </body> 100. </html>

120

TALLER DE PHP

Que cosas nuevas tenemos ac? Con lo primero que nos encontramos es con una verificacin si se envi un post, esto es si nos dejaron un comentario, para guardarlo en la base de datos. Por el momento estos comentarios no los vamos a mostrar, ya que los tiene que revisar primero un administrador, para evitar que nos dejen spam, insultos u otras cosas desagradables :). Dentro del submit verificamos 3 cosas, que contenga texto, que sea de un usuario registrado y que este la id de noticia a la que hace referencia el comentario. Fjense que para esta ultima el valor de la id la estamos pasando por GET, no por POST. Por otro lado, como no va a hacer falta mostrar el error a los usuarios en caso de que falle, simplemente dejamos la variable de error con un TRUE si es que existe. Recuerden que en las clases anteriores le ponamos un STRING con el error a mostrar. Bueno, si no tiene errores, hacemos el insert en la base de datos. A continuacin tenemos la consulta para traer la noticia, esta consulta es bastante ms compleja que las que venamos usando, ya que hace dos JOINS, uno con la tabla de categoras y otro con la tabla de usuarios. De esta forma, en una sola consulta obtenemos el nombre de la categora y el nombre de usuario. Recuerden que en la tabla de noticias solo guardbamos las id de ambos. Esto nos permite estar siempre actualizados en caso de que cambiemos el nombre de usuario o nombre de la categora desde el panel de admin. Por ultimo dentro de lo que seria el "template", osea la parte de html, vamos a tener un if que nos va a mostrar el formulario para dejar un comentario o nos va a mandar a registrarnos. Bueno, eso es todo por hoy, la clase que viene veremos cmo mostrar el listado de comentarios aprobados por un admin en esta misma pgina, y el panel de admin para aprobar o borrarlos. Buena semana.

121

TALLER DE PHP

Nuestro blog Sistema de comentarios (II)


Hola, ya queda poquito para nuestro blogsito, obviamente que despus les va a faltar diseo pero bueno, eso ya le corresponde al taller de Dreamweaver y Photoshop. En la clase de hoy vamos a ver como moderar los comentarios que hemos recibido, para ello agregaremos la opcin en el administrador y luego agregaremos los comentarios aprobados en la pgina de la nota comentada. Los archivos que tocaremos hoy son admin/comentarios.php (nuevo), admin/index.php y vernoticia.php A admin/index.php slo le vamos a agregar el enlace a admin/comentarios.php para que se pueda acceder desde el menu de administracin. Veamos este ltimo archivo (el de comentarios.php)

admin/comentarios.php
PLAIN TEXT
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. <?

// iniciamos session
session_start ();

// archivos necesarios
require_once 'config.php'; require_once 'conexion.php'; require_once 'esUsuario.php';

// obtengo puntero de conexion con la db


$dbConn = conectar();

// verificamos que no este conectado el usuario

if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); }

// verificamos que sea un admin

if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' ) { header( 'Location: ../index.php' ); die; }

// borramos un comentario

if ( !empty($_GET['del']) ) { $query = "DELETE FROM `comentarios` WHERE idComentario = {$_GET['del']}"; $result = mysql_query($query, $dbConn); header( 'Location: comentarios.php?dele=true' ); die; }

// aprobamos un comentario
if ( !empty($_GET['apr']) ) { $query = "UPDATE `comentarios` set estado = 'apto' WHERE idComentario = {$_GET['apr']}"; $result = mysql_query($query, $dbConn); header( 'Location: comentarios.php?aprobar=true' ); die; }

// editamos el comentario

if ( !empty($_POST['submitEdit']) ) {

// definimos las variables

if ( !empty($_POST['comentario']) )

$comentario

= $_POST['comentario'];

122

TALLER DE PHP
52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. if ( !empty($_POST['idComentario']) ) if ( empty($comentario) ) if ( empty($idComentario) ) comentario'; if ( empty($error) ) { $idComentario = $_POST['idComentario'];

// completamos la variable error si es necesario


$error['comentario'] = 'Es obligatorio tener un cuerpo'; $error['idComentario'] = 'Es obligatoria la id de

// si no hay errores registramos al usuario // inserto los datos de registro en la db

$query = "UPDATE `comentarios` set comentario = '$comentario' WHERE idComentario = $idComentario"; 63. $result = mysql_query($query, $dbConn); 64. 65. header( 'Location: comentarios.php?edit=true' ); 66. die; 67. 68. } 69. 70. } 71. 72. // traemos listado de comentarios sin aprboar 73. $arrComentarios = array(); 74. $query = "SELECT comentarios.idComentario, comentarios.comentario, comentarios.idNoticia, usuarios.usuario, noticias.titulo 75. FROM `comentarios` 76. INNER JOIN `usuarios` ON comentarios.idUsuario = usuarios.idUsuario 77. INNER JOIN `noticias` ON comentarios.idNoticia = noticias.idNoticia 78. WHERE comentarios.estado = 'sin validar' 79. ORDER BY comentarios.idComentario ASC"; 80. $resultado = mysql_query ($query, $dbConn); 81. while ( $row = mysql_fetch_assoc ($resultado)) { 82. array_push( $arrComentarios,$row ); 83. } 84. 85. // si tenemos una categoria puntual 86. if ( !empty($_GET['id']) ) { 87. // traemos una categoria 88. $query = "SELECT idComentario, comentario FROM `comentarios` WHERE idComentario = {$_GET['id']}"; 89. $resultado = mysql_query ($query, $dbConn); 90. $row = mysql_fetch_assoc ($resultado); 91. } 92. 93. ?> 94. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 95. <html xmlns="http://www.w3.org/1999/xhtml"> 96. <head> 97. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 98. <title>Blog Personal</title> 99. </head> 100. 101. <body> 102. 103. <h1>Blog Personal</h1> 104. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php">Panel de control</a> - <a href="../index.php?salir=true">Salir</a></p> 105. <h2>Comentarios sin aprobar</h2> 106. <? if ( !empty($_GET['aprobar']) ) { ?> 107. <div style="background-color: #fdfdfd;border:1px solid #ff8800;width:90%;padding:5px">El comentario se marc&oacute; como apto con &eacute;xito.</div> 108. <? } elseif ( !empty($_GET['dele']) ) { ?> 109. <div style="background-color: #fdfdfd;border:1px solid #ff8800;width:90%;padding:5px">El comentario ha sido borrada con &eacute;xito.</div> 110. <? } elseif ( !empty($_GET['edit']) ) { ?> 111. <div style="background-color: #fdfdfd;border:1px solid #ff8800;width:90%;padding:5px">El comentario ha sido editado con &eacute;xito.</div> 112. 113. <? } ?> 114. 115. <div> 116. <h3>Listado de Comentarios sin aprobar</h3> 117. <table style="width:90%;padding:5px;border:1px solid #cccccc"> 118. <tr> 119. <th style="background-color:#cccccc;padding:5px;">id</th> 120. <th style="width:80%;background-color:#cccccc;padding:5px;">comentario</th> 121. <th style="background-color:#cccccc;padding:5px;width:20%"></th> 122. </tr> 123. <? foreach ($arrComentarios as $comentario) { ?> 124. <tr> 125. <td style="padding:5px;"><? echo $comentario['idComentario']; ?></td> 126. <td style="padding:5px;"> 127. <? echo $comentario['comentario']; ?><br /> 128. <i>Dijo <b><? echo $comentario['usuario']; ?></b> en <a href="../vernoticia.php?idNoticia=<? echo $comentario['idNoticia']; ?>"><? echo $comentario['titulo']; ?></a></i> 129. </td> 130. <td style="padding:5px;"><a href="comentarios.php?apr=<? echo $comentario['idComentario']; ?>">Aprobar</a> - <a href="comentarios.php?id=<? echo $comentario['i<?

123

TALLER DE PHP
131. 132. // iniciamos session 133. session_start (); 134. 135. // archivos necesarios 136. require_once 'admin/config.php'; 137. require_once 'admin/conexion.php'; 138. require_once 'admin/esUsuario.php'; 139. 140. // obtengo puntero de conexion con la db 141. $dbConn = conectar(); 142. 143. // verificamos que este conectado el usuario 144. if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { 145. $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); 146. } 147. 148. if ( !empty($_POST['submit']) ) { 149. 150. if ( !empty($_POST['comentario']) ) $comentario = $_POST['comentario']; 151. if ( !empty($_GET['idNoticia']) ) $idNoticia = $_GET['idNoticia']; 152. if ( !empty($arrUsuario['idUsuario'])) $idUsuario = $arrUsuario['idUsuario']; 153. 154. // completamos la variable error si es necesario 155. if ( empty($comentario) ) $error['comentario'] = true; 156. if ( empty($idNoticia) ) $error['idNoticia'] = true; 157. if ( empty($idUsuario) ) $error['idUsuario'] = true; 158. 159. // si no hay errores registramos al usuario 160. if ( empty($error) ) { 161. 162. // inserto los datos de registro en la db 163. $query = "INSERT INTO `comentarios` (comentario, idUsuario, idNoticia) VALUES ('$comentario','$idUsuario','$idNoticia')"; 164. $result = mysql_query($query, $dbConn); 165. 166. header( 'Location: vernoticia.php?idNoticia='.$idNoticia ); 167. die; 168. 169. } 170. 171. } 172. 173. // traemos la noticia 174. $query = "SELECT noticias.idNoticia, noticias.titulo, noticias.copete, noticias.cuerpo, categorias.valor as categoria, usuarios.usuario FROM `noticias` 175. INNER JOIN `categorias` ON categorias.idCategoria = noticias.idCategoria 176. INNER JOIN `usuarios` ON usuarios.idUsuario = noticias.idUsuario 177. WHERE noticias.idNoticia = " . $_GET['idNoticia'] . " LIMIT 1"; 178. $resultado = mysql_query ($query, $dbConn); 179. $noticia = mysql_fetch_assoc ($resultado); 180. 181. // traemos los comentarios aprobados 182. $arrComentarios = array(); 183. $query = "SELECT comentarios.idComentario, comentarios.comentario, usuarios.usuario 184. FROM `comentarios` 185. INNER JOIN `usuarios` ON comentarios.idUsuario = usuarios.idUsuario 186. WHERE comentarios.estado = 'apto' AND comentarios.idNoticia = " . $_GET['idNoticia'] . " 187. ORDER BY comentarios.idComentario DESC"; 188. $resultado = mysql_query ($query, $dbConn); 189. while ( $row = mysql_fetch_assoc ($resultado)) { 190. array_push( $arrComentarios,$row ); 191. } 192. 193. ?> 194. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 195. <html xmlns="http://www.w3.org/1999/xhtml"> 196. <head> 197. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 198. <title>Blog Personal</title> 199. </head> 200. 201. <body> 202. 203. <h1>Blog Personal</h1> 204. 205. <? if ( empty($arrUsuario['usuario']) ) { ?> 206. <ul> 207. <li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li> 208. <li><a href="registrar.php">Reg&iacute;strate gratis</a></li> 209. </ul> 210. <? } else { ?> 211. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php?salir=true">Salir</a></p> 212. <? if ( $arrUsuario['tipo'] == 'admin' ) { ?> 213. <ul> 214. <li><a href="admin/index.php">Panel de administraci&oacute;n</a></li> 215. </ul> 216. <? } ?> 217. <? } ?> 218. 219. <h2><?php echo $noticia['titulo']; ?></h2>

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

124

TALLER DE PHP
220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. <p>Publicado por <b><?php echo $noticia['usuario']; ?></b> en <i><?php echo $noticia['categoria']; ?></i></p> <div><?php echo $noticia['cuerpo']; ?></div> <h2>Comentarios</h2> <div> <? foreach ($arrComentarios as $comentario) { ?> <p> <b><? echo $comentario['usuario']; ?></b> dijo:<br /> <i><? echo $comentario['comentario']; ?></i> </p> <? } ?> </div> <div> <?php if ( !empty( $arrUsuario ) ) { ?> <form action="vernoticia.php?idNoticia=<?php echo $_GET['idNoticia']; ?>" method="post"> <p> <label for="comentario">Dejar un comentario</label><br /> <textarea rows="3" cols="50" name="comentario"></textarea> </p> <p> <input name="submit" type="submit" value="Enviar" /> </p> </form>

<?php } else { ?> <p>Para dejar un comentario hay que ser un usuario registrado. <a href="registrar.php">Registrar</a> o <a href="ingresar.php">Ingresar</a></p> 248. <?php } ?> 249. </div> 250. </body> 251. </html> 252. dComentario']; ?>">Editar</a> - <a href="comentarios.php?del=<?= $comentario['idComentario'] ?>">Borrar</a> 253. </tr> 254. <? } ?> 255. </table> 256. </div> 257. 258. <? if ( !empty($_GET['id']) ) { ?> 259. <div style="background-color:#ff8800;padding:5px; margin-top:10px;"> 260. <h3 id="add">Editar comentario</h3> 261. <? if (!empty($error)) { ?> 262. <ul> 263. <? foreach ($error as $mensaje) { ?> 264. <li><?= $mensaje ?></li> 265. <? } ?> 266. </ul> 267. <? } ?> 268. <form action="comentarios.php" method="post"> 269. <p> 270. <label for="nombre">Comentario</label><br /> 271. <textarea name="comentario" rows="5" cols="50"><? echo $row['comentario']; ?></textarea> 272. </p> 273. <p> 274. <input name="idComentario" type="hidden" value="<? echo $row['idComentario']; ?>" /> 275. <input name="submitEdit" type="submit" value="Editar" /> 276. </p> 277. </form> 278. </div> 279. <? } ?> 280. 281. </body> 282. </html>

Con los comentarios vamos a poder tener 3 acciones posibles. Una de ellas es borrar los comentarios indeseados, el otro aprobar los comentarios, y por ltimo editarlos, para poder corregir alguna que otra falta de ortografa de nuestros usuarios, no para editarles el contenido del mismo. Para borrar es muy similar a como venamos hacindolo con los otros elementos. El aprobar en realidad es tambin muy similar. Recibimos por get la id que queremos aprobar y luego hacemos un UPDATE en la base de datos. Con el editar seguimos igual que como venamos haciendo con los otros elementos.

125

TALLER DE PHP

De hecho la mayor dificultad que tenemos en esta pgina es la consulta para traer los comentarios que le hacemos un join con la tabla de usuarios y con la tabla de noticias (para saber quin hizo el comentario y a que noticia pertenece el mismo). Prestar atencin que estamos trayendo unicamente los comentarios que estan SIN VALIDAR, es decir, todos aquellos que no hemos visto an. En la parte de html simplemente hacemos el foreach con los comentarios y agregamos los enlaces. Finalmente nos queda por hacer el mostrado de los comentarios en la noticia especfica.
PLAIN TEXT
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. <?

// iniciamos session
session_start ();

// archivos necesarios

require_once 'admin/config.php'; require_once 'admin/conexion.php'; require_once 'admin/esUsuario.php';

// obtengo puntero de conexion con la db


$dbConn = conectar();

// verificamos que este conectado el usuario


if ( !empty( $_SESSION['usuario'] ) && !empty($_SESSION['password']) ) { $arrUsuario = esUsuario( $_SESSION['usuario'], $_SESSION['password'], $dbConn ); } if ( !empty($_POST['submit']) ) { if ( !empty($_POST['comentario']) ) $comentario if ( !empty($_GET['idNoticia']) ) $idNoticia if ( !empty($arrUsuario['idUsuario'])) $idUsuario = $_POST['comentario']; = $_GET['idNoticia']; = $arrUsuario['idUsuario']; = true; = true; = true;

// completamos la variable error si es necesario


if ( empty($comentario) ) if ( empty($idNoticia) ) if ( empty($idUsuario) ) if ( empty($error) ) {

$error['comentario'] $error['idNoticia'] $error['idUsuario']

// si no hay errores registramos al usuario // inserto los datos de registro en la db

$query = "INSERT INTO `comentarios` (comentario, idUsuario, idNoticia) VALUES ('$comentario','$idUsuario','$idNoticia')"; 35. $result = mysql_query($query, $dbConn); 36. 37. header( 'Location: vernoticia.php?idNoticia='.$idNoticia ); 38. die; 39. 40. } 41. 42. } 43. 44. // traemos la noticia 45. $query = "SELECT noticias.idNoticia, noticias.titulo, noticias.copete, noticias.cuerpo, categorias.valor as categoria, usuarios.usuario FROM `noticias` 46. INNER JOIN `categorias` ON categorias.idCategoria = noticias.idCategoria 47. INNER JOIN `usuarios` ON usuarios.idUsuario = noticias.idUsuario 48. WHERE noticias.idNoticia = " . $_GET['idNoticia'] . " LIMIT 1"; 49. $resultado = mysql_query ($query, $dbConn); 50. $noticia = mysql_fetch_assoc ($resultado); 51. 52. // traemos los comentarios aprobados 53. $arrComentarios = array(); 54. $query = "SELECT comentarios.idComentario, comentarios.comentario, usuarios.usuario 55. FROM `comentarios` 56. INNER JOIN `usuarios` ON comentarios.idUsuario = usuarios.idUsuario 57. WHERE comentarios.estado = 'apto' AND comentarios.idNoticia = " . $_GET['idNoticia'] . " 58. ORDER BY comentarios.idComentario DESC"; 59. $resultado = mysql_query ($query, $dbConn); 60. while ( $row = mysql_fetch_assoc ($resultado)) { 61. array_push( $arrComentarios,$row ); 62. } 63. 64. ?>

126

TALLER DE PHP
65. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 66. <html xmlns="http://www.w3.org/1999/xhtml"> 67. <head> 68. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 69. <title>Blog Personal</title> 70. </head> 71. 72. <body> 73. 74. <h1>Blog Personal</h1> 75. 76. <? if ( empty($arrUsuario['usuario']) ) { ?> 77. <ul> 78. <li><a href="ingresar.php">Iniciar sesi&oacute;n</a></li> 79. <li><a href="registrar.php">Reg&iacute;strate gratis</a></li> 80. </ul> 81. <? } else { ?> 82. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a href="index.php?salir=true">Salir</a></p> 83. <? if ( $arrUsuario['tipo'] == 'admin' ) { ?> 84. <ul> 85. <li><a href="admin/index.php">Panel de administraci&oacute;n</a></li> 86. </ul> 87. <? } ?> 88. <? } ?> 89. 90. <h2><?php echo $noticia['titulo']; ?></h2> 91. <p>Publicado por <b><?php echo $noticia['usuario']; ?></b> en <i><?php echo $noticia['categoria']; ?></i></p> 92. <div><?php echo $noticia['cuerpo']; ?></div> 93. 94. <h2>Comentarios</h2> 95. <div> 96. <? foreach ($arrComentarios as $comentario) { ?> 97. <p> 98. <b><? echo $comentario['usuario']; ?></b> dijo:<br /> 99. <i><? echo $comentario['comentario']; ?></i> 100. </p> 101. <? } ?> 102. </div> 103. 104. <div> 105. <?php if ( !empty( $arrUsuario ) ) { ?> 106. 107. <form action="vernoticia.php?idNoticia=<?php echo $_GET['idNoticia']; ?>" method="post"> 108. <p> 109. <label for="comentario">Dejar un comentario</label><br /> 110. <textarea rows="3" cols="50" name="comentario"></textarea> 111. </p> 112. <p> 113. <input name="submit" type="submit" value="Enviar" /> 114. </p> 115. </form> 116. 117. <?php } else { ?> 118. <p>Para dejar un comentario hay que ser un usuario registrado. <a href="registrar.php">Registrar</a> o <a href="ingresar.php">Ingresar</a></p> 119. <?php } ?> 120. </div> 121. </body> 122. </html>

Obviamente es igual a nuestro viejo vernoticia.php pero ahora le agregamos la consulta con los comentarios con estado APTO y que tengan idNoticia como nuestra variable GET idNoticia. Finalmente en el html le agregamos un foreach con los comentarios para que todo el mundo los pueda leer y listo. Ya tenemos terminado nuestro blog. Queda despus en ustedes mejorarlo permitiendo poner avatares en los usuarios, o publicar las fechas de los comentarios, etc... Saludos y nos vemos la clase que viene.

127

TALLER DE PHP

Conclusin
Bueno gente, el taller ya termin. Espero que hayan disfrutado el mismo y que hayan podido aprender mucho! Sera muy interesante que sigan practicando y que no tengan miedo a probar y tocar.

128

Das könnte Ihnen auch gefallen