taller de php · 2 manual de php tip lo ideal a la hora de programar es definir todas las variables...

118
1 Manual de PHP Taller de PHP Clase 01 : Introducción Este es el primer artículo editorial del Taller de PHP donde podrás conocer de qué se trata este lenguaje, cómo aplicarlo y algunos tips extra para sacarle el máximo provecho. Para empezar, PHP es un lenguaje de programación para páginas web que permite generar páginas dinámicas del lado del servidor. Para ser un poco más preciso, nos referimos por páginas dinámicas a aquellas páginas que van a cambiar su contenido dependiendo de los valores que se le asignen. Sin ir más lejos, este mismo blog está programado en PHP y para ver los artículos se utiliza siempre el mismo archivo, pero se muestra el contenido de acuerdo a la id del artículo que se le está pidiendo. ¿Y por qué del lado del servidor? Esto significa que el código PHP va a ser interpretado en el servidor. Así, lo que el usuario verá en pantalla será el contenido generado por la interpretación del archivo PHP que el usuario está solicitando. Una de las grandes ventajas que tiene PHP es su gran versatilidad a la hora de trabajar con bases de datos, permitiendo realizar páginas con información almacenada en forma persistente en bases de datos y mostrarla según la petición de los usuarios. Primeros pasos Dentro de un archivo PHP se puede alternar entre código html y código PHP. Esto nos permite realizar páginas dinámicas de forma fácil: realizando toda la estructura con html y luego agregando el contenido dinámico. Imaginemos una página html común, pero en lugar de ser index.html es index.php. Cuando se quiera agregar código PHP habrá que hacerlo dentro de las etiquetas <?php y ?> o <? y ?>, por ejemplo: <html> <head> <title>hola mundo</title> </head> <body> <h1>incluir código PHP en html</h1> <p><? acá va el código PHP ?></p> </body> </html> Variables Las variables son elementos que creamos para asignarles un valor o dato específico (que puede cambiar a lo largo de nuestro archivo). En PHP, las variables se definen anteponiendo el signo $, por ejemplo: $hola = "hola mundo"; En el código anterior definimos la variable hola la cual contiene la información hola mundo. Noten que al final agregué un punto y coma (;). En PHP, siempre que se termine una instrucción hay que aclararlo de esta forma.

Upload: others

Post on 12-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

1

Manual de PHP

Taller de PHP

Clase 01 : Introducción

Este es el primer artículo editorial del Taller de PHP donde podrás conocer de qué se trata este

lenguaje, cómo aplicarlo y algunos tips extra para sacarle el máximo provecho. Para empezar, PHP

es un lenguaje de programación para páginas web que permite generar páginas dinámicas del

lado del servidor. Para ser un poco más preciso, nos referimos por páginas dinámicas a aquellas

páginas que van a cambiar su contenido dependiendo de los valores que se le asignen.

Sin ir más lejos, este mismo blog está programado en PHP y para ver los artículos se utiliza

siempre el mismo archivo, pero se muestra el contenido de acuerdo a la id del artículo que se le

está pidiendo.

¿Y por qué del lado del servidor? Esto significa que el código PHP va a ser interpretado en el

servidor. Así, lo que el usuario verá en pantalla será el contenido generado por la interpretación

del archivo PHP que el usuario está solicitando.

Una de las grandes ventajas que tiene PHP es su gran versatilidad a la hora de trabajar con bases

de datos, permitiendo realizar páginas con información almacenada en forma persistente en bases

de datos y mostrarla según la petición de los usuarios.

Primeros pasos Dentro de un archivo PHP se puede alternar entre código html y código PHP. Esto nos permite

realizar páginas dinámicas de forma fácil: realizando toda la estructura con html y luego

agregando el contenido dinámico.

Imaginemos una página html común, pero en lugar de ser index.html es index.php. Cuando se

quiera agregar código PHP habrá que hacerlo dentro de las etiquetas <?php y ?> o <? y ?>, por

ejemplo:

<html>

<head>

<title>hola mundo</title>

</head>

<body>

<h1>incluir código PHP en html</h1>

<p><? acá va el código PHP ?></p>

</body>

</html>

Variables Las variables son elementos que creamos para asignarles un valor o dato específico (que puede

cambiar a lo largo de nuestro archivo). En PHP, las variables se definen anteponiendo el signo $,

por ejemplo:

$hola = "hola mundo";

En el código anterior definimos la variable hola la cual contiene la información hola mundo. Noten

que al final agregué un punto y coma (;). En PHP, siempre que se termine una instrucción hay que

aclararlo de esta forma.

2

Manual de PHP

Tip Lo ideal a la hora de programar es definir todas las variables y realizar las operaciones antes del

código html y en ese código mostrar los resultados de nuestras variables. Por ejemplo, un código

completo de hola mundo sería:

<? $hola = "hola mundo"; ?>

<html>

<head>

<title><? echo $hola; ?></title>

</head>

<body>

<h1>incluir código PHP en html</h1>

<p><? echo $hola; ?></p>

</body>

</html>

La funcion echo lo que hace es imprimir una o más cadenas de texto. En nuestro ejemplo anterior,

como la variable contenía una cadena de texto (string), lo que el navegador hubiera mostrado es:

<html>

<head>

<title>hola mundo</title>

</head>

<body>

<h1>incluir código PHP en html</h1>

<p>hola mundo</p>

</body>

</html>

En los próximos artículos de este taller ya profundizaremos en el uso de este potente lenguaje.

Ver también: XAMPP, servidor web fácil de instalar

Clase 02: Variables y Constantes

En la clase anterior vimos un ejemplo muy chiquito explicando más o menos qué era una variable,

hoy avanzaremos un poco más en detalle, veremos:

Reconocimiento de Variables

Tipos de Variables

¿Qué son las constantes y en qué se diferencian?

Reconociendo variables Como expliqué en la clase anterior las variables anteponen el símbolo $, es decir $variable,

$queEsEsto, $no_se, son tres variables que se le pone el nombre que uno quiere.

Qué contenido pueden tener mis variables A una variable se le puede asignar cualquier tipo de información: una cadena de texto (string),

números enteros (integer), un arreglo (array), true, false, null, etc;

Así mismo, a una variable que antes era un string se le puede cambiar el tipo de información sin

ningún problema.

3

Manual de PHP

<?

$miVariable = "hola, esta es una cadena de texto";

$miVariable = 30;

$miVariable = array( 'hola', 'este', 'es', 'un', 'array' );

$miVariable = true;

?>

Si escribimos todo eso en nuestro código php, el valor final que va a tener la variable $miVariable

va a ser true, todo el resto de la información asignada se pierde.

Tipo de variables Existen dos tipos de variables en php, locales y globales, locales son aquellas que se ejecutan en

un único ámbito, es decir si yo defino una variable $local y a continuación uso una función que

adentro contiene una variable llamada $local, van a ser consideradas como dos variables

diferentes y no va a pasar lo que pasa en el ejemplo anterior que la información asignada

prioritariamente a la variable $local se pierde.

Para crear una variable global que sí puede ser accedida desde todos los ámbitos de nuestro script

se debe aclarar, caso contrario es local.

<?

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 convención se utilizan nombres en mayúscula

para las constantes aunque no es obligatorio). Las constantes son más livianas que las variables en

el uso de memoria del servidor y no pueden ser reescritas, es decir, si en nuestro script tenemos lo

siguiente:

<?

define('HOLA', 'Hola mundo');

define('HOLA', 'Chau mundo');

?>

Nuestro script de php va a interpretar la constante HOLA con la primer información definida en

ella, es decir Hola mundo y en el reporte de errores del servidor va a agregar el error de que se

intento definir nuevamente la constante HOLA.

Otra ventaja que tienen las constantes es que son GLOBALES, es decir se pueden acceder desde

cualquier ámbito, dentro de una función, una clase, etc.

4

Manual de PHP

Por último, para usar una constante la usamos directamente por el nombre que definimos en el

primer término, volviendo al ejemplo de Hola mundo de nuestra primer clase, usando la constante

sería de la siguiente forma:

<? define('HOLA', 'Hola mundo'); ?>

<html>

<head>

<title><? echo HOLA; ?></title>

</head>

<body>

<h1>incluir código PHP en html</h1>

<p><? echo HOLA; ?></p>

</body>

</html>

y en el navegador se verá así:

Clase 03: Condicionales (1)

A partir de esta clase vamos a empezar a ver con más profundidad como podemos aprovechar al

máximo la programación. Los condicionales son básicamente el elemento fundamental a la hora

de hacer páginas dinámicas. Con ellos decidimos qué tipo de acción realizar y son parte de la

llamada estructura de control.

Diferentes tipos de condicionales Tenemos 4 elementos a utilizar a la hora de necesitar una condición:

if, else, elseif y switch

Casos de uso

if, else y elseif La estructura if se utiliza para ejecutar una accion según una determinada condición. Por ejemplo:

<?

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 condición.

¡Atención! No es obligatorio que figure.

<?

if ( $usuario != false ) {

5

Manual de PHP

echo "Bienvenido de nuevo $usuario";

} else {

echo "Hola, si aún no estas registrado puedes hacerlo ...";

}

?>

Si usamos el else se mostrará o la primer acción o la segunda. Por el contrario, si usamos solo el if,

en pantalla se mostrara el bloque de acción –si se cumple la condicion– y seguirá corriendo el

script mostrando lo que viene a continuacion por fuera de los { }.

Por último, tenemos el elseif que nos permite usar varias condiciones hasta que se cumpla una.

Por ejemplo:

<?

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 condición y entrará únicamente en esa sentencia.

Switch La estructura switch es una forma paralela a la usada en el último caso. Se forma de la siguiente

manera:

<?

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;

6

Manual de PHP

case 'Sabado':

echo 'Hoy es Sabado, tenemos ravioles para almorzar';

break;

case default:

echo 'Hoy es Domingo, no almorzamos ';

break;

}?>

Condicionales con HTML Una de las grandes ventajas de PHP es que se puede entrelazar con HTML. Un claro ejemplo de lo

aprendido en esta clase, es cómo decidir qué mostrar y qué no en nuestro HTML con un condicional

de PHP.

En el caso siguiente mostraré el formulario para dejar comentarios de elWebmaster, dependiendo

si estamos registrados o no en nuestro sitio.

A continuación, verás cómo queda el formulario en ambos casos:

Sesión iniciada como usuario registrado.

7

Manual de PHP

Usuario invitado. Sesión no iniciada.

Clase 04: Condicionales (2)

Bienvenidos a la cuarta clase del Taller de PHP. Esta clase en realidad continúa la anterior, donde

comenzamos a ver el uso de las Condicionales. Hoy voy a hablar un poco sobre los operadores.

A lo largo de esta clase veremos qué son los operadores. Además aprenderemos sobre operadores

aritméticos, de asignación, de comparación y operadores lógicos, descubriendo cómo nos ayudará

cada uno en nuestros proyectos.

¿Qué son los operadores? Al realizar nuestros scripts constantemente estamos realizando operaciones que le dan

complejidad a nuestro trabajo. Existen cuatro tipo de operadores: aritméticos, asignación, lógicos

y comparación.

Operadores aritméticos

+ adición de valores.

- resta de valores.

* multiplicacion de valores.

/ division de valores.

% resto de una division.

++ incrementa en una unidad.

-- resta en una unidad.

Operadores de asignación

= asigna al primer miembro el segundo. Es decir $a = 4, le asigna el valor 4 a $a.

+= asigna al primer miembro la suma del primer miembro con el segundo.

$a =4; $b = 5; $b += $a, ahora $b pasa a valer 9.

-= asigna al primer miembro la resta del primer miembro con el segundo.

*= asigna al primer miembro la multiplicacion del primer miembro con el segundo.

/= asigna al primer miembro la division del primer miembro con el segundo.

8

Manual de PHP

%= asigna al primer miembro el resto de la division del primer miembro dividido el segundo.

.= concatena el primer miembro con el segundo y se lo asigna al primero.

Es decir $a = ‗Hola ‗; $b = ‗Mundo‘. $a .= $b; ahora $a = ‗Hola Mundo‘;

Operadores de comparación Este tipo de operadores se van a utilizar mucho en los condicionales, junto con los operadores

lógicos son los que le van a dar la complejidad a nuestro script.

== comprueba si dos valores son iguales, por ejemplo if ($a == $b) si $b es igual $a, el condicional

devuelve TRUE y continua ejecutando el script.

!= comprueba si dos valores son distintos.

> comprueba si el valor del primer miembro es mayor al segundo, por ejemplo if ( $a > 5), va a

devolver TRUE para todos aquellos valores de $a mayor a 5.

< comprueba si el valor del primer miembro es menor al segundo.

>= comprueba si el valor del primer miembro es mayor o igual al segundo.

<= comprueba si el valor del primer miembro es menor o igual al segundo.

Operadores lógicos

!

operacion de negativa, por ejemplo dentro de un condicional se puede realizar todo tipo de

operaciones y funciones, una que veremos mas adelante es una funcion propia de php que

devuelve TRUE o FALSE dependiendo si la variable esta vacia, entonces si nosotros

preguntamos if (!empty($a)) va a devolver si $a = 5, TRUE, ya que empty($a) devuelve FALSE,

pero !empty($a) seria como preguntar Si $a NO esta vacia.

and 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.

or

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

ejecucion.

xor va a devolver verdadero si al menos una de las dos condiciones es verdadera pero no ambas.

&& es igual que el and

|| es igual que el or

Clase 05: Bucles (1) Casi siempre nuestros script van a realizar tareas repetitivas, por ejemplo, una función que

muestra un listado de noticias, repite siempre la misma estructura, es decir, mostrar un título,

mostrar una imagen, mostrar el autor, lo único que cambia es el contenido, pero la tarea que

realiza es siempre la misma.

Una forma fácil de realizar una secuencia de instrucciones en forma repetitiva es utilizando los

BUCLES.

9

Manual de PHP

En PHP existen cuatro tipos de bucles: while, do while, for y foreach.

while El while es un bucle que va a realizar una instrucción o conjunto de instrucciones siempre y cuando

la condición ( lo vimos en la Clase 4 - Condicionales - ParteII ) se cumpla, es decir sea verdadera.

La comprobación de la condición la hace siempre al principio.

La estructura es la siguiente:

<code>

<?

while ( condicion ) {

instrucciones

}

?>

</code>

Explicando un poco la sintaxis del while, lo que va entre ( ) es la condición, puede ser de cualquier

tipo, ver si existe una variable, si una variable es menor a otra, si una variable es verdadera, etc.

Y entre { } va la instrucción o instrucciones.

Un ejemplo sencillo de este bucle puede ser mostrar una cuenta de 1 hasta 10.

<code>

<?

$c = 1;

while ( $c < 11) {

echo "$c <br>";

$c++;

}

?>

</code>

En la primer línea definimos la variable $c con el valor 1, luego evaluamos la condición si $c es

menor a 11, como es 1, se ejecutan las instrucciones.

En la primer linea de la instrucción mostramos en pantalla el valor de $c, en este caso 1, y luego

en la segunda linea de instrucciones le sumamos uno a $c ( con $c++ se le suma un valor a la

variable, es lo mismo a poner $c = $c + 1; ),

Al final de las instrucciones, el bucle vuelve a analizar la condición, en este caso $c es igual a 2,

(recordar que le acabamos de sumar 1), sigue siendo verdadera la condición de que $c < 11, por lo

que el bucle va a continuar con este proceso hasta que $c sea igual a 11.

do while Este bucle no difiere mucho del anterior:

<code>

<?

do {

intrucciones

} while ( condicion)

?>

</code>

10

Manual de PHP

La única diferencia salvando la sintaxis es que primero ejecuta la instrucción y luego se fija si

cumple la condición, en caso de ser verdadera la condición, vuelve a ejecutar una vez mas y así.

La clase que viene vamos a ver los dos bucles que nos están restando for y foreach

Clase 06: Bucles (2)

Bienvenidos a la sexta clase del Taller de PHP. Continuando con la clase de bucles, hoy vamos a

ver los dos restantes: for y foreach. Estos son un poco más complejos, por lo que debemos prestar

mucha atención para no cometer errores.

Vamos a ver que las expresiones tienen un encadenamiento determinado y deben cumplir con

ciertos parámetros. Esto es fundamental para que todo funcione de manera correcta. Pero veamos

esto en detalle, sin perder más tiempo.

for El bucle for tiene la siguiente sintaxis:

<?

for( expresion 1; expresion 2; expresion 3 ) {

instrucciones

}

?>

La expresión 1 se ejecuta una vez al comienzo del bucle, la expresión 2 es la condición que se

debe cumplir y la expresión 3 se ejecuta al final de ejecutar las instrucciones en cada iteración.

Siguiendo el mismo ejemplo de la clase anterior, en la que vimos el bucle while, ahora vamos a

usar el mismo, mostrar la secuencia de números del 1 al 10 pero con un for.

<?

for ($c = 1; $c < 11; $c++) {

echo "$c <br />";

}

?>

Al igual que como hicimos en el ejemplo del while, aquí seteamos $c = 1 (expresión 1 que se

ejecuta por única vez antes de comenzar el bucle), $c < 11 es la expresión 2, o sea la condición

que queremos que se cumpla, y $c++ es la acción que se va a realizar al finalizar la iteración, igual

que el while donde le poníamos el $c++ dentro de las instrucciones.

Para bucles for se puede utilizar también una sintaxis alternativa.

<?

for ( expresion 1; expresion 2; expresion 3 ):

instrucciones

endfor;

?>

foreach Este bucle es una forma rápida y sencilla de recorrer un arreglo o una matriz. En la clase 2 vimos

que una variable podía contener un arreglo (array). ¿Qué quiere decir esto? que a una variable se

11

Manual de PHP

le puede asignar un conjunto de elementos, por ejemplo la variable $semana puede contener un

arreglo con los días de la semana, para esto la definimos así:

<?

$semana = array( 'lunes','martes','miércoles',jueves','viernes','sábado','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 cómo queremos que se llame el

valor de cada elemento de nuestro array, en instrucciones lo que queremos hacer cada iteración.

Siguiendo nuestro ejemplo de la semana, el bucle va a recorrerse 7 veces, ya que tenemos 7 días,

si lo que queremos es mostrar un listado de los días que tenemos en nuestro array debemos hacer

lo siguiente:

<?

// definimos el arreglo con los días de la semana

$semana = array( 'lunes','martes','miércoles',jueves','viernes','sábado','domingo'

);

// mostrarnos el mensaje inicial

echo "Los días 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 iteración que realiza el foreach

Si todavía no se perdieron, vamos a ver la forma de utilizar el foreach para recorrer un arreglo que

tiene definido índices, en el ejemplo anterior vimos un array el cual no tenía definido ningún

índice, ahora vamos a ver un array un poco más complejo:

<?

$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 más complejo, vamos a ver el foreach sin mostrar índices y

mostrándolos

<?

foreach ( $noticia as $valor ) {

echo "$valor<br />";

}

?>

En este ejemplo vamos a imprimir en pantalla lo siguiente:

12

Manual de PHP

Php Clase 5 - Bucles

Acá va el contenido de la clase 5 de php, mucho texto, mucho mucho

Justi

Y usando la expresión más compleja:

<?

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

Tip

Lo bueno de usar esta última expresión es que se puede manipular que mostrar en pantalla

dependiendo del índice, supongamos que queremos imprimir nuestra noticia pero queremos que

los títulos tengan un <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 que tal? Ya va tomando un poco más de sentido todo lo que venimos leyendo, no?

Nos vemos la clase que viene.

Clase 07: Envío de datos de un formulario

¡Hola, bienvenidos a la séptima clase del Taller de PHP! Espero que hayan estado practicando.

Como seguramente ya saben pueden dejar todas sus dudas y comentarios que las iré respondiendo

lo más rápido que pueda.

Muy bién, con lo aprendido en clases anteriores ya sabemos cómo hacer un if y ya sabemos cómo

recorrer un bucle, pero ahora nos falta una parte importante que es cómo trabajar con formularios

que nos envían los usuarios. ¡Empecemos ya!

¿Cómo 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 diseñadores que no saben cuáles son los campos que sí o sí hay que tener, vamos a

armar uno de cero y para que sea un poquito más ú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:

13

Manual de PHP

action: aquí es donde vamos a hacer que se envíen todos los datos, el archivo contacto_script.php

va a procesar toda la información enviada y decidirá cómo continuar, si hubo un error, si fue

correcto, etc.

method: le especificamos cómo queremos que se envíe la información, a través del método POST

o del método GET.

Yo se lo que te estás preguntando ahora, qué diferencia hay entre cada método ¿No? El temita es

el siguiente, no tiene sentido que yo te escriba un párrafo de 1000 palabras con las diferencias

técnicas que existen entre un método y el otro para el protocolo HTTP por lo que te lo voy a

explicar crudamente para que sepas cuándo emplear cada método:

Basicamente se envía información a través del método POST cuando se desea que ese envío de

información sea oculto, o si se está enviando mucha información. Por lo general la página que

recibe esa información no va a ser re-cargada, ya que si hacemos refresh en una página que acaba

de recibir información vía POST el navegador nos avisará con un cartelito que estamos intentando

recargar una página y que se va a enviar toda la información de nuevo, por un lado es molesto y

por otro puede que el navegador no haya guardado correctamente toda la información enviada

originalmente y falle.

El metodo GET, por el contrario, cuando completamos un formulario que envía los datos atraves

de GET, esta información nos va a aparecer en la URL del sitio, si se fijan, cuando realizan una

búsqueda en Google, esta se hace a través de un formulario con método GET, ya que en la URL nos

aparece toda la información que nosotros buscamos más otras variables.

Ahora bien ¿Cuándo es aconsejable usar uno u otro método? Pues como dije justo en el párrafo

anterior, cuando se realiza un formulario de búsqueda, o un formulario para filtrar la información

mostrada o cambiar el orden de la información mostrada (En un listado de departamentos en

alquiler, cambiar el orden por mejor precio, por número de ambientes, etc.) es aconsejable usar

el metodo GET, ya que el usuario es muy probable que entre en una página y luego vuelva para

atrás, en esta vuelta para atras, esta haciendo refresh de la pagina con los resultados de

busqueda, si hubiese sido por POST, el navegador hubiese mandado la alerta de que se esta

intentando entrar en una página que recibio informacion via POST y podría no mostrar la

informacion correctamente.

Por el contrario, es aconsejable utilizar el método POST cuando se desea enviar mucha

información, o es información que no va a cambiar por decisión 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 usuamos para identificar el formulario, ya que podemos llegar a tener muchos formularios en

una misma página y queremos que se identifique bien cada formulario. Aqui elegimos el nombre

que queremos.

Listo, ya sabemos como configurar nuestro formulario, la clase que viene vamos a ver que

diferentes tipos de campos existen y como vamos a procesar esta información con PHP.

14

Manual de PHP

Clase 08: Procesar un formulario (1)

¡Hola, bienvenidos a la octava clase del Taller de PHP! Esta clase estará

dividida en dos partes, por una cuestión 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 montón, así que

veamos uno por uno.

Inputs El más común de todos es el de tipo text. Este sirve para completar una sola linea 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 estarán 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 ningún otro elemento con este nombre en

toda la página. El nombre es a gusto de ustedes, pero por convención se utilizan nombres

relacionados con el elemento que están 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 genérico le puse campo, pero ahí podría 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 fácilmente.

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.

<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:

15

Manual de PHP

Bueno, los inputs de tipo text los utilizamos para casos en que el usuario debe completar un solo

reglón. Como completar con sus nombres y apellidos, dirección, teléfono, email, etc.

También 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á? Fíjense 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, sólo

se puede marcar una opción, 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 clásicos cuadraditos que se utilizan para tildar y

destildar, es muy común ver este tipo de inputs antes de registrarnos en algún lugar y que nos

pregunten si estamos de acuerdo con los términos 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 envía y al procesarlo por Php, veremos que no existe la variable POST

correspondiente a este campo.

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 clásicos redondelitos negros ocultando la información.

<input id="input_password" type="password" name="password" value="" />

Luego tenemos el tipo Hidden, que es un campo oculto, en el podemos poner información pre-

definida que el usuario no tiene que completar, entonces no se muestra pero si se envía.

<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

16

Manual de PHP

Bueno, eso es todo por esta clase, la semana que viene seguimos con el resto de los campos del

formulario que nos faltan.

Clase 09: Procesar un formulario (campo textarea) (2)

¡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 envío 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 línea 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‖.

Queridos suscriptores al FEED RSS de TALLERES PRACTICOS: debido a un problema técnico es

probable que no hayan recibido las actualizaciones a los últimos dos talleres. El problema ya se

encuentra solucionado, pero deberán volver a suscribirse al feed RSS de TALLERES PRACTICOS a

esta nueva dirección :

http://feeds.feedburner.com/elwebmastercom-talleres

Nota: Esto no afecta al feed general de elWebmaster.com ni al de comentarios.

¡Muchas gracias!

El equipo de elWebmaster.com

Textarea Los textarea funcionan muy similar a un campo input de tipo text con la particularidad de que se

pueden agregar saltos de linea, es decir escribir bloque de textos completos con diferentes

párrafos.

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 via POST, rows es el número 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:

17

Manual de PHP

La clase que viene aprenderemos sobre SelecBox, con lo cual terminaremos de ver el formulario

del lado del ―front end‖. ¡Los espero!

Clase 10: Procesar un formulario (campo selectbox) (3)

¡Ya estamos en la décima 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 opción, u otros donde se le permite

seleccionar más de una.

SelectBox La sintaxis del que permite seleccionar sólo 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 opción que queremos que aparezca en el formulario. Lo que esta

entre las etiquetas <option> y </option> es lo que va a ver el usuario, pero PHP va a obtener la

información que figura en el atributo value. Y únicamente de la opción seleccionada.

Para hacerlo múltiple, hay que agregarle una propiedad extra a la etiqueta select.

<select id="select_gustos" name="gustos" multiple="multiple">

<option value="1">Me gusta jugar al Tennis</option>

<option value="2">Me gusta jugar al Futbol</option>

<option value="3">Me gusta jugar al Correr</option>

</select>

18

Manual de PHP

Para poder seleccionar múltiples 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 sólo

nos resta ver el ―back end‖ que es donde actúa todo el proceso de PHP.

Clase 11: Procesar un formulario (recibiendo los datos) (4)

¡Hola, bienvenidos a la clase número once del Taller de PHP! Ya vimos todo

el frontend del formulario, ahora nos resta ver como levantamos las

variables enviadas através del mismo con PHP.

Hay que tener mucho cuidado en esta parte, como en general, dado que un

pequeño descuido al tipear el código puede provocar un error al intentar

enviar los datos a través del formulario. ¡Sigue atentamente las indicaciones

y no tendrás problemas!

Recibiendo los datos Antes de ver como recibimos los datos, veamos como 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 método post. Ahora la pregunta

del millón es qué contiene el archivo contacto_script.php.

contacto_script.php Este archivo va a interpretar los datos enviados a través del formulario. Para ello lo que vamos a

hacer es primero ver si llegaron todos los parámetros y agregarlos cada uno a una variable.

<?

// definimos las variables o marcamos el error

if ( !empty($_POST['nombres']) ) $nombres = $_POST['nombres']; else $error = true;

19

Manual de PHP

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á vacío el parámetro enviado por post, ya que la

función empty pregunta si esta vacío (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 condición se cumpla, asignamos a una variable el parámetro 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 página con el mensaje de error.

// verificamos que no exista un error

if ( !empty($error) ) {

header( 'Location: contacto_error.php' );

die;

}

¿Qué esta pasando acá? Lo mismo que antes, preguntamos si no está vacío 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 página que contenga el

mensaje de error, esta página va a ser en este caso contacto_error.php.

La redirección la hacemos por medio de la función header( ‘Location: …’ ) que va a hacer que

recargue la nueva página que le estamos pasando, y tenemos que poner la linea siguiente con el

die para que se frene el script en ese momento y pueda ejecutarse la función header, ya que si no

frenamos el script, primero va a leer y ejecutar todo y después va a tener acción el header(

‘Location: …’ ).

La página contacto_error.php puede contener simplemente un mensaje que diga ―El formulario de

contacto no ha podido ser enviado, por favor asegúrese de que haya completado todos los campos

correctamente.‖ y un link a la página del formulario de contacto para que vuelva a enviarlo.

Cuerpo del Mensaje Nos resta por definir el cuerpo del mensaje que queremos recibir a través 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

20

Manual de PHP

";

Como el e-mail llega como texto plano, debemos definirle los saltos de linea con \n\r.

Perfecto, ya definimos las variables, ya nos aseguramos que no tengo ningún error, creamos el

cuerpo del email, ahora lo que vamos a hacer es enviar el mensaje que recibimos através del

formulario a nuestra casilla de email. Para ello vamos a utilizar una funcion de php que se llama

mail()

Función mail mail ( string $para , string $asunto , string $mensaje );

esta función va a responder true o false, dependiendo si se pudo ejecutar correctamente, en

nuestro script quedaria algo así:

// enviamos el email

if ( mail( '[email protected]','Recibiste un mensaje a través

del formulario de contacto de tu sitio',$cuerpo ) ) {

header( 'Location: contacto_exitoso.php' );

die;

} else {

header( 'Location: contacto_error.php' );

die;

}

Fíjense que en el primer parámetro de la función mail agregamos a dónde queremos que se envíe

el mensaje, en el segundo parámetro ponemos el asunto y en el tercero el cuerpo que definimos

anteriormente.

Si la condición es verdadera, es decir, el e-mail se envió correctamente redireccionamos a una

nueva página 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 página de error.

Script Completo El script completo quedaría algo asi:

<?

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

// verificamos que no exista un error

if ( !empty($error) ) {

header( 'Location: contacto_error.php' );

die;

}

21

Manual de PHP

// 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( '[email protected]','Recibiste un mensaje a través

del formulario de contacto de tu sitio',$cuerpo ) ) {

header( 'Location: contacto_exitoso.php' );

die;

} else {

header( 'Location: contacto_error.php' );

die;

}

?>

Clase 12: 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

código. Con php podemos armar una función que ejecute un conjunto de instrucciones. ¡No

perdamos más tiempo! Comencemos.

Sintaxis las funciones se pueden definir con la siguiente sintaxis:

<?php

function nomber($argumento1, $argumento2, ..., $argumento_n)

{

echo "Función de ejemplo.";

return $resultado;

}

?>

Vamos a explicar un poco, en el cuerpo de la función puede aparecer cualquier instrucción, incluso

otra función. 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 función si es una variable global (lo vimos en

la clase 2).

Dentro de la función 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 función.

Veamos un ejemplo más útil:

22

Manual de PHP

Calcular la edad de una persona Por ejemplo una función que te dice la edad de una persona pasándole la fecha en formato aaaa-

mm-dd (año-mes-día) puede ser como sigue:

<?

public function edad($nacimiento){

//restamos los años (año actual - año cumpleaños)

$edad = date("Y") - ereg_replace("^(.{4}).*","\\1",$nacimiento);

//si pasamos de año, pero aún no cumplimos años, resta 1

if( date("m-d") < ereg_replace(".*(.{5})$","\\1",$nacimiento) ) $edad--;

return $edad;

}

?>

No voy a explicar lo que hace adentro de la función porque ya lo veremos más adelante pero sí

básicamente cómo se utiliza esta función. Por ejemplo nuestro archivo perfil puede contener lo

siguiente

Mi nombre es Hernán y tengo <? echo edad('1977-07-06'); ?> años de edad.

Y en pantalla esto se vería así:

Mi nombre es Hernán y tengo 30 años 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 automáticamente 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 páginas, 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 lineas de código y de tiempo. A medida que avanzamos con el curso

vamos a ir entendiendo igual la fuerza de tener funciones.

Clase 13: Sesiones y cookies

Hola, bienvenidos nuevamente al Taller de PHP, espero que me estén siguiendo. 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 información al cambiar de página o

sección en un sitio.

Seguro tendrás muchas dudas, así que empezemos la clase.

¿Qué son las cookies? Básicamente la definición 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‖.

23

Manual de PHP

La definición anterior seguro que les generó más 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 contraseña? Bueno, eso lo que hace es generar una cookie que contenga su email y su

contraseña en su propio navegador (se guarda en la computadora de ustedes).

De esta forma, cuando ustedes vuelven a abrir la página de Hotmail, el sitio busca si tienen

almacenada alguna cookie identificada por este sitio y, si la encuentra y el email y la contraseña

coinciden con la información 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 ocurría con los métodos $_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 información y cambiar de página en página sin perder esa información (y

sin necesidad de enviarla a través de ningún formulario, ni vía get, ni vía post), ya que la misma es

guardada en el servidor con un identificador único de sesión (es único por cliente) y en el

navegador del usuario (cliente) se guarda una cookie con la información de acceso a la sesión (el

número de identificación de sesión).

De esta forma logramos mantener la información del usuario más 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

información desde nuestra aplicación.

Un caso muy común 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 sesión, de esta forma pueden cambiar

de sección en el sitio sin perder la información.

Por ejemplo en un ―supermercado online‖ pueden cambiar de la seccion ―almacén‖ a ―productos

congelados‖ y su carrito de compras apesar de recargar una nueva página continúa con los

productos seleccionados.

Las sesiones por lo general se acceden más rápido que las cookies, ya que toda la información al

ser almacenada en el servidor, no hay que estar enviándola del cliente al servidor en forma

constante.

Ya me imagino la siguiente pregunta:

¿Para qué usar Cookies si con las Sesiones se logra practicamente lo mismo de forma más rapida y más segura? El problema que tienen las sesiones es que tienen un tiempo de expiración que no puede ser

modificado desde la creación de la misma, hay que modificarlo desde la configuración 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 página no se le avisó que empiece a hacer uso de sesiones, las mismas

24

Manual de PHP

no van a correr, por lo que la aplicación web no va a poder acceder a la información 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 más en el uso de sesiones y cookies, ya que veremos cómo

utilizarlas cuando comencemos con la creación de nuestro blog, por ahora es información

suficiente como para que tengan nociones de qué son y en qué casos se utilizan.

Clase 14: Base de Datos

Hola! Bienvenidos nuevamente al taller de PHP.

La clase de hoy va a ser bastante teórica, pero es fundamental para enteder la potencia de PHP

cuando se relaciona con una base de datos.

De esta forma aprenderemos cuestiones básicas sobre páginad dinámicas, interacción y SQL. Pero

primero lo primero.

¿Qué es una Base de Datos? Las bases de datos son un conjunto de datos almacenados sistemáticamente para su uso posterior.

Gracias al avance de la informática, la mayoría de las bases de datos se encuentran en formato

digital, por lo que una de las formas para acceder a la información guardada en ellas es a través de

una computadora.

Importancia de las Bases de Datos Php ofrece interfaces para el acceso a la mayoría 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 través de una página 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 páginas dinamicas, ya que es siempre la misma y sólo cambia el contenido que se muestra

en ella.

La base de datos más común para utlizar con PHP es MySql, debido a que es muy potente, gratuito

y se encuentra en la mayoría de los servicios de hosting de páginas webs. Otras bases utilizadas

son PostgreSQL, ODBC, Oracle, IBM DB2, etc.

Interacción La interacción entre php y las base de datos se realiza a través 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 asustén, SQL es muy sencillo (pero muy potente) y facil de aprender.

Hasta la semana que viene.

25

Manual de PHP

Clase 15: 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 más popular del mundo. Incluso

su continuo desarrollo y su impresionante popularidad están haciendo que

MySQL sea un competidor directo de las grandes empresas como Oracle o

IBM.

Este sistema de base de datos muy utilizado sobretodo con PHP es

relacional, ya que utiliza múltiples tablas para almacenar y organizar la información. También es

multihilo porque se pueden realizar varias tareas concurrentemente. Y como última característica

es multiusuario, pudiendo conectarse varios usuarios simultáneamente.

Ventajas de MySQL

Es una base de datos muy rápida en la lectura en aplicaciones web, convirtiéndola 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 también 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).

También es muy portable por la misma característica anterior, SQL es fácilmente portable

a otras plataformas y nos brinda una gran escalabilidad, pudiendo manipular base de datos

enormes con más de 50 millones de registros.

Conectarse con PHP a MySQL PHP nos brinda muchísimas herramientas a la hora de conectarnos con MySQL, pudiendo realizar

conexiones simultáneas y todo tipo de consultas para obtener información (a medida que avance

este curso, vamos ir viendo todas estas posibilidades).

Básicamente es necesario tener la IP del servidor de base de datos (por lo general se encuentra en

el mismo lugar físico que el servidor apache con PHP, utilizando como IP para conexión la palabra

―localhost‖). El nombre de usuario y contraseña de conexión y el nombre de la base de datos a la

que queremos conectarnos.

Con esos elementos ya podemos crear un script de conexión 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 fácil de utilizar para la manipulación de

las mismas, pudiendo armar toda nuestra base de datos desde ahí.

Saludos y hasta la próxima.

26

Manual de PHP

Clase 16: MySQL-phpMyAdmin

Bueno, los que llegaron hasta acá veo que me tienen paciencia :), hoy vamos a ver una de las

herramientas más comunes a la hora de trabajar con base de datos MySQL. Estoy hablando de

phpMyAdmin, un proyecto de código abierto en PHP para administración 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 instalación de un servidor PHP -

Apache - MySQL) podrán ver como ya viene configurado y listo para usar.

Este programa permite acceder a todas las funciones típicas de la base de datos MySQL de forma

muy intuitiva. Básicamente no se necesita tener conocimientos previos de base de datos para

comenzar a crear tablas y agregar contenido.

¿Qué otras alternativas existen? Para la administración de base de datos MySQL existen varias alternativas. Una de las más

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 fácilmente, se puede acceder a la información guardada en ellas

de forma muy rápida.

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 esten 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

también 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 hoy, a partir de la semana que viene ya comenzaremos con la creación de

tablas, yo sé que estas clases son un poco densas porque son sólo teoría, pero son muy importantes

ya que la importancia de realizar páginas dinámicas radica en las base de datos.

Clase 17: MySQL-creación de tablas

¡Bienvenidos a otra clase del Taller de PHP! Seguimos con el tema de MySQL. La clase pasada

vimos qué era phpMyAdmin; hoy vamos a ver cómo crear las tablas usándolo (esto siempre y

cuando ya tengamos la Base de datos creada).

27

Manual de PHP

Además veremos cómo 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 cómo se relacionan con la

tabla creada. ¡Comencemos!

Como primer medida apenas entramos al sistema vamos a ver una pantalla como la siguiente:

Fíjense que a la izquierda (en el sector más oscuro) esta el listado de base de datos y a la derecha

hay una serie de información.

Si la base de datos (a partir de ahora la llamaremos db, por data base, base de datos en ingles) 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 inglés create new database con el nombre que nosotros

queremos y hacemos clic en el botón 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).

¿Cómo crear una tabla? En realidad esta parte es la más fácil 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

práctico va a ser agenda, en el siguiente campo del formulario debemos incluir el numero 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 más utilizados son varchar, char, int, tinyint, text, datetime, timestamp y enum, jaja,

ustedes a esta altura del partido ya me habrán sacado la ficha y sabrán que yo los hago esperar un

poquito antes de explicar qué es cada cosa, pero están 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 atención al lado de declarar el

tipo, tienen que declarar también la longitud. Los char tienen un máximo de 255 caracteres (los

28

Manual de PHP

varchar también). Por ejemplo si declaramos un char de 30, se añadirán espacios a la derecha

hasta la longitud especifica 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 también son cadenas de caracteres pero la diferencia es que la longitud es variable.

También posee un máximo 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

―Hernán‖, 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 también una cadena de texto pero esta permite almacenar mucha más información

incluidos espacios en blanco y saltos de linea. Estos campos son utilizados en general para

almacenar información recibida a través de campos de tipo ―textarea‖ (recuerden la clase de

formularios).

Los int y tinyint son para almacenar números enteros, el rango con signo del tinyint es de -128 a

127 y sin signo de 0 a 255. Y los ―int‖ son bastante más grandes, con signo van del -2147483648 a

2147483647 y sin signo de 0 a 4294967295.

Entre los tipos de datos de fecha y hora los dos más comunes son datetime y timestamp. La

diferencia practicamente esta en la forma en que guarda la información, 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 1001-01-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 común

utilizar este tipo para guarda la fecha de modificación de una línea.

Por último me queda explicar enum que también 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 identificación único de cada línea que agreguemos, y como no sabemos el tamaño

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 números de teléfono. Acá es donde surge la duda. ¿Es un int o es un varchar? Yo

elegiría varchar, ya que puede ser que se almacenen números de teléfono con letras, o es posible

separar un teléfono en conjunto de dígitos, por ejemplo 4547-6789, en este caso si se hubiese

elegido int, no sería un dato válido para la tabla. El cuarto campo vamos a llamarlo ―email‖,

29

Manual de PHP

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.

¿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. Prácticamente son usados para encontrar rápidamente 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 través de toda la tabla para encontrar

los registros que estábamos 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 información guardada con

idAgenda = 5, estamos buscando la información 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 búsquedas dentro del contenido con cadena

de textos básicamente.

Bueno, eso es todo por hoy, a partir de la clase que viene ya vamos a comenzar a hacer consultas

sobre nuestra tabla creada, hasta la semana que viene

30

Manual de PHP

Clase 18: 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, quiza recién hoy van a empezar a entender todo esto

que les vengo diciendo de la creación de sitios dinámicos obteniendo el contenido de la base de

datos.

Veamos entonces cómo utilizar Php y MySQL en conjunto…

Tipos de Consultas Básicamente tenemos cuatro consultas a realizar entre PHP y MySQL que son las siguientes:

Select: busca información en la base de datos.

Insert: ingresa información para almacenarla y luego ser obtenida mediante una consulta

select.

Update: actualiza la información guardada.

Delete: obviamente borra la información.

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 más 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();

?>

Con la función ―mysql_pconnect‖ obtenemos la conexión con el servidor de base de datos,

tenemos que completar entonces la ip al servidor, nombre de usuario y contraseña, una vez hecho

esto guardamos la conexión en la variable ―$conn‖.

En caso de que no conecte ―matamos‖ la aplicación (para que nuestro script no continúe

corriendo).

31

Manual de PHP

Una vez que tenemos nuestra conexión le decimos con qué base de datos queremos trabajar, ya

que es posible tener varias base de datos en un mismo servidor. Con ―mysql_select_db‖, le

pasamos el nombre de la base de datos y la conexión 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, Título,

Cuerpo y Estado. Vamos a realizar una consulta para traer el listado completo de noticias que

están almacenadas en esa tabla.

A continuación 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++;

}

Fijense 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 semana 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 conexión ($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, Título y Cuerpo. Y pasa

el puntero a la siguiente línea, es por eso, que usamos un while, recuerden que mientras que

exista la línea 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 información de la base de datos en esa variable y no tenemos que recurrir de

nuevo a la base de datos si lo necesitamos usar más adelante en el mismo script.

Por ejemplo si queremos mostrar el título de la primer noticia que tenemos en la base de datos

ponemos <? echo $noticia[0][‘titulo‘]; ?> y nos imprime en pantalla el título.

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 fácilmente agregando en nuestra consulta la orden ORDER BY

y luego indicando cómo queremos que sea: DESC (descendente) o ASC (ascendente).

Básicamente 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 cláusula que es WHERE y ahí le

indicamos qué campo queremos que sea igual a qué, es decir:

32

Manual de PHP

$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 como ir insertando

datos en la base mediante PHP.

Clase 19: Insertar datos en la base de datos

¡Buenos días alumnos! Hoy vamos a continuar con la inserción de datos en

nuestra base, así ya tienen más 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.

¿Cómo insertar nuevos registros en la base de datos? En realidad la consulta para insertar los nuevos registros es bastante fácil si entendieron la clase

anterior. Básicamente 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 conexión con la misma.

De igual modo esto se hace una vez, por lo general arriba de todo en cualquier script se pone la

conexión con la base de datos y después 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 cómo vamos a utilizar esta sentencia de MYSQL.

Básicamente 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 cómo se empieza a complicar todo :).

Veamos la parte de HTML primero.

<html>

<head>

<title>Formulario de Notícias</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 />

33

Manual de PHP

<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 atención verán que el formulario no tiene nada de raro salvo que la acción del mismo

apunta al mismo archivo. ¿Por qué es esto? Porque, como dije antes, vamos a trabajar todo sobre

un mismo archivo, separando lo que es PHP de lo que es HTML. Arriba del HTML vamos a poner

todo nuestro script de PHP que va a ser como sigue:

<?

// 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);

}

?>

Fijense un par de cositas, arriba de todo pusimos la conexión con la base de datos (esto lo voy a

repetir siempre, para que quede bien grabadito :D).

Luego hacemos uso de una condición mediante la sentencia if. Fijense que preguntamos si la

variable ―submit‖ no está vacia.

Nosotros en nuestro formulario le pusimos valor 1, entonces siempre que se envíe el formulario, va

a llegar también una variable $_POST[‘submit‘] con valor 1. Si no está vacia, hacemos la inserción

de la noticia. Ya más adelante veremos como hacer que algunos campos sean obligatorios y otros

no, pero como siempre los voy a dejar con la intriga.

Por otro lado verán que uso unos {} en la sentencia de inserción de datos, esto es para que me

tome solamente el indice que le estoy pasando del array $_POST, ya que estoy insertando una

variable directamente dentro de un string que esta entre comillas dobles(‖). Si yo no llegase a

incluir los {} me insertaria el array $_POST dentro del String en lugar del valor correspondiente al

indice ‗titulo‘.

Perfecto ya tenemos nuestro script para agregar noticias. Aquí les dejo el script completo

<?

// datos de configuracion

$ip = 'localhost';

$usuario = 'usuario';

$password = 'password';

34

Manual de PHP

$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 Notícias</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>

Hasta la semana que viene.

Clase 20: Actualizar y borrar registros (1)

Listo, ya aprendieron a insertar datos en una tabla, ahora nos falta saber

cómo hacer si esos datos que insertamos los escribimos mal, o los queremos

cambiar y, siendo un poquito más extremos, no queremos que existan más.

Para ello, en la clase de hoy, les voy a explicar cómo es la sintaxis de las

consultas de UPDATE y DELETE con la que lograremos nuestro objetivo.

Sintaxis Básicamente la sintaxis de PHP para estas consultas es bastante sencilla, por ejemplo, para

actualizar una tabla:

$query = "UPDATE `nombre_tabla` set campo1 = 'valoresCampo1', set campo2 =

'valoresCampo2' WHERE primaryKey = 'valorPrimaryKey' LIMIT 1";

$response = mysql_query($query, $conn);

35

Manual de PHP

Recordar pasar siempre la variable de conexión como primer medida, luego, hay que decirle en

qué tabla queremos hacer el UPDATE, y luego le decimos qué campos vamos a modificar y con qué

valores. Es muy importante también la cláusula WHERE para indicarle que están modificando una

fila únicamente, si ustedes quieren modificar varias filas con el mismo valor, pueden quitar la

cláusula ―where‖ y el ―limit 1″, y de esta forma editarían toda la tabla.

Para borrar es muy similar:

$query = DELETE FROM `nombre_tabla` WHERE primaryKey = 'valorPrimaryKey' LIMIT 1";

$response = mysql_query($query, $conn);

Incisto, tengan mucho cuidado con lo que pongan en el WHERE, pueden poner cualquier condición,

borrar por primary key o por muchos campos a la vez, pero mucho OJO porque pueden borrar toda

la información que contiene la tabla.

La clase que viene veremos algunos casos de usos de ambas consultas, y además añadiremos

consultas del tipo SELECT, necesarias para poder hacer un administrador de contenido decente.

¡Hasta la semana que viene! ¡Practiquen mucho!

Clase 21: Actualizar y borrar registros (2)

¡Hola de nuevo! Me imagino que habrán estado estudiando casi todo lo que

estuvimos viendo hasta aquí, ya que en la clase de hoy vamos a dar una

vueltita por casi todos los temas.

Lo que vamos a hacer es continuar con nuestro ejemplo de la tabla de

noticias, vamos a traer la noticia que queremos editar y para ello usaremos

una variable ―get‖ con la ID de la noticia. Luego con esa ID, haremos una

consulta para traer todos los datos que incluiremos en un formulario y a su vez enviaremos las

variables ―post‖ con los nuevos datos para editarla. ¿Sencillo, no?

Editando una noticia Supongamos que el archivo nuestro es editar-noticias.php, lo que vamos a hacer es llamarlo de la

siguiente manera:

http://direccion.com/editar.php?idNoticia=23

Entonces en nuestro archivo (previo nos conectamos con la base de datos como siempre) vamos a

tener un if para ver si existe una variable get idNoticia, en caso de que exista hacemos la consulta

para traer los datos completos

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

// traemos la noticia

$query = "SELECT idNoticia,titulo,cuerpo,estado FROM `noticias` WHERE idNoticia =

{$_GET['idNoticia']} limit 1";

$response = mysql_query($query, $conn);

$noticia = mysql_fetch_assoc($response);

}

Y luego, una vez que tenemos nuestra variable noticia con todos los datos de la base de datos,

vamos a completar el formulario con los datos originales de la siguiente manera:

<h1>Agregar Nueva Noticia</h1>

<form action="editar-noticias.php" method="post">

36

Manual de PHP

<label for="titulo">Título</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 verán hay dos cambios importantes con respecto al formulario de ingreso de noticias, en

este completamos el atributo value con los datos originales. Y el otro cambio es que agregamos un

nuevo campo al formulario de tipo hidden, o sea, oculto con el valor de la ID de la noticia que

estamos editando.

Este formulario lo enviaremos a un archivo que contendrá el script, puede ser este mismo archivo,

de la misma forma que lo hicismos al ingresar una noticia.

Si hiciéramos eso, tendríamos que tener entonces (antes de hacer nuestra consulta para traer la

noticia) otro if para saber si recibimos las variables post para editarla.

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

$query = "UPDATE `noticias` set titulo = '{$_POST['titulo']}', set cuerpo =

'{$_POST['cuerpo']}', set estado = '{$_POST['estado']}' WHERE idNoticia =

{$_POST['idNoticia']} LIMIT 1";

$response = mysql_query($query, $conn);

}

Nuestro archivo terminado queda de la siguiente manera:

<?

// 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']}', set estado = '{$_POST['estado']}' WHERE idNoticia =

{$_POST['idNoticia']} LIMIT 1";

$response = mysql_query($query, $conn);

}

// si tenemos id de noticia

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

37

Manual de PHP

// 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 Edición 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>

Borrando una noticia Para borrar una noticia lo vamos a hacer de la misma manera, utilizando una variable get que

contenga la ID de la noticia que estamos borrando.

if ( !empty($_GET['idNoticia') ) {

$query = DELETE FROM `noticias` WHERE idNoticia = {$_GET['idNoticia']} LIMIT 1";

$response = mysql_query($query, $conn);

}

Bueno, espero que les haya gustado la clase de hoy, hasta la semana que viene.

Clase 22: MySQL-Consultas complejas

Acá estamos de vuelta, me imagino un poco más experimentados con ―esto‖

de las páginas dinámicas. Ya sabemos prácticamente cómo hacer las

consultas, insertar datos en una tabla y modificarlos.

38

Manual de PHP

En la clase de hoy vamos a ir un poquito más allá y tratar de realizar consultas más complejas,

uniendo diferentes tablas, relacionándolas, etc.

joins Las consultas con ―joins‖ prácticamente son para unir tablas por medio de un campo. Supongamos

que tenemos dos tablas, la tabla usuarios y la tabla noticias. Ambas tienen los siguientes campos:

usuarios [ idUsuario, nombre, apellido ]

noticias [ idNoticia, titulo, cuerpo, idAutor ]

Fijense que en la tabla noticias no dejamos registro del nombre de la persona que escribió la

noticia, dejamos solo la referencia a la tabla usuarios mediante una identificación única. Esto nos

permite que a la hora de mostrar la noticia, si el usuario cambia uno de sus datos, ya sea porque el

nombre estaba mal escrito, o una mujer que se casó y ahora quiere que se vea el apellido del

marido también, o cualquier otro motivo, ahora solo va a tener que editar la tabla de usuarios, si

nosotros hubiéramos puesto en la tabla noticias en lugar de idAutor, nombreDelAutor, al momento

de actualizar la tabla de usuarios, también tendríamos que actualizar la de noticias.

Bueno, más o menos ya entendieron cuál es la idea al relacionar las tablas, ahora, qué pasa si

nosotros hacemos una consulta del tipo SELECT en la tabla de noticias para traer el listado

completo, no vamos a saber cuál es el autor, solo vamos a tener un numerito que hace referencia

a la tabla de usuarios pero no sabemos el nombre, nos tenemos que ir a fijar a esa tabla.

Para evitar tener que hacer una nueva consulta es que existe una forma de generar las consultas

agregando los ―joins‖ y en una sola consulta chequeamos dos o más tablas al mismo tiempo.

La sintaxis es la siguiente:

SELECT noticias.titulo, noticias.cuerpo, usuarios.nombre, usuarios.apellido FROM

noticias INNER JOIN usuarios ON noticias.idAutor = usuarios.idUsuario

De esta forma unimos ambas tablas, fíjense que en las columnas primero aclaramos a que tabla

pertenece lo que queremos traer y después el nombre del campo, lo mismo que cuando

declaramos el INNER JOIN le tenemos que indicar con qué tabla queremos unir y después en ON le

avisamos de qué forma es que unimos. Al final de esta consulta se puede poner sin problemas

filtros del tipo WHERE, también ORDER BY y LIMIT.

Inner, Left y Right Joins Existen varios tipos de joins, los tres más comunes son los que puse en el título :). El inner join no

va a mostrar ni un solo resultado si la condición de unión entre tablas no se cumple. Por ejemplo,

si tenemos una noticia que tiene idAutor = 5 y en la tabla de usuarios se borró ese usuario, la

noticia con el autor 5 no se va a mostrar si hacemos la consulta del tipo INNER.

Por el contrario si la consulta es del tipo LEFT se van a mostrar igual los resultados de las noticias

con el autor 5 pero los datos del usuario van a aparecer en blanco. Y si es del tipo RIGHT, lo que

hace esto es darle más peso a la segunda tabla, por ejemplo, tenemos aparte de las tablas

anteriores una tabla más que es noticiasImágenes donde dejamos registro de las imágenes que le

asignamos a una noticia

noticiasImagenes [idImagen, idNoticia, archivo]

39

Manual de PHP

Se puede dar el caso en que una noticia tenga varias imágenes, si nosotros hacemos la consulta de

la siguiente forma:

SELECT noticias.titulo, noticias.cuerpo, noticiasImagenes.archivo FROM noticias

RIGHT JOIN noticiasImagenes ON noticias.idNoticia = noticiasImagenes.idNoticia

Vamos a lograr que nos traiga como resultado tantas líneas como imágenes tenemos asignadas,

repitiendo los datos de las noticias, por ejemplo, puede ser que los resultados sean así:

idNoticia - titulo - imagen

1 - Taller de PHP - php.jpg

1 - Taller de PHP - logo.gif

Union Otro tipo de consulta más compleja son los UNION, que sirve para combinar resultados de varias

consultas del tipo SELECT. La sintaxis es:

SELECT ... UNION [ALL | DISTINCT] SELECT ...

El union puede ser UNION ALL o UNION DISTINCT, con la primer opción va a traer todos los

resultados encontrados en ambas tablas, y con DISTINCT solo los diferentes. Supongamos que

tenemos dos tablas de noticias, una para las noticias publicadas y otra para el borrador, y nosotros

queremos traer en una misma consulta todos los datos de ambas tablas ordenados por orden de

fecha de creación, en estos casos es que tenemos que hacer la consulta del tipo UNION, para poder

ordenar datos de dos tablas diferentes intercalando los datos entre un conjunto y otro.

Espero que les haya gustado la clase de hoy, hasta la semana que viene.

Clase 23: MySql – Consultas más usadas

Buenas, en la clase de hoy vamos a ver una forma de traer valores puntuales

de la base de datos.

También veremos cómo evitar hacer cuentas o cálculos complejos y cómo

aplicar ―count―, los tipos de consultas ―max‖ y ―min―, ―sum‖ y ―limit―.

Así que manos a la obra y ya saben que cualquier duda que vaya surgiendo

pueden dejármela en los comentarios que trataré de responderlos a medida

que van llegando.

Count El count nos va a dar el número de veces que se repite un valor en la db, es decir el número de

registros almacenados que correspondan con nuestra consulta. Por ejemplo, en nuestra tabla de

noticias, si queremos saber cuántas noticias hay publicadas entonces la consulta que hacemos es:

SELECT COUNT(*) FROM noticias WHERE estado = 'publicado';

Ahora que pasa si queremos agregar algún otro campo en la consulta, por ejemplo el número de

noticias publicadas por cada autor:

SELECT autor, count(*) FROM noticias GROUP BY autor;

Fíjense que agregamos a la consulta GROUP BY que nos permite agrupar por el valor que

queremos, por ejemplo, la consulta anterior nos traería como resultados posibles:

40

Manual de PHP

Justi - 3

Juan Manuel - 8

Wilkilen - 1

Max y Min Otro tipo de consulta muy común es traer el valor máximo o mínimo de un listado de valores.

Supongamos que tenemos una tabla de productos con sus respectivos precios, si queremos traer el

precio máximo o mínimo lo hacemos de la siguiente manera:

SELECT MAX(precio) FROM productos;

SELECT MIN(precio) FROM productos;

Y si queremos saber, por ejemplo, cuál es el precio promedio del producto con id 15 podemos

hacer:

SELECT AVG(precio) FROM productos WHERE idProducto = 15;

SUM Por último tenemos la suma. Por ejemplo, si tenemos un carrito de compras y seleccionamos 5

productos y queremos saber cuánto es el total a pagar por el usuario con id 3 deberíamos hacer:

SELECT sum(precio) FROM carrito WHERE idUsuario = 3;

LIMIT Algo que es muy común también es limitar la cantidad de registros que queremos traer de la base

de datos, por lo general algunas tablas pueden llegar a tener miles de registros y traer a todos

haría demasiado uso de servidor y demoraría demasiado para lo que realmente necesita el script,

es por ello que es muy comun limitar las consultas a la cantidad de resultados que necesitamos (si

es que realmente conocemos este dato).

Por ejemplo si hacemos una consulta con un count(*) porque queremos saber el total de registros

de una tabla, al final le colocaremos LIMIT 1.

SELECT count(*) FROM productos LIMIT 1;

Otra forma de usar el limit es pasándole dos argumentos en lugar de uno, por ejemplo, si

ponemos:

SELECT * FROM productos LIMIT 5,10;

El primer valor que ponemos es desde qué registro queremos empezar a traer (el primero es 0) y el

segundo cuántos valores, por lo que la consulta anterior va a traer desde el producto con id 6 al

15.

Es muy común utilizar el limit con dos argumentos cuando se desea hacer un paginado.

Bueno, eso es todo por hoy, hasta la semana que viene!

Clase 24: Clase de Consulta

La clase anterior fue la última en lo que respecta a MySQL y base de datos. Sé que no

es un tema sencillo (incluso tuve que añadir una clase extra por allí) pero todo es

práctica, constancia y consultas.

41

Manual de PHP

Por eso dejaré esta clase exclusivamente para que dejen sus comentarios con dudas o

inquietudes que les puedan surgir. Tienen tiempo hasta el próximo lunes. Prometo

responder todos los comentarios e incluso iré dando ejemplos para ser más claro.

Prefiero que cerremos el tema de esta forma para retomar el taller luego con

Manipulación de Archivos, algo diferente a lo que vimos hasta ahora.

Clase 25: Respuestas a consultas

¡Bienvenidos a otra clase del Taller de PHP! La semana pasada dijimos que

íbamos a recavar todas las dudas y consultas para que quede todo claro

antes de pasar al siguiente tema.

Hoy es el día de las respuestas a todas esas dudas de modo que no veremos

solamente un tema sino que el mismo irá variando de acuerdo a cada

pregunta. La idea es que todos podamos aprovechar para afianzar lo que

estuvimos viendo. ¡Comencemos!

Subiendo Imágenes a un Sitio ―Estoy haciendo un sitio web para una inmobiliaria, ya tengo las tablas y hago consultas y lo que

tengo hecho está funcionando.El problema es que no sé cómo insertar fotos a la tabla, lo he

intentado como tipo de datos bloc y cuando hago la consulta me da todos los datos pero en la foto

sólo me salen garabatos, estoy empezando en esto y me encanta, solo quería saber si me puedes

explicar o si puedes hacer una lección de cómo solucionar ese problema―.

Cuando agregamos imágenes en forma dinámica a un sitio, a pesar de que las mismas se pueden

guardar en base de datos, lo más conveniente, por una cuestión de performance, es guardar toda

la información relacionada con la imagen en la base de datos como puede ser el nombre del

archivo, peso de la imagen, etc, pero el archivo lo guardamos físicamente en el servidor, en el

mismo lugar donde están nuestros scripts de php, puede ser dentro de una carpeta llamada

Uploads o Subidas.

Para ello php nos da una herramienta para poder recibir imágenes a través de un formulario y

guardarla en donde deseamos. El proceso para subir arhivos al servidor será explicado en la clase

26 y la manipulación de imágenes para crear nuevas de diferentes tamaños en la clase 27.

IDE para desarrollar en php ―¿Utilizais algún IDE para desarrollar en php o simplemente un editor de texto?‖

Por IDE nos referimos a la herramienta que utilizamos para programar nuestros script, es más una

cuestión de gustos que otra cosa el ―cuál es la mejor‖.

En un principio yo utilizaba Dreamweaver, ya que trabajaba un poco en forma visual y un poco en

modo código. Luego cuando ya practicamente hacia todo en modo código pase a usar Zend Studio,

ambas opciones son desarrolladas por empresas privadas, por lo que hay que abonar por ellas,

como alternativa gratuita a estas opciones está Eclipse, excelente programa que compite cabeza a

42

Manual de PHP

cabeza con Zend, de hecho actualmente yo estoy usando Eclipse con un plugin de Zend Studio

obteniendo las mejores características de ambos programas.

Importar datos en la db de un CSV ―Me gustaría, si le es posible a alguno de ustedes, que me ayduaran a insertar registros a una

tabla usando los datos de un archivo de texto separados por coma―.

Excell una de las características que tiene es que nos permite guardar información en un archivo

de texto plano separando cada campo por comas, este tipo de archivo se llama CSV.

Mediante phpMyAdmin podemos importar directamente este archivo en una tabla de mysql.

Algunas cuestiones a tener en cuenta son que en la tabla estén los campos en el mismo número y

orden que se encuentran en el archivo de Excell o csv si es que ya está convertido, por ejemplo, si

mi tabla mysql que se llama usuarios tiene nombre, apellido y edad como campos, en el csv

tendría que tener solo tres campos por línea.

Luego de tener en cuenta esto vamos a ingresar en nuestro phpMyAdmin, hacer clic en la tabla

donde queremos importar los datos y arriba a la derecha hay una opción que dice importar. Ahí

vamos a buscar el archivo que queremos subir, y nos va a preguntar un par de cositas como por

ejemplo por que caracter están separados los campos, ya viene por defecto el ;, si esta todo

correcto, hacemos clic en GO y listo, ya tenemos nuestra completa desde un CSV.

Conociendo la ip de nuestros navegantes ―En un formulario que he creado, todos los datos que el formulario recolecta se insertan sin

problema en la base de datos, menos el campo en el cual va la ip del usuario que navega en mi

sitio, siendo que el resultado que me muestra es ‘<?php echo, que es una parte de la instrución

(<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. ¿Sabría decirme a que puede deberse esta situación?‖

PHP nos brinda una herramienta muy potente para que podamos dejar registro de la ip de los

navegantes de nuestro sitio, para ello tenemos que utilizar la variable

$_SERVER["REMOTE_ADDR"]

Que nos va a devolver la ip del usuario, con esta variable podemos hacer lo que queremos, o un:

<? echo $_SERVER["REMOTE_ADDR"]; ?>

para ser agregado en un formulario en el campo hidden, o sino, mucho más seguro, es agregarlo

directamente en el script que vamos a correr para guardar la información recibida desde el

formulario y guardar en la db directamente, por más que el script que guarda la información corra

en el servidor y el usuario no llega a ver todo el proceso que realiza PHP, igual obtiene la ip del

usuario que hizo la petición por lo que no tendremos ningún problema.

A medida que van apareciendo nuevas consultas que se encuentran fuera del programa las iré

agregando aquí.

¡Saludos!

43

Manual de PHP

Clase 26: Manipulación de Archivos (1)

Hola Chicos! ¡Bienvenidos a una nueva clase del Taller de PHP! Hoy vamos a ver un

poco de manejo de archivos, más que nada la lectura y creación de un txt. Cómo abrirlo

con la función fopen, cerrarlo con fclose o leerlo con fread.

Dejaremos para la segunda parte la escritura y borrado del mismo. Con las mismas

técnicas que vamos a ver en estas clases vamos a poder manipular no sólo txt sino

también html, xml, etc.

Abriendo un archivo

Para abrir un archivo tenemos que usar la función de php fopen:

fopen( "nombre_del_archivo", "modo");

Los diferentes modos que tenemos son:

“r”: Abre el archivo para solo lectura y posiciona el puntero al principio del

archivo.

“r+”: Abre el archivo para lectura y escritura y posiciona el puntero al principio

del archivo.

“w”: Abre el archivo para escritura únicamente. Posiciona el puntero al principio

del archivo y lo trunca con un largo de cero. Si el archivo no existe, intenta

crearlo.

“w+”: Abre el archivo para lectura y escritura. Posiciona el puntero al principio

del archivo y lo trunca con un largo de cero. Si el archivo no existe, intenta

crearlo.

“a”: Abre el archivo para escritura únicamente pero posiciona el puntero al final

del archivo. Si el archivo no existe, intenta crearlo.

“a+”: Abre el archivo para lectura y escritura. Posiciona el puntero al final del

archivo. Si no existe, intenta crearlo.

“x”: Crea y abre para escritura únicamente el archivo. Posiciona el puntero al

principio del archivo. Si el archivo ya existe, fopen() va a fallar y va a devolver

un FALSE y generará un error de nivel E_WARNING. Si el archivo no existe,

intenta crearlo.

“x+”: Crea y abre para lectura y escritura. Posiciona el puntero al principio del

archivo. Si el archivo ya existe, fopen() devuelve FALSE y genera un error de

nivel E_WARNING. Si el archivo no existe, intenta crearlo.

Por ejemplo si queremos empezar a manipular un archivo, debemos hacer lo siguiente:

$archivo = fopen("/logs.txt","r");

44

Manual de PHP

De esta forma abrimos el archivo logs.txt y posicionamos el puntero en la primer línea

para poder comenzar a leerlo.

Cerrar Archivos

Para cerrar el archivo debemos usar fclose().

A la función fclose debemos pasarle el puntero que abrimos con fopen, de la siguiente

manera:

fclose( $archivo );

De esta forma le avisamos a php que dejamos de usar el archivo (liberando memoria).

Leer un Txt

Para leer un archivo primero tenemos que abrir el puntero y luego usar la funcion

fread():

fread( $puntero, $largo_del_archivo );

Un ejemplo completo sería:

$archivo = "/logs.txt";

$puntero = fopen( $archivo, "r" );

$contenido = fread( $puntero, filesize( $archivo ) );

fclose( $puntero );

¿Qué hicimos en nuestro script?

Primero definimos la ruta a nuestro archivo en una variable, luego abrimos ese archivo

pasándole la variable con la ruta y le decimos que sea con el modo sólo lectura y con el

puntero al principio del archivo.

Luego usamos fread y le pasamos el puntero y le decimos el tamaño de nuestro archivo.

Guardamos todo el contenido en un string en la variable $contenido.

Y luego cerramos el puntero.

Ahora tenemos todo el contenido del archivo en la variable $contenido.

Clase 27: Manipulación de Archivos (2)

¡Hola a todos los lectores del Taller de PHP! ¿Estuvieron

practicando bastante? Recuerden que la clase pasada comenzamos a

ver cómo crear y manejar archivos (aprendimos a crear un txt, a

abrirlo con la función fopen, a cerrarlo con fclose y a leerlo con

fread).

45

Manual de PHP

Hoy vamos a ver la segunda parte de manejo de archivos. En esta clase veremos como

escribir y borrar archivos. Estonos permitirá, por ejemplo, crear un archivo HTML que

adentro contenga lo que sea que queramos. ¡Comencemos!

fwrite

Para comenzar a escribir archivos, usaremos la función fwrite:

fwrite( $puntero, "Texto que queremos guardar" );

Un ejemplo de su uso sería algo así:

$fp = fopen("archivo.txt", "a");

fwrite($fp, "Escribimos un texto con lo que queremos guardar \r\n");

fclose($fp);

¿Qué fue lo que hicimos?

Primero abrimos el archivo archivo.txt con el modo a, es decir que, si el archivo no

existía lo creamos, y si existía y tenía contenido, el nuevo contenido que escribimos va a

ser al final de todo, ya que el modo “a” posiciona el puntero al final.

Luego de eso, usamos fwrite, pasándole el puntero que acabamos de abrir y luego el

texto, fíjense que en el string que le pasamos, agregue al final \n\r, esto es para que haga

un salto de linea en el archivo.txt que estamos creando, para que, si escribimos más

texto, el mismo se ubique en un reglón por debajo y no todo de corrido.

Luego de esto, cerramos el puntero.

Casos de Uso

Recuerdan la clase pasada que yo les dije que podían crear html o xml con este método,

pues es muy sencillo, por ejemplo si queremos crear un html podemos hacer

simplemente:

$fp = fopen("holamundo.html", "a");

fwrite($fp, "<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 línea al html para que cuando

lo abran con algún editor, no este todo el texto de corrido.

Eliminar un archivo

Para borrar directamente un archivo del servidor usamos la función unlink.

unlink("url absoluta al archivo");

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

46

Manual de PHP

$url = "c:/documentos/archivo.txt";

if ( file_exists( $url ) )

unlink( $url );

Fíjense que primero nos fijamos que exista el archivo ya que, si no existe, unlink nos va

a tirar un error.

Clase 28: Moviendo Archivos

Hola, bienvenidos al Taller de PHP. En la clase de hoy vamos a ver cómo subir archivos al

servidor y algunos casos de uso. En realidad suena complicado pero es más sencillo de lo que

parece. Hay varias cosas a tener en cuenta para ello, por ejemplo, si vamos a utilizar un

formulario para subir los archivos.

Además hay que tener en claro el proceso que se llevará a cabo en el back-end, donde usaremos

la función $_FILES, que nos permite trabajar mucho más específicamente con los archivos,

agregar restricciones, etc. ¡Comencemos!

¿Cómo tiene que ser nuestro formulario? A la hora de querer subir un archivo al servidor desde un formulario para poder agregar imágenes

en una noticia, por ejemplo, tenemos que tener en cuenta algunos detallecitos.

El más importante de todos y el que casi todo el mundo se olvida es avisarle al formulario que se

van a enviar archivos, para ello agregamos el siguiente parámetro en el tag de apertura del

formulario: enctype=”multipart/form-data”.

Y luego sí, agregamos el input de tipo file para que se pueda enviar un archivo. El formulario

básicamente quedaría así:

<form name="nueva-noticia" enctype="multipart/form-data" method="post"

action="nueva_noticia.php">

<label>Título <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 veníamos haciendo con el resto de los formularios, vamos a

recibir vía POST las variables titulo y cuerpo, pero no imagen.

Sí, ya sé que nuestro input se llama imagen, pero en este caso en lugar de recibirla como

$_POST[‘imagen‘], la vamos a recibir como $_FILES[’imagen’]. ―¿Qué diferencia hay con POST?‖

se preguntarán y la respuesta es bastante sencilla, FILES nos da bastante más información respecto

al archivo que subimos:

$_FILES[’imagen’][’tmp_name’] - nos da la ruta y el nombre temporal al archivo que

acabamos de subir, si no queremos perder este archivo, lo que tenemos que hacer es moverlo a

47

Manual de PHP

una carpeta nuestra dentro del hosting, por lo general no se tiene acceso a la carpeta temporal

donde se suben los archivos.

$_FILES[’imagen’][’size’] - nos dice el tamaño que tiene el archivo, por si se realiza un

servicio público y queremos limitar la subida solo a archivos de 1 mega, entonces se puede poner

una condición utilizando este valor.

$_FILES[’imagen’][’type’] - nos va a indicar el tipo de archivo del que se trate, en

nuestro ejemplo, como sólo queremos que se suban imágenes podemos poner un if limitando sólo

al caso de las imágenes.

$_FILES[’imagen’][’name’] - nos va a indicar el nombre del archivo original, ya que el

tmp_name es un nombre generado por el servidor.

Entonces ya sabiendo cómo leer el archivo que acabamos de enviar desde el formulario, solo nos

resta moverlo a la carpeta de destino.

Supongamos que nosotros en el servidor tenemos la carpeta uploads donde vamos a guardar todas

las imágenes de las noticias, lo que tenemos que hacer es poner la url absoluta a esa carpeta.

Fíjense que no es desde donde están todos nuestros scripts de php, sino que va a ser algo del

estilo /var/www/elwebmaster.com/htdocs/uploads, y si están en Windows probablemente sea

algo así: c:/archivos de programa/xampp/www/elwebmaster.com/uploads. Si ustedes tienen un

servicio de hosting contratado, lo más probable que les hayan enviado un email con la información

a su carpeta absoluta en el servidor, ya que ustedes si ingresan por ftp, van a entrar directamente

a la carpeta a donde incluyen sus scripts, pero en realidad esta tiene un raíz en otro lado.

Si no tienen el email, y no tienen ni idea como es la url absoluta en donde están parados, pueden

generar un error de php a propósito, y el mismo error les va a decir dónde se encuentran, por

ejemplo, si en sus script ponen:

<? 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/

Bueno, ya tenemos nuestro archivo, ya conocemos nuestra url absoluta y ya tenemos nuestra

carpeta donde queremos mover, lo que vamos a hacer es usar la función de php

move_uploaded_file(), que va a mover un archivo recién subido a una nueva ubicación:

<?

$destino = '/var/www/elwebmaster.com/www/uploads';

$origen = $_FILES['imagen']['tmp_name'];

move_uploaded_file( $origen, $destino );

?>

¿Sencillito, no? La semana que viene vamos a ver como recibir imágenes grandotas y convertirlas

en imágenes más pequeñas para que se adapten a nuestro sitio.

¡Saludos!

48

Manual de PHP

Clase 29 Manipulación de Imágenes

¡Hola, bienvenidos nuevamente al Taller de PHP! La clase anterior vimos

cómo subir imágenes a nuestro sitio a través de un formulario, en la clase de

hoy lo que vamos a hacer es aprender a manipular esas imágenes para

generar una imagen más pequeña, llamada thumbnail.

Para poder manipular imágenes vamos a necesitar que nuestro servicio de

hosting tenga instalada la libreria LibraryGD, no se preocupen igual ya que

la mayoría de los servidores de hoy en día la incluyen, incluso si instalaron Xampp en sus

computadoras también lo tienen.

Generando imágenes Antes que nada guardamos en una variable la dirección absoluta (la que expliqué en la clase

anterior) a la imagen de origen, por ejemplo, si tenemos en una variable $imagen con el nombre

de la imagen y sabemos dónde se guardó, generamos una variable $archivo:

$archivo = "/var/www/elwebmaster.com/uploads/$imagen";

Una vez que tenemos el archivo, debemos corroborar que se trate de una imagen, y obtener la

extensión, para ver si se trata de un gif, jpg, png, etc.

$separo = explode( '.', strtolower($imagen) );

$nombre = $separo[0];

$extension = $separo[1];

Con explode lo que hacemos es convertir en array un string, indicándole por que patrón queremos

separar, en este caso lo separamos por un punto. Con strtolower lo que hacemos es llevar primero

a minúsculas todo, así cuando generemos nuevas imágenes se generan con nombres todos en

minúsculas.

El array que se genera tiene por nombre $separo y tiene dos índices 0 y 1, ya que cada imagen sólo

tiene un único punto, por lo que separa el string en dos únicamente.

Luego de esto armamos un switch para ver qué tipo de extensión tiene el archivo y creamos una

nueva imagen según la extensión que tenga.

switch( $extension ) {

case 'gif':

$imagen_src = imagecreatefromgif( $archivo );

break;

case 'jpg':

$imagen_src = imagecreatefromjpeg( $archivo );

break;

case 'png':

$imagen_src = imagecreatefrompng( $archivo );

break;

default:

trigger_error(”Formato de imagen no soportada!!!”, E_USER_ERROR);

}

Con imagecreatefrom* lo que hacemos es crear una nueva imagen desde la url absoluta de la

imagen que queremos y nos devuelve el identificador a esa nueva imagen creada.

49

Manual de PHP

Luego, lo que hay que hacer es crear una nueva imagen true color del tamaño de la nueva imagen

que queremos generar, por ejemplo, una imagen 100px de ancho por 120px de alto.

$imagen_dst = @imagecreatetruecolor(100, 120);

Utilizamos el @ antes de la función imagecreatetruecolor para evitar que se muestre un mensaje

de error si es que no se puede llegar a generar la imagen en true color (ya que depende de la

versión de php que tenemos instalado en el servidor).

Continuamos generándola normal si es que no se generó.

if ( empty($imagen_dst) ) {

$imagen_dst = imagecreate(100, 120);

}

Luego de esto tenemos que setearle el modo de blending a la imagen (para mejorar la calidad de

la imagen que vamos a crear), para ello hacemos lo siguiente:

imagealphablending($imagen_dst, false);

Luego, tenemos que copiar la imagen original en el tamaño nuevo que queremos obtener, para ello

utilizamos:

imagecopyresampled ( $imagen_dst , $imagen_src , int $dst_x , int $dst_y ,

int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h );

Con esta función lo que hacemos es pasarle como parámetros, la imagen blanca que generamos

con el tamaño deseado (imagen de destino), luego la imagen creada a partir de la original, luego

le indicamos qué punto x queremos dibujar en la imagen de destino, en nuestro caso va a ser 0, ya

que vamos a reemplazar toda la imagen blanca por la nueva imagen. Luego, qué coordenada y de

destino (dst_y), que también va a ser 0, a continuación a partir de que coordenada x del origen

vamos a copiar, nuevamente es 0 ya que queremos copiar absolutamente toda la imagen, luego la

coordenada y del origen (src_y). Finalmente le pasamos el ancho del destino, y el alto del destino

(dst_w y dst_h) que va a ser el total de la imagen blanca generada anteriormente y el ancho del

origen y el alto del origen, que también va a ser igual al ancho y alto de la imagen original.

Esto quedaría así:

imagecopyresampled($imagen_dst,$imagen_src,0,0,0,0,100,120,

imagesx($imagen_src),imagesy($imagen_src));

Ahora generamos un nuevo nombre para la imagen recién generada y en que lugar la queremos

guardar

$nueva_ruta = "/var/www/elwebmaster.com/uploads/{$imagen}-th.{$extension}";

Finalmente creamos la imagen definitiva que vamos a usar con imagejpeg y destruimos las

imágenes generadas en el proceso para liberar memoria:

imagejpeg( $imagen_dst, $nueva_ruta );

imagedestroy( $imagen_src );

imagedestroy( $imagen_dst );

Espero que se haya entendido ¡hasta la semana que viene!

50

Manual de PHP

Clase 30: Funciones más útiles predeterminadas de PHP

Hola, la clase de hoy vamos a ver algunas funciones muy comunes que ya

vienen con php que nos van a resultar muy útiles a la hora de realizar nuestros scripts.

Además veremos las funciones más usadas para manipular arrays, como array_diff, array_search e

in_array. ¡No perdamos más tiempo y comencemos con nuestra clase de hoy del Taller de PHP!

Time() No se si están familiarizados con el termino ―unixtime‖, por las dudas se los comento de forma

informal, prácticamente es una forma de trabajar con fechas y horas pero con un numero entero.

Es un número que representa los segundos pasados desde el primero de enero de 1970.

Para trabajar calculando diferencias de fecha, ordenar resultados de la base de datos con campos

de fechas, etc, es más práctico, eficiente y liviano trabajar con unixtime en lugar de con la fecha

―2008-07-06 17:48:12″, ya que no hay que parsear el string con la fecha.

La función de php time() nos va a devolver la hora unix (unixtime) al momento que la pedimos, por

ejemplo, si queremos calcular la hora de la semana pasada para poder traer de la base de datos

los últimos artículos de la semana podemos calcularlo de la siguiente forma:

<?

$ultimaSemana = time() - ( 60 * 60 * 24 * 7 );

?>

El número que estamos restando luego de time() son los segundos que tiene una semana, es más

fácil y practico poner el calculo de segundos por minuto por minutos por hora por horas del día por

días de la semana que poner directamente el resultado, ya que de este modo, a la hora de ver el

código de nuestro script lo vamos a entender mejor que si estamos viendo el resultado de esa

multiplicación directamente.

date() Nos devuelve un string con el formato de hora que le pasemos. Por ejemplo si ponemos:

$ahora = date(”Y-m-d H:i:s”);

nos va a devolver 2008-07-06 18:42:00.

Si como segundo parámetro le pasan una hora unix, date va a devolver un string de la hora que le

pasaron, por ejemplo:

$fecha = date("Y-m-d", 123516512 );

nos va a devolver el día correspondiente a esa hora.

51

Manual de PHP

mktime() Sigue con la tónica de Unixtime, esta vez, nos va a devolver un unixtime de la fecha que le

pasemos. La sintaxis es la siguiente:

mktime (hora, minutos, segundos, mes, dia, año );

Por ejemplo, combinando con date, podemos tener datos mas completos de un día del pasado o

del futuro:

echo date("F j, Y", mktime(0, 0, 0, 7, 6, 1977));

Y eso me va a mostrar por ejemplo ―Julio 6, 1977″, algo un poco más interesante puede ser:

echo date("D j \d\e F \d\e Y", mktime(0, 0, 0, 7, 6, 1977));

y va a mostrar Dom 6 de Julio de 1977 por ejemplo.

Manipulacion de arrays Algúnas de las funciones más utilizadas y utiles con respecto a arrays son:

array_diff

Muestra las diferencias entre un array y otro:

$a = array( "hola", "chau", "como" );

$b = array( “hola”, “va”, “como” );

$dif = array_diff( $a, $b );

print_r($dif);

mostrara algo asi

Array

(

[1] => “chau”

)

array_search

Buscara un valor especifico en un array y devuelve el índice si lo encuentra, por ejemplo:

$a = array( 0 => "Justi", 1 => "Thor", 2 => "Debi" );

$key = array_search(‟Debi‟, $a);

La variable $key va a tener valor 2.

in_array

Es similar a la anterior pero en lugar de devolver el indice de la coincidencia, devuelve true o

false. Por ejemplo:

if ( in_array( "Justi", $a ) ) {

$cuerso = “php”;

}

Mayúsculas y minúsculas strtolower(): convierte todo el string en minúsculas.

strtoupper(): pasa todo el string a mayúsculas.

ucfirst(): convierte la primer letra del string en mayúscula.

ucwords(): convierte cada primer letra de cada palabra en mayúscula.

Por ejemplo si tenemos un string:

$titulo = "TALLER DE PHP - FUNCIONES UTILES";

52

Manual de PHP

…y queremos modificarlo para que todos los títulos sean iguales, todos los caracteres en minúscula

menos la primer letra de la frase, tenemos que pasar primero el string a minúsculas y después

hacer que la primer letra sea mayúscula.

$titulo = ucfirst( strtolower( $titulo ) );

Espero que la clase de hoy les haya gustado y los espero la semana que viene.

Clase 31: Expresiones Regulares (1)

Hola, bienvenidos a otra clase del Taller de PHP de elWebmaster.com. Hoy veremos expresiones

regulares, una herramienta muy útil a la hora de trabajar con strings muy largos, ya que nos

permite buscar un patrón especifico dentro de una cadena de texto.

Asimismo, veremos que los operadores pueden ayudarnos haciendo que la expresión sea más

―flexible‖ es decir, que se adapte a patrones mucho más complejos. ¡Empecemos!

¿Qué son las expresiones regulares? Básicamente es como puse en el primer párrafo, una expresión regular es una expresión que nos

permite encontrar patrones dentro de textos, pero ¿De qué clase de patrones estamos hablando?

Por ejemplo las palabras Webmaster, elWebmaster y elWebmaster.com comparten Webmaster,

mediante expresiones regulares podemos encontrar qué palabras coinciden con ese patrón para

realizar alguna tarea especifica.

Es muy común utilizar expresiones regulares por ejemplo a la hora de verificar que un email sea

verídico, ya que todos los correos electrónicos van a contener un @ y un .com en alguna parte de

la cadena.

Ahora bien, no siempre estamos buscando un patrón exacto como fue el primer ejemplo de

―Webmaster‖, hay veces que tenemos que buscar patrones más difíciles como por ejemplo

encontrar en una cadena de texto html donde se encuentra una imagen. En este caso ya no es tan

sencillo porque sabemos que todas las imágenes si o si van a tener un <img y un src=‖"> pero no

sabemos si van a tener algo más como puede ser un class=‖" o un style=‖", border=‖", etc. Es en

estos casos cuando empezamos a jugar con los operadores en la expresión para que se adapte a lo

que estamos buscando.

Operadores más comunes | - significa alternación (ó) por ejemplo ―nen(e|a)‖, eso va a coincidir con nene o con nena.

+ - significa que el caracter al que sigue debe aparecer al menos una vez. Por ejemplo ―goo+gle‖

coincide con la expresión google, gooogle, gooooooogle, etc. ya que la 2da ―o‖ de google tiene

que aparecer por lo menos una vez.

? - significa que el caracter al que sigue debe aparecer por lo mucho una vez pero no es necesario

que aparezca, un ejemplo de esto es el patrón ―p?sicologo‖, machea con psicologo y sicologo.

* - significa que el caracter al que sigue puede aparecer cero, una o muchas veces. ―gooo*gle‖ va a

coincidir con google, gooogle, goooooogle, etc. Fíjense que a diferencia del patrón con el operador

+, acá le pusimos tres ―o‖ en google, ya que no es necesario que este la tercer ―o‖.

53

Manual de PHP

() - los paréntesis se utilizan para agrupar un conjunto de caracteres o definir el ámbito de acción

de la expresión, por ejemplo el que puse antes de nene o nena y sino uno un poco más complejo

puede ser ―(sin)?verguenza‖, fíjense que en ese caso pusimos el conjunto ―sin‖ precedido por el ?,

lo que significa que esta expresión va a machear con las palabras sinverguenza, verguenza pero no

con sinsinverguenza por ejemplo.

^ - significa que nuestro patrón debe ubicarse al comienzo del string que queremos analizar, por

ejemplo el patrón ―pe‖ coincide con ―perro‖, ―pepe‖, ―pelota‖ pero no coincide con ―trompeta‖ o

―campera‖.

$ - es similar al ^ pero ahora nuestro patrón debe ubicarse al final del conjunto de caracteres a

analizar, por ejemplo ―ta‖, machea con ―carpeta‖, ―bicicleta‖, o ―esta‖ pero no lo hace con

―tambien‖ o ―estampida‖.

. - el punto representa cualquier otro caracter, por ejemplo si lo que queremos buscar es la url de

una imagen podemos poner en nuestro patrón ―src=‘(.+)‘‖ por ejemplo, en este caso estaríamos

buscando una cadena de caracteres que contenga src=‘un caracter por lo menos‘.

\ - sirve para escapar un caracter, por ejemplo si en nuestro patrón queremos buscar un símbolo

de $, si no lo escapamos, al procesar el string va a buscar el patrón al final de la cadena y nos va a

fallar entonces necesitamos escaparlo, y eso se hace con la barra invertida, nuestro patrón

quedaría algo así ―\$(.+)‖ y eso coincide con $100, $1388. Si buscamos una cifra de dos números

podemos armarlo de la siguiente manera ―\$(.+){2}‖, eso le va a indicar que luego del $ haya dos

caracteres, y si queremos que sea una cifra de 0 a 3 por ejemplo, podemos indicarle ―\$(.+){0,3}‖

Básicamente estas son las reglas básicas a la hora de trabajar con expresiones regulares, ya la

clase que viene vamos a ver como utilizarlas con php. Saludos y disfruten la semana.

Clase 32: Expresiones Regulares (2)

Hola, hoy terminaremos con la clase de expresiones regulares. Para ello vamos a ver las funciones

de php más utilizadas a la hora de realizar tareas con las mismas.

Entre ellas veremos preg_match (que busca una expresión en un string), preg_match_all (que en

lugar de terminar en la primer expresión que encuentra, continua volcando en un array todas las

coincidencias) y preg_replace (que busca una expresión regular y reemplaza el contenido de esa

expresión por otro predefinido). ¡Comencemos!

preg_match Busca una expresión en un string. La sintaxis es:

preg_match ( $patron, $string, $match );

$patron es el patrón como vimos la clase pasada, hay que ponerlo entre barras (/), igual no se

preocupen, ya veremos un ejemplo.

$string es el lugar donde queremos buscar nuestro patrón.

$match es un parámetro opcional, no es necesario que este, si lo incluimos, ahí tendremos un

vector con los resultados coincidentes con nuestro patrón, si no lo incluimos preg_match nos va a

devolver true o false dependiendo si lo encontró o no.

Esta funcion (preg_match()) apenas encuentre una coincidencia va a dejar de correr.

54

Manual de PHP

<?

$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 patrón estaba definido en el

resultado, pero si cambiáramos el patrón por algo genérico

<?

$patron = "/^(.+)@/";

$string = “[email protected]”;

preg_match( $patron, $string, $matches );

?>

Ahora en $matches vamos a tener un vector con $matches[0] = “info@” y en $matches[1] =

“info”, esto se debe a que primero pone el resultado general, y segundo lo que esta dentro de los

paréntesis (), si hubiésemos puestos varios paréntesis, tendríamos también un $matches[2],

$matches[3], etc etc.

Siempre que quieran ver el contenido de un vector, con sus índices para saber donde esta el

contenido de cada cosa, pueden hacer

<?

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 función es similar a preg_match, pero en lugar de terminar en la primer expresión que

encuentra, continua volcando en un array todas las coincidencias.

preg_match_all ( $patron, $string, $matches)

En este caso, el resultado del var_dump para $matches va a ser:

array(2) {

[0]=>

array(1) {

[0]=>

string(5) “info@”

55

Manual de PHP

}

[1]=>

array(1) {

[0]=>

string(4) “info”

}

}

preg_replace Busca una expresión regular y reemplaza el contenido de esa expresión por otro predefinido.

preg_replace( $patron, $reemplazo, $sujeto )

En $patron vamos a poner el o los patrones a buscar, en $reemplazo, lo que queremos poner en el

lugar del patrón y $sujeto va a ser el string original en el que queremos buscar el contenido para

ser reemplazado.

Por ejemplo:

<?

$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 hoy, espero que hayan entendido todo el taller hasta este punto, ya que la clase

que viene empezaremos con ¡Practica! Como crear nuestro propio blog.

Clase 33: Creando nuestro propio blog (sistema de administración de contenido)

Introducción

¡Hola, bienvenidos al Taller de PHP de elWebmaster.com! El día de hoy veremos la introducción

para crear un blog desde cero. La idea de esta etapa final del curso, es que vean más o menos

cómo se relaciona todo lo que estuvimos viendo hasta el momento.

¿En qué consiste nuestro blog? Básicamente lo que vamos a hacer es un sistema que muestre

noticias, ordenadas por fecha cronológicamente descendente, a las cuales se les podrá dejar

comentarios. ¡Comencemos!

Diferentes niveles de accesos Para poder llevar a cabo nuestro blog vamos a necesitar tres niveles diferentes de usuarios, el

nivel base va a ser el usuario anónimo, o sea aquel usuario que nunca se registró en nuestro sitio,

podrá leer todo el contenido del mismo pero no podrá dejar comentarios.

El siguiente nivel es el usuario común o usuario registrado, que podrá dejar comentarios en las

noticias.

Y por último tenemos el usuario administrador que se va a encargar de publicar noticias y aprobar

comentarios de los usuarios.

56

Manual de PHP

Normalmente en los blogs no hace falta ser un usuario registrado para dejar comentarios, pero va

a ser útil que aprendan como se puede hacer un sistemita de registro, así que los permisos los

incluimos de esta forma para fines prácticos.

Diferentes características del contenido El contenido del sitio va a estar separado por categorías por lo que las noticias no sólo se deberán

mostrar cronológicamente sino que también se tendrán que poder filtrar por categorías.

FrontEnd y BackEnd. ¿Qué son? Esto más o menos ya lo expliqué en una de las clases anteriores pero lo vuelvo a comentar ya que

es útil. Por FrontEnd entendemos a lo que vé el usuario anónimo o usuario registrado, es la parte

frontal o visible del sitio.

Por BackEnd nos referimos al panel de control para administrar el sitio. A donde vamos a publicar

nuestras noticias, guardar borradores y aprobar comentarios

Bueno, todo eso es más o menos lo que vamos a ir viendo en las clases siguientes hasta terminar el

tallercito, espero que les guste lo que se viene. Nos vemos el lunes que viene.

Clase 34: Nuestro blog- Creación de la base de datos

Hola, acá estoy de nuevo para continuar con nuestro propio blog. En la clase

de hoy vamos a ver como va a ser la estructura de nuestra base de datos.

Básicamente vamos a tener cuatro tablas. Una de usuarios, otra de noticias, una tercera con las

categorías que van a tener las noticias y finalmente una tabla con los comentarios a las noticias.

Estructura de la base de datos de nuestro blog:

Tabla: usuarios

Field Type Null Key Default Extra

idUsuario int(11)

PRI NULL auto_increment

usuario varchar(50)

password char(32)

email varchar(50)

tipo enum(‘comun‘,'admin‘)

comun

Sintaxis sql para crear la tabla: CREATE TABLE `usuarios` (

`idUsuario` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,

57

Manual de PHP

`usuario` VARCHAR( 50 ) NOT NULL ,

`password` CHAR( 32 ) NOT NULL ,

`email` VARCHAR( 50 ) NOT NULL ,

`tipo` ENUM( „comun‟, „admin‟ ) NOT NULL DEFAULT „comun‟

) ENGINE = MYISAM ;

Hacemos que idUsuario sea la primary key con un autoincrement para que se vaya sumando a

medida que se van registrando nuevos usuarios, también ponemos que el campo usuario tenga un

varchar de 50, ya que no sabemos qué tan largos pueden llegar a ser los nombres de usuarios

elegidos por los mismos, lo que sí podemos hacer es limitárselo a 50.

Por otro lado el campo password va a tener siempre un ancho de 32 caracteres, porque para

mayor seguridad vamos a usar una codificación md5 y los códigos que genera la misma tienen

siempre la misma cantidad de caracteres.

El campo email es igual que el del usuario y el de tipo es con un enum, ya que solo vamos a tener

dos tipos de usuarios.

Por otro lado tenemos la tabla de noticias:

Tabla: noticias

Field Type Null Key Default Extra

idNoticia int(11)

PRI NULL auto_increment

titulo varchar(50)

copete varchar(255)

cuerpo text

idUsuario int(11)

idCategoria int(11)

fPublicacion timestamp

fCreacion timestamp

fModificacion timestamp

Sintaxis sql para crear la tabla: CREATE TABLE `noticias` (

`idNoticia` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`titulo` VARCHAR( 50 ) NOT NULL ,

`copete` VARCHAR( 255 ) NOT NULL ,

`cuerpo` TEXT NOT NULL ,

`idUsuario` INT( 11 ) NOT NULL ,

`idCategoria` INT( 11 ) NOT NULL ,

`fPublicacion` TIMESTAMP NOT NULL ,

`fCreacion` TIMESTAMP NOT NULL ,

`fModificacion` TIMESTAMP NOT NULL

) ENGINE = MYISAM ;

No hay mucho que explicar en esta, también tenemos una primary key en idNoticia para

identificar a cada una, tenemos una relación 1 a muchos entre una noticia y un usuario, es decir,

una noticia puede tener un sólo autor pero un autor puede tener muchas noticias. Lo mismo con

58

Manual de PHP

las categorías, una noticia puede tener una sola categoría pero una categoría puede tener muchas

noticias.

Y también tenemos tres campos de fechas, uno para la fecha de publicación de la noticia, otra

para la fecha en que se creó y finalmente cuando se modificó.

Para la tabla de categorías vamos a tener:

Tabla: categorías

Field Type Null Key Default Extra

idCategoria int(11)

PRI NULL auto_increment

valor varchar(50)

Sql: CREATE TABLE `categorias` (

`idCategoria` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`valor` VARCHAR( 50 ) NOT NULL

) ENGINE = MYISAM ;

Y finalmente la tabla de comentarios:

Tabla: comentarios

Field Type Null Key Default Extra

idComentario int(11)

PRI NULL auto_increment

comentario text

idUsuario int(11)

idNoticia int(11)

estado enum(‘sin validar‘,'apto‘)

sin validar

fCreacion timestamp

Sql: CREATE TABLE `comentarios` (

`idComentario` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`comentario` VARCHAR( 255 ) NOT NULL ,

`idUsuario` INT( 11 ) UNSIGNED NOT NULL ,

`idNoticia` INT( 11 ) UNSIGNED NOT NULL ,

`estado` ENUM( ‟sin validar‟, „apto‟ ) NOT NULL DEFAULT ‟sin validar‟,

`fCreacion` TIMESTAMP NOT NULL

) ENGINE = MYISAM ;

En esta tabla tenemos también una relación 1 a muchos con los usuarios, ya que un comentario

puede tener un único usuario pero un usuario puede tener muchos comentarios, lo mismo para las

noticias.

Por otro lado tenemos un estado, ya que apenas un usuario escribe un comentario el mismo está

sin validar por un administrador, en este punto podemos optar por mostrar o no los comentarios no

59

Manual de PHP

validados (igual todavía no estamos en esa disyuntiva) y los mismos aparecerán en un listado

general para que un admin los apruebe o los borre.

Y por último tenemos la fecha de creación del mismo.

Bueno, espero que les haya gustado la forma en que diagramamos nuestro blog, ya apartir de la

clase que viene vamos a empezar con la codificación del mismo.

Clase 35: Nuestro blog- Registro de usuario

¡Hola! ¿Cómo les va? En la clase de hoy vamos a ver cómo hacer para crear

un formulario para que se registren nuestros usuarios.

Por un lado vamos a tener algunos archivos en la carpeta raíz, pero por otro vamos a tener una

carpeta llamada “admin” que es donde va a estar nuestro backend. En esta carpeta también

tendremos dos archivos adicionales que son necesarios antes de arrancar.

Cómo vamos a organizar nuestros archivos La estructura de archivos por le momento será:

+ admin

————–

- config.php

- conexion.php

————–

- index.php

- registrar.php

El primer archivo que vamos a ver, config.php, es un archivo de configuración, en el cual

guardaremos constantes que vamos a necesitar a lo largo del sitio. El misma va a contener:

admin/config.php

<?php

// constantes de conexion de db

define( „DB_SERVER‟, „localhost‟ );

define( „DB_NAME‟, „blogit‟);

define( „DB_USER‟, „root‟);

define( „DB_PASS‟, ”);

?>

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

El siguiente archivo, conexion.php, contiene una función que devuelve ―false‖ o ―el puntero‖ a la

conexión con la base de datos, ya que en todas o casi todas las páginas de nuestro sitio

necesitaremos una conexión con la db, es práctico mantenerla dentro de una función.

admin/conexion.php

<?php

60

Manual de PHP

function conectar () {

$db_con = mysql_pconnect (DB_SERVER,DB_USER,DB_PASS);

if (!$db_con) return false;

if (!mysql_select_db (DB_NAME, $db_con)) return false;

return $db_con;

}

?>

Fíjense que estamos usando las constantes que agregamos en el archivo config.php, esto es

práctico a la hora de tener que cambiar de base de datos, o migrar el sitio, sólo tendremos que

modificar el archivo de configuración.

Listo, ya tenemos nuestros dos archivos antes de comenzar el proceso de registro.

En el archivo index.php tendremos una presentación por el momento, donde se podrá optar por

registrarse o ingresar (más adelante tendremos las noticias, pero todavía estamos muy verdes).

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

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

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

<body>

<h1>Blog Personal</h1>

<? if ( !empty($_GET['registro']) ) { ?>

<div>El registro ha sido exitoso.</div>

<? } ?>

<ul>

<li><a href=”ingresar.php”>Iniciar sesi&oacute;n</a></li>

<li><a href=”registrar.php”>Reg&iacute;strate gratis</a></li>

</ul>

</body>

</html>

Fíjense que en el body hay una sentencia php, es un if preguntando si no esta vacía 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, jamas verá el mensaje

dentro del if.

Bueno, finalmente vamos a nuestro archivo registrar.php, que es el que tiene la lógica de nuestro

registro. Primero les muestro todo el código y después les voy explicando qué es lo que hace cada

cosa.

<?php

// archivos necesarios

require_once „admin/config.php‟;

require_once „admin/conexion.php‟;

// obtengo puntero de conexion con la db

$dbConn = conectar();

// si se envio el formulario

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

// definimos las variables

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

61

Manual de PHP

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

if ( !empty($_POST['re-password']) )$rePassword = $_POST['re-password'];

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

// completamos la variable error si es necesario

if ( empty($usuario) ) $error['usuario'] = „Es obligatorio completar el

nombre de usuario‟;

if ( empty($password) ) $error['password'] = „Es obligatorio completar la

contraseña‟;

if ( empty($email) ) $error['email'] = „Es obligatorio completar el

email‟;

if ( $_POST['password'] != $_POST['re-password'] ) {

$error['re-password'] = „La contrase&ntilde;a no coincide‟;

}

// si no hay errores registramos al usuario

if ( empty($error) ) {

// inserto los datos de registro en la db

$query = “INSERT INTO `usuarios` (usuario,password,email) VALUES

(‟$usuario‟,'”.md5($password).”„,‟$email‟)”;

$result = mysql_query($query, $dbConn);

header( 'Location: index.php?registro=true' );

die;

}

}

?>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”

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

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

<body>

<h1>Registro de Usuario</h1>

<? if (!empty($error)) { ?>

<ul>

<? foreach ($error as $mensaje) { ?>

<li><?= $mensaje ?></li>

<? } ?>

</ul>

<? } ?>

<form action="registrar.php" method="post">

<p>

<label for=”usuario”>Nombre de usuario</label><br />

<input name=”usuario” type=”text” value=”<? if ( ! empty($usuario) ) echo $usuario;

?>” />

</p>

<p>

<label for=”password”>Contrase&ntilde;a</label><br />

<input name=”password” type=”password” value=”<? if ( ! empty($password) ) echo

$password; ?>” />

</p>

<p>

<label for=”re-password”>Repetir Contrase&ntilde;a</label><br />

62

Manual de PHP

<input name=”re-password” type=”password” value=”<? if ( ! empty($rePassword) )

echo $rePassword; ?>” />

</p>

<p>

<label for=”email”>Correo Electr&oacute;nico</label><br />

<input name=”email” type=”text” value=”<? if ( ! empty($email) ) echo $email; ?>”

/>

</p>

<p>

<input name=”submit” type=”submit” value=”Reg&iacute;strate” />

</p>

</form>

</body>

</html>

Antes de explicar el código php voy a explicarles el html, lo primero que tenemos es un if

preguntando si existe una variable $error, esta variable va a contener un array con los errores que

ha cometido el usuario al completar el formulario, por ejemplo no ha completado el nombre de

usuario. Fíjense que uso <?= $mensaje ?>, eso es equivalente a hacer <? echo $mensaje; ?>, es muy

práctico a la hora de tener que imprimir una sola linea o algo en el medio de html.

Luego tenemos el formulario, la acción del mismo es sobre el mismo archivo registrar.php, de esta

forma podemos marcar en el momento si hubo algún error, en caso de que no lo haya nosotros nos

encargaremos por php de redireccionar al archivo index.php avisando de que el mismo fue

exitoso.

Otra cosa a tener en cuenta es que en el value de cada campo del formulario hacemos un echo de

la variable correspondiente a dicho campo, esto es a que si el usuario se olvido de completar el

campo de email, que no pierda los datos que completó anteriormente.

Bueno, ya estamos listos para analizar el código php.

Primero incluimos nuestros dos archivos necesarios, config y conexion, y llamamos a la función

conexion guardando el puntero en una variable.

Una vez hecho esto, verificamos si se envió el formulario, para comenzar a registrar el usuario o

sólo mostrar el formulario.

Guardamos cada campo completado por el usuario en una variable para poder mostrársela al

usuario en caso de errores. Luego definimos nuestro array $error con los mensajes de error en caso

de que los haya.

Si no hay errores, agregamos el usuario en nuestra base de datos mediante la sentencia INSERT de

mysql. Y luego de esto redireccionamos a index.php?registro=true utilizando header()

Bueno, bastente sencillito ¿no? por las dudas acá les dejo los archivos que utilizamos hoy:

Clic aquí para descargar los archivos de ejemplo de este taller >>

63

Manual de PHP

Clase 36: Nuestro blog- Ingreso y reconocimiento de usuarios

Bueno, la clase pasada vimos cómo nuestros usuarios se podían registrar en

nuestro sitio, en la clase de hoy vamos a ver cómo van a poder iniciar sesión. Hay una cosita que

me quedó pendiente de la clase anterior y es explicar cómo es que hice la consulta para ingresar

los datos del usuario a través del sistema de registro.

Si prestan atención, en donde va la contraseña le agregué una función que se llama md5(), esta

función lo que nos permite es mantener las contraseñas encriptadas, de forma que ninguna

persona pueda llegar a conocer jamás la contraseña de un usuario.

Es muy común en los sitios serios utilizar este método de encriptación de contraseña. Una forma

de verificar que esto se este utilizando en los sitios es con el proceso de recuperación de la misma

en caso de olvido. Si les envían su contraseña tal cual la escribieron es porque no se está

encriptando, en cambio si les envían una nueva contraseña o la posibilidad de escribirla

nuevamente, es muy probable que estén encriptándola. Bueno, aclarado esto, vamos a la clase de

hoy.

Hoy vamos a utilizar tres archivos, uno ya lo tenemos (index.php) y los otros dos los vamos a crear

(ingresar.php y admin/esUsuario.php).

Primero veamos qué tiene el archivo que está dentro de la carpeta admin que se llama

esUsuario.php

PLAIN TEXT

1. function esUsuario ( $usuario, $password, $conexion ) {

2.

3. // verifica que esten los dos campos completos.

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

5.

6. // busqueda de los datos de usuarios para loguear.

7. $query = "SELECT idUsuario, usuario, password, tipo FROM

`usuarios` WHERE usuario = '$usuario'";

8. $resultado = mysql_query ($query, $conexion);

9. $row = mysql_fetch_array ($resultado);

10. $password_from_db = $row ['password'];

11. unset($query);

12.

13. // verifica que el pass enviado sea igual al pass de la db.

14. if ( $password_from_db == $password ) {

64

Manual de PHP

15. return $row;

16. } else return false;

17.

18. }

19.

20. ?&gt;

Es una función a la que le pasaremos por parámetros el nombre de usuario, la contraseña (ya

encriptada con md5) y el puntero de conexión. Básicamente lo que buscamos con esta función es

que nos devuelva un array con los datos del usuario en la base de datos en caso de que complete

bien la información solicitada o FALSE en caso de que no exista o la contraseña no coincida.

Lo primero que hacemos es verificar que tanto $usuario como $password no se encuentren vacíos.

Luego hacemos una consulta a la base de datos tratando de buscar toda la información del usuario

correspondiente con $usuario.

Luego de esto verificamos que la contraseña ingresada por parámetro $password sea igual con la

que se encuentra en la base de datos. En caso de que lo sean devolvemos un array con los datos

obtenidos de la db, caso contrario devolvemos FALSE.

Creo que quedó bastante sencillita, gracias a Ricardo Kotik me di cuenta que en el proceso de

registro me faltó algo fundamental, que es verificar que sea único el nombre de usuario, es decir,

que no esté siendo utilizado por otra persona, esto es fundamental, por lo que más adelante

veremos la forma de crear una función que verifique esto, o si no la solución que nos brindó

Ricardo en el comentario de la clase anterior es muy buena. Sólo hay que incluirlo en el proceso de

registro, cuando estamos comprobando los errores.

Bueno, ahora sí, vamos a nuestro archivo ingresar.php

PLAIN TEXT

1. // iniciamos sesiones

2. session_start ();

3.

4. // archivos necesarios

5. require_once 'admin/config.php';

6. require_once 'admin/conexion.php';

7. require_once 'admin/esUsuario.php';

8.

9. // obtengo puntero de conexion con la db

10. $dbConn = conectar();

11.

12. // verificamos que no este conectado el usuario

13. if ( !empty( $_SESSION['usuario'] ) &amp;&amp;

!empty($_SESSION['password']) ) {

65

Manual de PHP

14. if ( esUsuario( $_SESSION['usuario'], $_SESSION['password']

) ) {

15. header( 'Location: index.php' );

16. die;

17. }

18. }

19.

20. // si se envio el formulario

21. if ( !empty($_POST['submit']) ) {

22.

23. // definimos las variables

24. if ( !empty($_POST['usuario']) ) $usuario =

$_POST['usuario'];

25. if ( !empty($_POST['password']) ) $password =

$_POST['password'];

26.

27. // completamos la variable error si es necesario

28. if ( empty($usuario) ) $error['usuario'] = 'Es

obligatorio completar el nombre de usuario';

29. if ( empty($password) ) $error['password'] = 'Es

obligatorio completar la contraseña';

30.

31. // si no hay errores registramos al usuario

32. if ( empty($error) ) {

33.

34. // verificamos que los datos ingresados corresopndan a un

usuario

35. if ( $arrUsuario =

esUsuario($usuario,md5($password),$dbConn) ) {

36.

37. // definimos las sesiones

38. $_SESSION['usuario'] = $arrUsuario['usuario'];

39. $_SESSION['password'] = $arrUsuario['password'];

40.

41. header('Location: index.php');

42. die;

43.

44. } else {

45. $error['noExiste'] = 'El nombre de usuario o contraseña

no coinciden';

66

Manual de PHP

46. }

47.

48. }

49.

50. }

51.

52. ?&gt;

53. <h1>Inicio de sesión</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">Contraseña</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>

La parte de html no tiene nada del otro mundo, es igual a la de registro, con las diferencias en el

formulario, ahora tenemos menos campos y lo enviamos a ingresar.php, lo que nos importa en

esta parte es el script de php más que nada.

Vamos a ir explicándolo paso por paso. Como vamos a trabajar con Sesiones de PHP, es

fundamental antes que nada, avisarle al proceso que vamos las vamos a utilizar, para ellos vamos

a agregar la linea session_start ();

Luego de esto, incluimos nuestros archivos necesarios, los mismos que los de la clase pasada más

el nuevo que creamos recién para verificar el usuario.

Creamos el puntero a la base de datos y mediante un if verificamos que no estén vacíos ni

$_SESSION['usuario'] ni $_SESSION['password'], las sesiones estas todavía no las creamos, pero lo

haremos en caso de que se envíe correctamente el formulario de ingreso, pero como no queremos

que un usuario logueado vuelva a ingresar a este formulario, debido a que ya ha iniciado sesión, lo

que hacemos es verificar si no están vacías ambas sesiones, en caso positivo, verificamos mediante

67

Manual de PHP

la utilización de nuestra función esUsuario si pertenece a un usuario registrado, es decir si el

usuario y contraseña coinciden.

Nuevamente, en caso afirmativo redireccionamos al home de nuestro sitio, ya que no tendría que

estar viendo el formulario de ingreso un usuario que ya ha ingresado.

Listo, ya superamos la etapa del usuario logueado y no lo estaba, ahora verificamos si se envió el

formulario o no (al igual que en el proceso de registro, el formulario de ingreso lo estamos

apuntando al mismo archivo ingresar.php, por lo que verificamos si se cargó por primera vez la

página o lo hizo el usuario luego de enviar el formulario.

En caso de que exista el POST, vamos a definir dos variables con los post del formulario, $usuario y

$password, si alguno se encuentra vacio, creamos la variable de $error. Pasada esta verificación,

vamos a ver si los datos ingresados en el formulario realmente corresponden con un usuario

registrado en nuestro sitio.

Para ello, utilizamos nuevamente nuestra funcion esUsuario() pero esta vez la vamos a igualar a

una nueva variable $arrUsuario que en caso de que el usuario haya completado los datos bien,

contendrá un array con los datos que nos devuelve la funcion esUsuario() de la base de datos, en

caso que devuelva un error, $arrUsuario va a ser igual a false y el if donde la incluimos fallará.

Fíjense que en el segundo parámetro de la función nuevamente le estoy pasando md5() a

$password, en este caso lo estoy haciendo porque en la base de datos ya tenemos la contraseña

encriptada, y como en este caso el usuario la escribió directamente en el formulario, la misma no

lo está. En el uso anterior de esta función en esta misma página, no fue necesario pasarle md5 ya

que la sesión la vamos a guardar encriptada también.

Bueno, ya pasó todos los chequeos el envío del formulario, ya verificamos que los datos ingresados

por el usuario estén completos, correspondan a un usuario de la base de datos y además coinciden

las contraseñas de la db con las del post, es momento de crear las sesiones.

Vamos a crear dos sesiones, una sesión que va a contener el nombre de usuario y otra con la

contraseña encriptada. Luego de esto, redireccionamos al index.php, ya que un usuario logueado

no tendría que por que seguir viendo el formulario de ingreso.

Finalmente tenemos nuestra index.php modificada

PLAIN TEXT

1. // iniciamos session

2. session_start ();

3.

4. // archivos necesarios

5. require_once 'admin/config.php';

6. require_once 'admin/conexion.php';

7. require_once 'admin/esUsuario.php';

8.

9. // obtengo puntero de conexion con la db

10. $dbConn = conectar();

11.

68

Manual de PHP

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 sesión</a></li>

29. <li><a href="registrar.php">Regístrate 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

administración</a></li>

34. </ul>

Esta bastante más completa ahora la index de nuestro sitio, veamos el codigo php.

Iniciamos sesión, para ver si el usuario esta conectado, agregamos los archivos requeridos y

creamos el puntero de conexión. Hasta ahora nada distinto al resto de nuestros scripts.

Lo que vamos a agregar ahora es un if que va a verificar si existe una variable del tipo GET que se

llame salir, en caso de que exista destruimos y borramos todo tipo de sesión que tenga el usuario,

para que lo "desloguee".

Luego nos fijamos si tenemos sesiones, en caso de que estén, asignamos a $arrUsuario la función

esUsuario(). Y eso es todo nuestro código php.

En el html agregamos también un par de if más. El primero es un if verificando si existe el usuario,

en caso de que sea un usuario sin iniciar sesión le mostramos el ingresar o registrarse. En caso de

que sea un usuario conocido, le damos la bienvenida y la posibilidad de cerrar sesión.

El "salir" nuevamente, es un enlace al index con la variable get salir = true.

69

Manual de PHP

En caso de que sea un administrador, le mostramos un enlace al panel de control, mediante otro

if que verifique el tipo de usuario del que se trate.

Bueno, por ahora eso es todo por hoy, ya la clase que viene vamos a empezar a trabajar en el

back-end del sitio.

Haz clic aquí para descargar los archivos que utilizamos de ejemplo en la clase de hoy.

Clase 37: Nuestro blog-Sistema de noticias (1)

En la clase de hoy vamos a ver puntualmente un administrador de categorías

para nuestro sitio. Vamos a necesitar las mismas para que las diferentes publicaciones de nuestro

blog se puedan ubicar en diferentes categorías como pueden ser: editorial, talleres, noticias, etc.

Para ello primero vamos a ver como hacer que el administrador del sitio sea únicamente para los

usuarios con el tipo "admin" y luego veremos cómo hacer un ABM de categorías, es decir, Altas,

Bajas Modificaciones de las mismas.

Panel de admin exclusivo para admines Dentro de la carpeta admin ahora vamos a agregar un archivo "index.php" al que sólo podrán

acceder los administradores del sitio, y el cual contendrá el menú para actualizar nuestro sitio.

admin/index.php

PLAIN TEXT

1. // iniciamos session

2. session_start ();

3.

4. // archivos necesarios

5. require_once 'config.php';

6. require_once 'conexion.php';

7. require_once 'esUsuario.php';

8.

9. // obtengo puntero de conexion con la db

10. $dbConn = conectar();

11.

12. // verificamos que no este conectado el usuario

13. if ( !empty( $_SESSION['usuario'] ) &amp;&amp;

!empty($_SESSION['password']) ) {

14. $arrUsuario = esUsuario( $_SESSION['usuario'],

$_SESSION['password'], $dbConn );

70

Manual de PHP

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 - <a href="../index.php?salir=true">Salir</a>

26. <ul>

27. <li><a href="categorias.php">Administrar

Categorías</a></li>

28. </ul>

Al igual que en el index del home de nuestro blog, tenemos el inicio de session, el llamado a los

archivos necesarios y el puntero a la conexión de base de datos (última vez que comento esto, ya

que va a estar en todos nuestros archivos lo doy por sentado a partir de ahora).

Luego si tenemos session completamos un array con los datos del usuario logueado y finalmente

abajo preguntamos si el array esta vacío o no es un administrador, en caso de que esta condición

se cumpla, quiere decir que, o no estoy logueado o soy un usuario común, por lo que no debería

tener acceso a esta sección, entonces en ese caso, redireccionamos al home de nuestro sitio.

Eso es todo lo que vamos a tener de php en nuestro index del panel de control, más abajo, en el

html tenemos la bienvenida al usuario y el enlace con la opción de salir que apunta directamente

al home del blog, que es donde tenemos el condicional que pregunta si tenemos la variable get

salir. Siempre debe apuntar a ese archivo. Por ahora como opciones en nuestro menú agregamos el

administrador que categorías que es lo que vamos a empezar a ver hoy.

Por el momento nuestro archivo de categorías va a tener lo siguiente:

admin/categorias.php

PLAIN TEXT

1. // iniciamos session

2. session_start ();

3.

4. // archivos necesarios

5. require_once 'config.php';

6. require_once 'conexion.php';

7. require_once 'esUsuario.php';

8.

71

Manual de PHP

9. // obtengo puntero de conexion con la db

10. $dbConn = conectar();

11.

12. // verificamos que no este conectado el usuario

13. if ( !empty( $_SESSION['usuario'] ) &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'];

29.

30. // completamos la variable error si es necesario

31. if ( empty($nombre) ) $error['nombre'] = 'Es

obligatorio completar el nombre de la categoría';

32.

33. // si no hay errores registramos al usuario

34. if ( empty($error) ) {

35.

36. // inserto los datos de registro en la db

37. $query = "INSERT INTO `categorias` (valor) VALUES

('$nombre')";

38. $result = mysql_query($query, $dbConn);

39.

40. header( 'Location: categorias.php?add=true' );

41. die;

42.

72

Manual de PHP

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>Categorías</h2>

59. <div style="border: 1px solid #ff8800; padding: 5px;

background-color: #fdfdfd; width: 90%;">La categoría se agregó

con éxito.</div>

60. <div>

61. <h3>Listado de Categorías</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;">categoría</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

Manual de PHP

73. </tr>

74. </tbody></table>

75. </div>

76. <div>

77. <h3 id="add">Agregar nueva categoría</h3>

78. <form action="categorias.php" method="post"><label

for="nombre">Nombre de la categoría</label>

79.

80. <input name="nombre" type="text" /> <input name="submit"

type="submit" value="Agregar" /> </form></div>

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 verificación

la vamos a tener a lo largo de todos nuestros archivos dentro del panel de admin.

Luego tenemos la comprobación de si se envió el formulario para agregar nuevas categorías a

nuestro sitio. Las comprobaciones son muy similares a las que usamos en la registración del

usuario.

Finalmente tenemos una consulta a la base de datos para mostrar todas las categorías 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 semana que viene vemos como editar y borrar las categorías y les

paso el adjunto de los archivos incluyendo el abm de categorías. Saludos.

Clase 38: Nuestro blog-Sistema de noticias (2)

¡Hola! Hoy vamos a extender la clase anterior en la cual vimos cómo hacer

las altas de categorías para nuestro sitio. En la clase de hoy vamos a ver cómo editar las categorías

y como borrarlas.

Para ello vamos a utilizar un único archivo, admin/categorias.php, así es, ya lo tenemos creado,

sólo 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.

74

Manual de PHP

3. // iniciamos session

4. session_start ();

5.

6. // archivos necesarios

7. require_once 'config.php';

8. require_once 'conexion.php';

9. require_once 'esUsuario.php';

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. $arrUsuario = esUsuario( $_SESSION['usuario'],

$_SESSION['password'], $dbConn );

17. }

18.

19. // verificamos que sea un admin

20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' )

{

21. header( 'Location: ../index.php' );

22. die;

23. }

24.

25. // borramos una categoria

26. if ( !empty($_GET['del']) ) {

27.

28. $query = "DELETE FROM `categorias` WHERE idCategoria =

{$_GET['del']}";

29. $result = mysql_query($query, $dbConn);

30.

31. header( 'Location: categorias.php?dele=true' );

32. die;

33.

34. }

35.

36. // agregamos una categoria en la db

37. // si se envio el formulario

38. if ( !empty($_POST['submit']) ) {

75

Manual de PHP

39.

40. // definimos las variables

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

$_POST['nombre'];

42.

43. // completamos la variable error si es necesario

44. if ( empty($nombre) ) $error['nombre'] = 'Es

obligatorio completar el nombre de la categor&iacute;a';

45.

46. // si no hay errores registramos al usuario

47. if ( empty($error) ) {

48.

49. // inserto los datos de registro en la db

50. $query = "INSERT INTO `categorias` (valor) VALUES

('$nombre')";

51. $result = mysql_query($query, $dbConn);

52.

53. header( 'Location: categorias.php?add=true' );

54. die;

55.

56. }

57.

58. }

59.

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

61.

62. // definimos las variables

63. if ( !empty($_POST['nombre']) ) $nombre

= $_POST['nombre'];

64. if ( !empty($_POST['idCategoria']) ) $idCategoria

= $_POST['idCategoria'];

65.

66. // completamos la variable error si es necesario

67. if ( empty($nombre) ) $error['nombre'] = 'Es

obligatorio completar el nombre de la categor&iacute;a';

68. if ( empty($idCategoria) ) $error['idCategoria'] =

'Falta la ID de la categor&iacute;a';

69.

70. // si no hay errores registramos al usuario

71. if ( empty($error) ) {

76

Manual de PHP

72.

73. // inserto los datos de registro en la db

74. $query = "UPDATE `categorias` set valor =

'$nombre' WHERE idCategoria = $idCategoria";

75. $result = mysql_query($query, $dbConn);

76.

77. header( 'Location: categorias.php?edit=true' );

78. die;

79.

80. }

81.

82. }

83.

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. array_push( $arrCategorias,$row );

90. }

91.

92. // si tenemos una categoria puntual

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

94. // traemos una categoria

95. $query = "SELECT idCategoria, valor FROM `categorias`

WHERE idCategoria = {$_GET['id']}";

96. $resultado = mysql_query ($query, $dbConn);

97. $row = mysql_fetch_assoc ($resultado);

98. }

99.

100. ?>

101. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

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

102. <html xmlns="http://www.w3.org/1999/xhtml">

103. <head>

104. <meta http-equiv="Content-Type" content="text/html;

charset=iso-8859-1" />

105. <title>Blog Personal</title>

106. </head>

77

Manual de PHP

107.

108. <body>

109.

110. <h1>Blog Personal</h1>

111. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a

href="index.php">Panel de control</a> - <a

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

112. <h2>Categor&iacute;as</h2>

113. <? if ( !empty($_GET['add']) ) { ?>

114. <div style="background-color: #fdfdfd;border:1px solid

#ff8800;width:90%;padding:5px">La categor&iacute;a se

agreg&oacute; con &eacute;xito.</div>

115. <? } elseif ( !empty($_GET['dele']) ) { ?>

116. <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. <? } elseif ( !empty($_GET['edit']) ) { ?>

118. <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. <div>

123. <h3>Listado de Categor&iacute;as</h3>

124. <table style="width:90%;padding:5px;border:1px

solid #cccccc">

125. <tr>

126. <th style="background-

color:#cccccc;padding:5px;">id</th>

127. <th style="width:90%;background-

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

128. <th style="background-

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

129. </tr>

130. <? foreach ($arrCategorias as $categoria) { ?>

131. <tr>

132. <td style="padding:5px;"><? echo

$categoria['idCategoria']; ?></td>

78

Manual de PHP

133. <td style="padding:5px;"><? echo

$categoria['valor']; ?></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. </tr>

136. <? } ?>

137. </table>

138. </div>

139.

140. <? if ( empty($_GET['id']) ) { ?>

141. <div>

142. <h3 id="add">Agregar nueva

categor&iacute;a</h3>

143. <? if (!empty($error)) { ?>

144. <ul>

145. <? foreach ($error as $mensaje) { ?>

146. <li><?= $mensaje ?></li>

147. <? } ?>

148. </ul>

149. <? } ?>

150. <form action="categorias.php" method="post">

151.

152. <p>

153. <label for="nombre">Nombre de la

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

154. <input name="nombre" type="text"

value="" />

155. </p>

156. <p>

157. <input name="submit" type="submit"

value="Agregar" />

158. </p>

159. </form>

160. </div>

161. <? } ?>

162.

163. <? if ( !empty($_GET['id']) ) { ?>

79

Manual de PHP

164. <div style="background-color:#ff8800;padding:5px;

margin-top:10px;">

165. <h3 id="add">Editar categor&iacute;a</h3>

166. <? if (!empty($error)) { ?>

167. <ul>

168. <? foreach ($error as $mensaje) { ?>

169. <li><?= $mensaje ?></li>

170. <? } ?>

171. </ul>

172. <? } ?>

173. <form action="categorias.php" method="post">

174. <p>

175. <label for="nombre">Nombre de la

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

176. <input name="nombre" type="text"

value="<? echo $row['valor']; ?>" />

177. </p>

178. <p>

179. <input name="idCategoria" type="hidden"

value="<? echo $row['idCategoria']; ?>" />

180. <input name="submitEdit" type="submit"

value="Editar" />

181. </p>

182. </form>

183. </div>

184. <? } ?>

185.

186. </body>

187. </html>

Como podrán 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 condición 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 categoría que vimos la clase anterior y a continuación,

nos fijamos si se envió otro post pero ahora es submitEdit, el cual va a llevar los datos para editar

la categoría. En caso de que estén todos los campos obligatorios, editamos la categoría.

Tango en la edición como en el borrado, luego de realizar los cambios en la base de datos,

redireccionamos a la misma página pero con una variable get que va a informar que la acción se

realizó correctamente.

80

Manual de PHP

Bueno, luego de la edición tenemos la consulta para traer el listado de categorías y finalmente una

nueva condición preguntando si tenemos la variable get id, esta variable va a contener la id de la

categoría que queremos editar, para que podamos rellenar el formulario de edición con los datos

de la misma de la base de datos, por lo que, si se cumple la condición quiere decir que queremos

editar una categoría y hacemos la consulta para traer toda la información guardada en la db.

Luego pasamos al html, tenemos varias condiciones también. 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 acción se realizo con éxito.

Luego de esto, mostramos el listado con las categorías, fíjense que tenemos una columna al final

que contiene dos enlaces, uno para editar la categoría, y el otro para borrarla. Los dos enlaces

apuntan a la misma página pero con diferentes variables get, dependiendo si tenemos esas

variables es que vamos a realizar las acciones que expliqué más arriba. Ojo, es muy común al

principio, cuando somos principiantes pisarnos las variables con nombres iguales, tienen que

prestar mucha atención de elegir variables con diferentes nombres a lo largo de todo nuestro

script, en este caso el archivo admin/categorias.php.

A continuación tenemos dos condiciones nuevas más (la condición que pregunta si hay errores no

cuenta, ya la expliqué la clase anterior :p), una que pregunta si esta vacía la variable get ID, en

cuyo caso mostramos el formulario para agregar una nueva categoría, y la siguiente condición es si

NO esta vacía, entonces mostramos el formulario de edición.

Presten atención que en el formulario de edición agregamos un campo input hidden con la id de la

categoría que queremos editar. Esta va a ser necesaria para poder hacer el UPDATE en la base de

datos.

Bueno, eso es todo por hoy, les dejo los archivos usados en la clase para que descarguen.

Clase 39: Nuestro blog – Sistema de noticias (3)

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 cómo dar de alta noticias y mostrarlas en la home. Una

particularidad a diferencia del alta de las categorías es que ahora para dar de alta una noticia,

también vamos a necesitar de la tabla de categorías y la de usuarios, por lo que ya empezamos a

interactuar entre las diferentes tablas.

Antes de continuar, tengo que hacer una corrección 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

81

Manual de PHP

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. // iniciamos session

4. session_start ();

5.

6. // archivos necesarios

7. require_once 'config.php';

8. require_once 'conexion.php';

9. require_once 'esUsuario.php';

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. $arrUsuario = esUsuario( $_SESSION['usuario'],

$_SESSION['password'], $dbConn );

17. }

18.

19. // verificamos que sea un admin

20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' )

{

21. header( 'Location: ../index.php' );

22. die;

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>

82

Manual de PHP

29. <meta http-equiv="Content-Type" content="text/html;

charset=iso-8859-1" />

30. <title>Blog Personal</title>

31. </head>

32.

33. <body>

34.

35. <h1>Blog Personal</h1>

36. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a

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

37. <ul>

38. <li><a href="categorias.php">Administrar

Categor&iacute;as</a></li>

39. <li><a href="noticias.php">Administrar

Noticias</a></li>

40. </ul>

41.

42. </body>

43. </html>

Ahora sí, pego el código de admin/noticias.php y lo paso a explicar

PLAIN TEXT

1. <?

2.

3. // iniciamos session

4. session_start ();

5.

6. // archivos necesarios

7. require_once 'config.php';

8. require_once 'conexion.php';

9. require_once 'esUsuario.php';

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']) ) {

83

Manual de PHP

16. $arrUsuario = esUsuario( $_SESSION['usuario'],

$_SESSION['password'], $dbConn );

17. }

18.

19. // verificamos que sea un admin

20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' )

{

21. header( 'Location: ../index.php' );

22. die;

23. }

24.

25. // agregamos una categoria en la db

26. // si se envio el formulario

27. if ( !empty($_POST['submit']) ) {

28.

29. // definimos las variables

30. if ( !empty($_POST['titulo']) ) $titulo

= $_POST['titulo'];

31. if ( !empty($_POST['copete']) ) $copete

= $_POST['copete'];

32. if ( !empty($_POST['cuerpo']) ) $cuerpo

= $_POST['cuerpo'];

33. if ( !empty($_POST['idCategoria']) ) $idCategoria

= $_POST['idCategoria'];

34. if ( !empty($_POST['fPublicacion']) ) $fPublicacion

= $_POST['fPublicacion'];

35.

36. // completamos la variable error si es necesario

37. if ( empty($titulo) ) $error['titulo'] = 'Es

obligatorio completar el t&iacute;tulo de la noticia';

38. if ( empty($copete) ) $error['copete'] = 'Es

obligatorio completar el copete de la noticia';

39. if ( empty($cuerpo) ) $error['cuerpo'] = 'Es

obligatorio completar el cuerpo de la noticia';

40. if ( empty($idCategoria) ) $error['idCategoria'] =

'Es obligatorio seleccionar una categor&iacute;a para la

noticia';

41.

42. // si no hay errores registramos al usuario

43. if ( empty($error) ) {

84

Manual de PHP

44.

45. // inserto los datos de registro en la db

46. $fCreacion = date("Y-m-d H:i:s");

47. $fModificacion = date("Y-m-d H:i:s");

48. if ( empty($fPublicacion) ) $fPublicacion =

date("Y-m-d H:i:s");

49. $idUsuario = $arrUsuario['idUsuario'];

50. $query = "INSERT INTO `noticias`

(titulo,copete,cuerpo,idCategoria,idUsuario,fCreacion,fModificac

ion,fPublicacion) VALUES

('$titulo','$copete','$cuerpo','$idCategoria','$idUsuario','$fCr

eacion','$fModificacion','$fPublicacion')";

51. $result = mysql_query($query, $dbConn);

52. header( 'Location: noticias.php?add=true' );

53. die;

54.

55. }

56.

57. }

58.

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. array_push( $arrCategorias,$row );

65. }

66.

67. // traemos listado de noticias

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. array_push( $arrNoticias,$row );

73. }

74. ?>

75. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

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

85

Manual de PHP

76. <html xmlns="http://www.w3.org/1999/xhtml">

77. <head>

78. <meta http-equiv="Content-Type" content="text/html;

charset=iso-8859-1" />

79. <title>Blog Personal</title>

80. </head>

81.

82. <body>

83.

84. <h1>Blog Personal</h1>

85. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a

href="index.php">Panel de control</a> - <a

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

86. <h2>Noticias</h2>

87. <? if ( !empty($_GET['add']) ) { ?>

88. <div style="background-color: #fdfdfd;border:1px solid

#ff8800;width:90%;padding:5px">La noticia se agreg&oacute; con

&eacute;xito.</div>

89. <? } ?>

90.

91. <div>

92. <h3>Listado de Noticias</h3>

93. <table style="width:90%;padding:5px;border:1px

solid #cccccc">

94. <tr>

95. <th style="background-

color:#cccccc;padding:5px;">id</th>

96. <th style="width:90%;background-

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

97. <th style="background-

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

98. </tr>

99. <? foreach ($arrNoticias as $noticias) { ?>

100. <tr>

101. <td style="padding:5px;"><? echo

$noticias['idNoticia']; ?></td>

102. <td style="padding:5px;"><? echo

$noticias['titulo']; ?></td>

103. <td style="padding:5px;"><a

href="noticias.php?id=<? echo $noticias['idNoticia'];

86

Manual de PHP

?>">Editar</a> - <a href="noticias.php?del=<?=

$categoria['idNoticia'] ?>">Borrar</a>

104. </tr>

105. <? } ?>

106. </table>

107. </div>

108.

109. <? if ( empty($_GET['id']) ) { ?>

110. <div>

111. <h3 id="add">Agregar nueva noticia</h3>

112. <? if (!empty($error)) { ?>

113. <ul>

114. <? foreach ($error as $mensaje) { ?>

115. <li><?= $mensaje ?></li>

116. <? } ?>

117. </ul>

118. <? } ?>

119. <form action="noticias.php" method="post">

120.

121. <p>

122. <label for="titulo">T&iacute;tulo de la

noticia</label><br />

123. <input name="titulo" type="text"

value="" />

124. </p>

125. <p>

126. <label

for="idCategoria">Categoría</label><br />

127. <select name="idCategoria">

128. <option value="">Seleccione una

categoría</option>

129. <option value="">------------------

------</option>

130. <? foreach ( $arrCategorias as

$categoria ) { ?>

131. <option value="<? echo

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

?></option>

132. <? } ?>

133. </select>

87

Manual de PHP

134. </p>

135. <p>

136. <label for="fPublicacion">Fecha de

publicacion (aaaa-mm-dd hh:mm:ss) Ej: 2008-10-29 17:20:00

</label><br />

137. <input name="fPublicacion" type="text"

value="" />

138. </p>

139. <p>

140. <label for="copete">Copete</label><br

/>

141. <textarea rows="5" cols="50"

name="copete"></textarea>

142. </p>

143. <p>

144. <label for="cuerpo">Cuerpo</label><br

/>

145. <textarea rows="10" cols="50"

name="cuerpo"></textarea>

146. </p>

147. <p>

148. <input name="submit" type="submit"

value="Agregar" />

149. </p>

150. </form>

151. </div>

152. <? } ?>

153.

154. </body>

155. </html>

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 opción 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 ningún 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ó vacía, la fecha de publicación es la misma que las otras dos, caso

contrario, rellenamos con el post.

88

Manual de PHP

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 sólo traemos todas las

noticias para mostrar sino que también traemos todas las categorías. Esto es así porque usaremos

el listado de categorías para elegir la categoría de cada noticia.

Si prestamos atención a la parte del formulario, vamos a ver cómo ahora tenemos un SELECT BOX

con un FOREACH que va a recorrer todas las categorías 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 categorías.

Finalmente vamos a modificar nuestra home para mostrar las noticias que vamos agregando.

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. // vemos si el usuario quiere desloguar

15. if ( !empty($_GET['salir']) ) {

16. // borramos y destruimos todo tipo de sesion del

usuario

17. session_unset();

18. session_destroy();

19. }

20.

21. // verificamos que no este conectado el usuario

22. if ( !empty( $_SESSION['usuario'] ) &&

!empty($_SESSION['password']) ) {

23. $arrUsuario = esUsuario( $_SESSION['usuario'],

$_SESSION['password'], $dbConn );

24. }

89

Manual de PHP

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. array_push( $arrNoticias,$row );

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. <meta http-equiv="Content-Type" content="text/html;

charset=iso-8859-1" />

41. <title>Blog Personal</title>

42. </head>

43.

44. <body>

45.

46. <h1>Blog Personal</h1>

47.

48. <? if ( !empty($_GET['registro']) ) { ?>

49. <div>El registro ha sido exitoso.</div>

50. <? } ?>

51.

52. <? if ( empty($arrUsuario['usuario']) ) { ?>

53. <ul>

54. <li><a href="ingresar.php">Iniciar

sesi&oacute;n</a></li>

55. <li><a href="registrar.php">Reg&iacute;strate

gratis</a></li>

56. </ul>

57. <? } else { ?>

90

Manual de PHP

58. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a

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

59. <? if ( $arrUsuario['tipo'] == 'admin' ) { ?>

60. <ul>

61. <li><a href="admin/index.php">Panel de

administraci&oacute;n</a></li>

62. </ul>

63. <? } ?>

64. <? } ?>

65.

66. <h2>Noticias</h2>

67. <? foreach ( $arrNoticias as $noticias ) { ?>

68. <div>

69. <h3><a href="vernoticia.php?idNoticia=<? echo

$noticias['idNoticia']; ?>"><? echo $noticias['titulo'];

?></a></h3>

70. <p><? echo $noticias['copete']; ?></p>

71. </div>

72. <? } ?>

73. </body>

74. </html>

Lo más relevante en las modificaciones que le hicimos es en la parte de php la consulta que trae

todas las noticias, pero ahora ordenadas por fPubliacion descendente y ademas sólo muestra

aquellas que la fecha de publicacion es anterior a "ahora", de esta forma podemos programar

noticias para que sean mostradas a todo el mundo cuando se llegue a la fecha y hora deseada.

Un último cambio que vamos a destacar, es que en el listado de noticias que estamos mostrando,

al titulo le agregué un enlace a una nueva página, la misma va a tener la noticia completa.

Bueno, eso es todo por hoy, la semana que viene vamos a ver cómo editar y borrar las noticias y

veremos tambien como se ve la noticia completa para los visitantes a nuestro sitio.

Aquí les dejo los archivos usados en la clase para que descarguen.

Clase 40: Nuestro blog – Sistema de noticias (4)

Hola, acá estamos de nuevo con el taller de PHP. En el día de hoy vamos a

ver cómo editar una noticia y cómo borrarla.

91

Manual de PHP

Si vienen siguiendo el taller más o menos al día verán que no hay grandes diferencias con respecto

a las modificaciones y bajas de las categorías. Pero bueno, no nos adelantemos y vamos a lo

nuestro.

Trabajaremos hoy únicamente sobre el archivo admin/noticias.php.

PLAIN TEXT

1. <?

2.

3. // iniciamos session

4. session_start ();

5.

6. // archivos necesarios

7. require_once 'config.php';

8. require_once 'conexion.php';

9. require_once 'esUsuario.php';

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. $arrUsuario = esUsuario( $_SESSION['usuario'],

$_SESSION['password'], $dbConn );

17. }

18.

19. // verificamos que sea un admin

20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' )

{

21. header( 'Location: ../index.php' );

22. die;

23. }

24.

25. // borramos una noticia si obtenemos la variable GET del

26. if ( !empty($_GET['del']) ) {

27.

28. $query = "DELETE FROM `noticias` WHERE idNoticia =

{$_GET['del']}";

29. $result = mysql_query($query, $dbConn);

30.

92

Manual de PHP

31. header( 'Location: noticias.php?dele=true' );

32. die;

33.

34. }

35.

36. // agregamos una noticia en la db

37. // si se envio el formulario

38. if ( !empty($_POST['submit']) ) {

39.

40. // definimos las variables

41. if ( !empty($_POST['titulo']) ) $titulo

= $_POST['titulo'];

42. if ( !empty($_POST['copete']) ) $copete

= $_POST['copete'];

43. if ( !empty($_POST['cuerpo']) ) $cuerpo

= $_POST['cuerpo'];

44. if ( !empty($_POST['idCategoria']) ) $idCategoria

= $_POST['idCategoria'];

45. if ( !empty($_POST['fPublicacion']) ) $fPublicacion

= $_POST['fPublicacion'];

46.

47. // completamos la variable error si es necesario

48. if ( empty($titulo) ) $error['titulo'] = 'Es

obligatorio completar el t&iacute;tulo de la noticia';

49. if ( empty($copete) ) $error['copete'] = 'Es

obligatorio completar el copete de la noticia';

50. if ( empty($cuerpo) ) $error['cuerpo'] = 'Es

obligatorio completar el cuerpo de la noticia';

51. if ( empty($idCategoria) ) $error['idCategoria'] =

'Es obligatorio seleccionar una categor&iacute;a para la

noticia';

52.

53. // si no hay errores registramos al usuario

54. if ( empty($error) ) {

55.

56. // inserto los datos de registro en la db

57. $fCreacion = date("Y-m-d H:i:s");

58. $fModificacion = date("Y-m-d H:i:s");

59. if ( empty($fPublicacion) ) $fPublicacion =

date("Y-m-d H:i:s");

93

Manual de PHP

60. $idUsuario = $arrUsuario['idUsuario'];

61. $query = "INSERT INTO `noticias`

(titulo,copete,cuerpo,idCategoria,idUsuario,fCreacion,fModificac

ion,fPublicacion) VALUES

('$titulo','$copete','$cuerpo','$idCategoria','$idUsuario','$fCr

eacion','$fModificacion','$fPublicacion')";

62. $result = mysql_query($query, $dbConn);

63. header( 'Location: noticias.php?add=true' );

64. die;

65.

66. }

67.

68. }

69.

70. // si se envio el formulario de edicion

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

72.

73. // definimos las variables

74. if ( !empty($_POST['idNoticia']) ) $idNoticia =

$_POST['idNoticia'];

75. if ( !empty($_POST['titulo']) ) $titulo

= $_POST['titulo'];

76. if ( !empty($_POST['copete']) ) $copete

= $_POST['copete'];

77. if ( !empty($_POST['cuerpo']) ) $cuerpo

= $_POST['cuerpo'];

78. if ( !empty($_POST['idCategoria']) ) $idCategoria

= $_POST['idCategoria'];

79. if ( !empty($_POST['fPublicacion']) ) $fPublicacion

= $_POST['fPublicacion'];

80.

81. // completamos la variable error si es necesario

82. if ( empty($idNoticia) ) $error['idNoticia'] =

'Es obligatorio tener la id de la noticia que se desea

modificar';

83. if ( empty($titulo) ) $error['titulo'] = 'Es

obligatorio completar el t&iacute;tulo de la noticia';

84. if ( empty($copete) ) $error['copete'] = 'Es

obligatorio completar el copete de la noticia';

94

Manual de PHP

85. if ( empty($cuerpo) ) $error['cuerpo'] = 'Es

obligatorio completar el cuerpo de la noticia';

86. if ( empty($idCategoria) ) $error['idCategoria']

= 'Es obligatorio seleccionar una categor&iacute;a para la

noticia';

87.

88. // si no hay errores editamos la noticia

89. if ( empty($error) ) {

90.

91.

92. // actualizamos la fecha de modificacion y de

publicacion

93. $fModificacion = date("Y-m-d H:i:s");

94. if ( empty($fPublicacion) ) $fPublicacion =

date("Y-m-d H:i:s");

95. $idUsuario = $arrUsuario['idUsuario'];

96.

97. // inserto los datos de registro en la db

98. $query = "UPDATE `noticias` set titulo =

'$titulo', copete = '$copete', cuerpo = '$cuerpo', idCategoria =

$idCategoria, idUsuario = $idUsuario, fModificacion =

'$fModificacion', fPublicacion = '$fPublicacion' WHERE idNoticia

= $idNoticia";

99. $result = mysql_query($query, $dbConn);

100.

101. header( 'Location: noticias.php?edit=true' );

102. die;

103.

104. }

105.

106. }

107.

108. // traemos listado de categorias

109. $arrCategorias = array();

110. $query = "SELECT idCategoria, valor FROM `categorias` ORDER

BY valor ASC";

111. $resultado = mysql_query ($query, $dbConn);

112. while ( $row = mysql_fetch_assoc ($resultado)) {

113. array_push( $arrCategorias,$row );

114. }

95

Manual de PHP

115.

116. // traemos listado de noticias

117. $arrNoticias = array();

118. $query = "SELECT idNoticia, titulo FROM `noticias` ORDER BY

idNoticia DESC";

119. $resultado = mysql_query ($query, $dbConn);

120. while ( $row = mysql_fetch_assoc ($resultado)) {

121. array_push( $arrNoticias,$row );

122. }

123.

124. // si tenemos una categoria puntual

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

126.

127. // traemos una categoria

128. $query = "SELECT idNoticia, titulo, copete, cuerpo,

idCategoria, fPublicacion FROM `noticias` WHERE idNoticia =

{$_GET['id']}";

129. $resultado = mysql_query ($query, $dbConn);

130. $row = mysql_fetch_assoc ($resultado);

131. }

132.

133. ?>

134. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

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

135. <html xmlns="http://www.w3.org/1999/xhtml">

136. <head>

137. <meta http-equiv="Content-Type" content="text/html;

charset=iso-8859-1" />

138. <title>Blog Personal</title>

139. </head>

140.

141. <body>

142.

143. <h1>Blog Personal</h1>

144. <p>Bienvenido <?= $arrUsuario['usuario'] ?> - <a

href="index.php">Panel de control</a> - <a

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

145. <h2>Noticias</h2>

146. <? if ( !empty($_GET['add']) ) { ?>

96

Manual de PHP

147. <div style="background-color: #fdfdfd;border:1px solid

#ff8800;width:90%;padding:5px">La noticia se agreg&oacute; con

&eacute;xito.</div>

148. <? } elseif ( !empty($_GET['dele']) ) { ?>

149. <div style="background-color: #fdfdfd;border:1px solid

#ff8800;width:90%;padding:5px">La noticia ha sido borrada con

&eacute;xito.</div>

150. <? } elseif ( !empty($_GET['edit']) ) { ?>

151. <div style="background-color: #fdfdfd;border:1px solid

#ff8800;width:90%;padding:5px">La noticia ha sido editada con

&eacute;xito.</div>

152. <? } ?>

153.

154. <div>

155. <h3>Listado de Noticias</h3>

156. <table style="width:90%;padding:5px;border:1px

solid #cccccc">

157. <tr>

158. <th style="background-

color:#cccccc;padding:5px;">id</th>

159. <th style="width:90%;background-

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

160. <th style="background-

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

161. </tr>

162. <? foreach ($arrNoticias as $noticias) { ?>

163. <tr>

164. <td style="padding:5px;"><? echo

$noticias['idNoticia']; ?></td>

165. <td style="padding:5px;"><? echo

$noticias['titulo']; ?></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. </tr>

168. <? } ?>

169. </table>

170. </div>

171.

97

Manual de PHP

172. <? if ( empty($_GET['id']) ) { ?>

173. <div>

174. <h3 id="add">Agregar nueva noticia</h3>

175. <? if (!empty($error)) { ?>

176. <ul>

177. <? foreach ($error as $mensaje) { ?>

178. <li><?= $mensaje ?></li>

179. <? } ?>

180. </ul>

181. <? } ?>

182. <form action="noticias.php" method="post">

183.

184. <p>

185. <label for="titulo">T&iacute;tulo de la

noticia</label><br />

186. <input name="titulo" type="text"

value="" />

187. </p>

188. <p>

189. <label

for="idCategoria">Categoría</label><br />

190. <select name="idCategoria">

191. <option value="">Seleccione una

categoría</option>

192. <option value="">------------------

------</option>

193. <? foreach ( $arrCategorias as

$categoria ) { ?>

194. <option value="<? echo

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

?></option>

195. <? } ?>

196. </select>

197. </p>

198. <p>

199. <label for="fPublicacion">Fecha de

publicacion (aaaa-mm-dd hh:mm:ss) Ej: 2008-10-29 17:20:00

</label><br />

200. <input name="fPublicacion" type="text"

value="" />

98

Manual de PHP

201. </p>

202. <p>

203. <label for="copete">Copete</label><br

/>

204. <textarea rows="5" cols="50"

name="copete"></textarea>

205. </p>

206. <p>

207. <label for="cuerpo">Cuerpo</label><br

/>

208. <textarea rows="10" cols="50"

name="cuerpo"></textarea>

209. </p>

210. <p>

211. <input name="submit" type="submit"

value="Agregar" />

212. </p>

213. </form>

214. </div>

215. <? } ?>

216.

217. <? if ( !empty($_GET['id']) ) { ?>

218. <div style="background-color:#ff8800;padding:5px;

margin-top:10px;">

219. <h3 id="add">Editar noticia</h3>

220. <? if (!empty($error)) { ?>

221. <ul>

222. <? foreach ($error as $mensaje) { ?>

223. <li><?= $mensaje ?></li>

224. <? } ?>

225. </ul>

226. <? } ?>

227. <form action="noticias.php" method="post">

228. <p>

229. <label for="titulo">T&iacute;tulo de la

noticia</label><br />

230. <input name="titulo" type="text"

value="<? echo $row['titulo']; ?>" />

231. </p>

232. <p>

99

Manual de PHP

233. <label

for="idCategoria">Categoría</label><br />

234. <select name="idCategoria">

235. <option value="">Seleccione una

categoría</option>

236. <option value="">------------------

------</option>

237. <? foreach ( $arrCategorias as

$categoria ) { ?>

238. <option value="<? echo

$categoria['idCategoria']; ?>" <? if ( $categoria['idCategoria']

== $row['idCategoria'] ) echo 'selected="selected"' ?>><? echo

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

239. <? } ?>

240. </select>

241. </p>

242. <p>

243. <label for="fPublicacion">Fecha de

publicacion (aaaa-mm-dd hh:mm:ss) Ej: 2008-10-29 17:20:00

</label><br />

244. <input name="fPublicacion" type="text"

value="<? echo $row['fPublicacion']; ?>" />

245. </p>

246. <p>

247. <label for="copete">Copete</label><br

/>

248. <textarea rows="5" cols="50"

name="copete"><? echo $row['copete']; ?></textarea>

249. </p>

250. <p>

251. <label for="cuerpo">Cuerpo</label><br

/>

252. <textarea rows="10" cols="50"

name="cuerpo"><? echo $row['cuerpo']; ?></textarea>

253. </p>

254. <p>

255. <input name="idNoticia" type="hidden"

value="<? echo $row['idNoticia']; ?>" />

256. <input name="submitEdit" type="submit"

value="Editar" />

100

Manual de PHP

257. </p>

258.

259.

260. </form>

261. </div>

262. <? } ?>

263.

264. </body>

265. </html>

Fíjense que al archivo que teníamos 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 edición, verificamos que estén todos los datos obligatorios y editamos.

En la parte del html lo mismo, la única gran diferencia con respecto a la edición de categorías 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 condición, preguntando si

la id de la categoría que le corresponde coincide con la id de categoría 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.

Clase 41: Nuestro blog – Sistema de Comentarios (1)

¡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 categorías

y la de usuarios.

Como en todas nuestras clases del blog primero voy a mostrar el código y después lo voy a pasar a

explicar.

PLAIN TEXT

1. <?

2.

3. // iniciamos session

4. session_start ();

101

Manual de PHP

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')";

102

Manual de PHP

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. ?>

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-8859-1" />

57. <title>Blog Personal</title>

58. </head>

59.

60. <body>

61.

62. <h1>Blog Personal</h1>

63.

64. <? if ( empty($arrUsuario['usuario']) ) { ?>

65. <ul>

103

Manual de PHP

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 { ?>

104

Manual de PHP

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>

¿Que cosas nuevas tenemos acá?

Con lo primero que nos encontramos es con una verificación 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. Fíjense 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 poníamos un STRING con el error a mostrar.

Bueno, si no tiene errores, hacemos el insert en la base de datos.

A continuación tenemos la consulta para traer la noticia, esta consulta es bastante más compleja

que las que veníamos usando, ya que hace dos JOINS, uno con la tabla de categorías y otro con la

tabla de usuarios. De esta forma, en una sola consulta obtenemos el nombre de la categoría y el

nombre de usuario. Recuerden que en la tabla de noticias solo guardábamos las id de ambos. Esto

nos permite estar siempre actualizados en caso de que cambiemos el nombre de usuario o nombre

de la categoría 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 cómo mostrar el listado de comentarios

aprobados por un admin en esta misma página, y el panel de admin para aprobar o borrarlos.

Buena semana.

Clase 42: Nuestro blog - Sistema de Comentarios (2)

Hola, ya queda poquito para nuestro blogsito, obviamente que después les va

a faltar diseño pero bueno, eso ya le corresponde al taller de Dreamweaver y Photoshop .

105

Manual de PHP

En la clase de hoy vamos a ver como moderar los comentarios que hemos recibido, para ello

agregaremos la opción en el administrador y luego agregaremos los comentarios aprobados en la

página de la nota comentada.

Los archivos que tocaremos hoy son admin/comentarios.php (nuevo), admin/index.php y

vernoticia.php

A admin/index.php sólo le vamos a agregar el enlace a admin/comentarios.php para que se pueda

acceder desde el menu de administración. Veamos este último archivo (el de comentarios.php)

admin/comentarios.php

PLAIN TEXT

1. <?

2.

3. // iniciamos session

4. session_start ();

5.

6. // archivos necesarios

7. require_once 'config.php';

8. require_once 'conexion.php';

9. require_once 'esUsuario.php';

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. $arrUsuario = esUsuario( $_SESSION['usuario'],

$_SESSION['password'], $dbConn );

17. }

18.

19. // verificamos que sea un admin

20. if ( empty($arrUsuario) || $arrUsuario['tipo'] != 'admin' )

{

21. header( 'Location: ../index.php' );

22. die;

23. }

24.

25. // borramos un comentario

26. if ( !empty($_GET['del']) ) {

27.

106

Manual de PHP

28. $query = "DELETE FROM `comentarios` WHERE idComentario

= {$_GET['del']}";

29. $result = mysql_query($query, $dbConn);

30.

31. header( 'Location: comentarios.php?dele=true' );

32. die;

33.

34. }

35.

36. // aprobamos un comentario

37. if ( !empty($_GET['apr']) ) {

38.

39. $query = "UPDATE `comentarios` set estado = 'apto'

WHERE idComentario = {$_GET['apr']}";

40. $result = mysql_query($query, $dbConn);

41.

42. header( 'Location: comentarios.php?aprobar=true' );

43. die;

44.

45. }

46.

47. // editamos el comentario

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

49.

50. // definimos las variables

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

= $_POST['comentario'];

52. if ( !empty($_POST['idComentario']) ) $idComentario

= $_POST['idComentario'];

53.

54. // completamos la variable error si es necesario

55. if ( empty($comentario) ) $error['comentario'] =

'Es obligatorio tener un cuerpo';

56. if ( empty($idComentario) ) $error['idComentario']

= 'Es obligatoria la id de comentario';

57.

58. // si no hay errores registramos al usuario

59. if ( empty($error) ) {

60.

61. // inserto los datos de registro en la db

107

Manual de PHP

62. $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">

108

Manual de PHP

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>

109

Manual de PHP

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<?

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.

110

Manual de PHP

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

111

Manual de PHP

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"

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

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>

112

Manual de PHP

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>

220. <p>Publicado por <b><?php echo $noticia['usuario'];

?></b> en <i><?php echo $noticia['categoria']; ?></i></p>

221. <div><?php echo $noticia['cuerpo']; ?></div>

222.

223. <h2>Comentarios</h2>

224. <div>

225. <? foreach ($arrComentarios as $comentario) { ?>

226. <p>

227. <b><? echo $comentario['usuario']; ?></b>

dijo:<br />

228. <i><? echo $comentario['comentario']; ?></i>

229. </p>

230. <? } ?>

231. </div>

232.

233. <div>

234. <?php if ( !empty( $arrUsuario ) ) { ?>

235.

236. <form action="vernoticia.php?idNoticia=<?php

echo $_GET['idNoticia']; ?>" method="post">

237. <p>

238. <label for="comentario">Dejar un

comentario</label><br />

239. <textarea rows="3" cols="50"

name="comentario"></textarea>

240. </p>

241. <p>

113

Manual de PHP

242. <input name="submit" type="submit"

value="Enviar" />

243. </p>

244. </form>

245.

246. <?php } else { ?>

247. <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>

114

Manual de PHP

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 ortografía de nuestros usuarios, no para editarles el contenido del

mismo .

Para borrar es muy similar a como veníamos haciéndolo con los otros elementos. El aprobar en

realidad es también 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 veníamos haciendo con los

otros elementos.

De hecho la mayor dificultad que tenemos en esta página 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 quién hizo el

comentario y a que noticia pertenece el mismo). Prestar atención que estamos trayendo

unicamente los comentarios que estan SIN VALIDAR, es decir, todos aquellos que no hemos visto

aún.

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 específica.

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

115

Manual de PHP

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

116

Manual de PHP

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. ?>

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>

117

Manual de PHP

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>

118

Manual de PHP

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 después 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.

Clase 43: Conclusión

Bueno gente, el taller ya terminó. ¡Espero que hayan disfrutado el mismo y que hayan podido

aprender mucho! Sería muy interesante que sigan practicando y que no tengan miedo a probar y

tocar. ¡Siempre van a poder recurrir a elWebmaster.com para sacarse las dudas!

Esta ultima ―clase‖ también va a servir de espacio para que dejen todas sus preguntas y consultas

sobre PHP, de modo que los comentarios serán nuestro ―punto de encuentro‖.