Está en la página 1de 87

Aprende PHP sin dolor

Por Francisco Javier Arce


Anguiano http://www.pacoarce.com
1. Sintaxis general de PHP
Estructura de archivos PHP
Mezclar HTML y PHP
Comentarios
El caracter punto y coma ";"
Variables
Tipos de datos
Operadores y expresiones
Operadores Aritméticos
Operador de concatenación
Operadores de comparación
Operadores booleanos
Cambio de tipo
Precedencia
Comandos "print" y "echo"
Uso de etiquetas HTML
2. Control de flujo
Comando "if"
Comando "switch"
Comando "do ... while"
Comando "for"
Comandos "break" y "continue"
3- Arreglos
Creación de arreglos
Recorriendo todo un arreglo con "foreach"
Operaciones con arreglos
Agregar varios elementos al principio del arreglo, con el comando
"array_push"
Quitar el primer elemento de un arreglo, con el comando "array_shift"
Quitar cualquier elemento de un arreglo, con el comando "unset"
Buscar por un valor exacto en todo el arreglo, con el comando "in_array"
Ordenando arreglos
Arreglos asociativos
4- Funciones
Creación de funciones
Parámetros
Variables locales y globales
Regreso de valores
5- Formas de HTML
Ejemplos de Dreamweaver:
Campos ocultos
Validaciones
Redirección a otras paginas
Hipervínculos a rutinas php
Paso de parámetros en hipervínculos
6- Fechas y strings
Comando "time"
Comando "date"
Comando "getdate"
Comando "mktime"
Validando fechas con "checkdate"
Comando "printf"
Comando "sprintf"
Comando "number_format"
Operaciones básicas de strings
Convertir caracteres especiales de texto a HTML
7- Manejo de archivos
Verificar si existe un archivo
Verificar si es archivo o directorio
Propiedades de archivos
Creando y borrando un archivo
Abrir y cerrar un archivo
Leer un archivo
Protegiendo archivos contra escrituras múltiples
Operaciones con directorios
8 - Galletas
Creación de galletas
Lectura de galletas
Borrar una galleta
9- Acceso a base de datos
Conexión al servidor
Conexión a la base de datos
Operaciones básicas
10- Otros recursos Referencias en el internet
1. Sintaxis general de PHP

Estructura de archivos PHP


El lenguaje de programación PHP nace en 1994 por la necesidad de
automatizar operaciones comunes para crear sitios de internet
dinámicos. Es inventado por Rasmus Lerdorf y basado en el lenguaje
"C". Sus siglas significan "Personal Home Page".
Las rutinas de PHP se crean en cualquier editor de texto, ya que es
un lenguaje "interpretado" (se lee, valida e interpreta hasta que es
llamada una rutina por el servidor). Todo archivo que contenga rutinas
e instrucciones de PHP debe estar contenido entre los símbolos "<?
php" y "?>" y tener la extensión ".php" para ser ejecutado
correctamente. Así, un ejemplo de un archivo de PHP, que podría ser
guardado con el nombre "hola.php", es:
<?php
print "Hola mundo!";
?>

Para ejecutar un archivo de php con extensión ".php", debe "subirse"


en el servidor junto con las páginas de HTML, y escribir en un
navegador el nombre del archivo:

localhost/hola.php

Para saber si un servidor de páginas web tiene instalado el intérprete


de PHP se puede crear este sencillo archivo, subirlo y ejecutarlo
desde un navegador (debe de usarse un servidor de paginas web, no
funciona si se abre un archivo guardado en un disco duro local desde
un navegador):
<?php
print phpinfo();
?>
Este archivo debe producir un resultado similar a esto:

Si el resultado son las instrucciones del archivo, el PHP no esta


instalado en ese servidor.

Mezclar HTML y PHP


Es posible mezclar paginas de HTML y código PHP, escribiendo en la
parte correspondiente del archivo HTML el código de PHP, siempre
delimitado por las etiquetas "<?php" y "?>" . Capture el siguiente
ejemplo:

1 <html>
2 <head>
3 <title>Ejemplo de mezcla de HTML y PHP</title>
4 </head>
5 <body>
6 <br>
7 Este es un ejemplo de como mezclar código estático de HTML
8 y dinámico de PHP<br>
9 <br>
10 Esta parte es creada por el HTML.<br>
11 <br>
12 <?php
13
14 print "Esta parte es creada por una rutina de PHP.<br>";
15 ?>
16 <br>
17 Fin de la demostración<br>
18 </body>
19 </html>
Una desventaja de esta mezcla es que no se puede separar el diseño
del código, lo cual hace difícil el desarrollo y el mantenimiento de un
sitio en el que se involucran diseñadores y programadores (o al menos
varias personas a la vez). Más adelante se describirán técnicas para
mantener separados el diseño y el código.

Comentarios
En todo lenguaje de programación es conveniente tener alguna forma
de incluir comentarios, letreros que indican alguna nota acerca del
código o su implementación.
En el PHP hay tres maneras de crear comentarios en el código:
1- Usando los caracteres "//": se usa para incluir una sola linea de
comentarios
2- Usando el carácter # (gatito, numeral, almohadilla): Funciona igual
que las dos diagonales.

3- Usando los caracteres "/*" y "*/" : se usa para incluir varias lineas de
comentarios
Un ejemplo de esto es:

1 <?php
2 // este es mi primer programa de php
3 // fue hecho por Fulano de Tal en septiembre de 2002
4 print "Hola mundo!";
5 /* dicen que el primer programa que se hizo en lenguaje C fue el de
6 “hola mundo”*/
7 ?>

El caracter punto y coma " ;"


Así como en los lenguajes de los humanos se usa la puntuación para
separar oraciones, ideas, dar énfasis, etc., el PHP usa el caracter
punto y coma se utiliza ";"para separar sus instrucciones. Toda
instrucción debe terminar obligatoriamente con un ";".
Para las personas es muy difícil leer una serie de frases si no son
separadas por símbolos de puntuación Es por esto que en muchos
lenguajes de programación se usan caracteres especiales para
separar las instrucciones y hacer más claro el concepto. En algunos
lenguajes se usa simplemente una nueva linea para separar las
instrucciones, pero otros lenguajes usan otros caracteres siendo el
mas usado el ";" ya que esto es herencia del lenguaje "C" del cual
provienen una gran cantidad de lenguajes comerciales actuales
Verdad que es difícil leer esto sin el uso de separadores?

Variables
Todo lenguaje de programación usa el concepto de "variables": las
podemos considerar recipientes o contenedores (cajitas) que guardan
valores para ser usados en la resolución de problemas. En la vida
real, los humanos a menudo usamos este tipo de apoyo, en forma de
notas, tarjetas de presentación, etiquetas para cajas con los adornos
de navidad, etc.

El concepto de "cajas" es el que más se asemeja a las variables. En


la vida real, los humanos guardamos cosas en todo tipo de "cajas",
para ser usadas más tarde, para acumular cosas "afines", para ir
guardando monedas que sobran, etc. Pero eso si, entre más cajas se
tengan, es más fácil saber que hay en ellas si NO se les pone una
"etiqueta" o letrero en su exterior.
Por esto es que las variables deben de ser nombradas de forma
indicativa del tipo de información que se guarda en esas "cajitas". Y es
mucho mejor aun si no repetimos esos nombres.
Para guardar todo tipo de "valores" e información, el PHP permite
crear variables, pero deben seguirse las siguientes reglas:
1- Toda variable debe comenzar con el caracter "$".
2- Solo pueden usarse letras (sin eñes ni acentos u otros caracteres
especiales), números y el guión bajo "_" .
3- Las letras mayúsculas y minúsculas SON diferentes.
4- Restringir la longitud del nombre a 64 caracteres (mas por el
beneficio del humano que de la máquina)

Ejemplos de VARIABLES:

$uno
$contador
$nombre_de_variable_un_poco_largo
$i
$esta_variable_no_es_igual_a_esta_otra
$esta_variable_es_diferente
$iva
$subtotal1
$subtotal2
$total
Si bien se goza de la libertad de usar cualquier nombre para la
variable, sin romper las reglas, es buena práctica limitarse a
nombres que estén en relación a su contenido y cortos. Por
ejemplo, en un sistema de inventarios podemos utilizat los nombres
de variable: "$numero_de_parte", "$num_parte" o "$numpte".
A diferencia de otros lenguajes de programación, en el PHP se puede
declarar una variable en cualquier parte del código, pero ésta no es
una buena práctica. Debemos tener de preferencia una zona (por lo
general al inicio) donde declaramos las variables que vamos a utilizar.

Tipos de datos
Los tipos de datos o información que maneja el PHP se pueden
resumir en lo siguiente:
Enteros o "Integer" : Datos numéricos, pero sin incluir decimales.
Optimo uso son contadores. Ejemplos: 1, 2, 3, 5, 7, -11, -13,-17, -19,
-23
Números con decimales o "Double" : Datos numéricos que si
incluyen decimales. Optimo uso son manejo de fracciones, datos
estadísticos, trigonométricos, etc. Ejemplos: 3.141592653589793,
-1.16, 0.15
Cadenas de caracteres o "String" : Datos alfanuméricos para
representar letras y el lenguaje escrito de las personas. Estos valores
van siempre encerrados o delimitados entre las comillas dobles o
comillas sencillas (apóstrofes). Optimo uso son todo tipo de letreros,
mensajes, nombres, etc. Ejemplos:
"Ejemplos",
"Hola, cara de bola",
"Bienvenido a mi sitio",
Buenos días "amorcito"'
Valores de lógica básica o "Boolean" : Aquí sólo existen dos
posibles valores: verdadero (true) o falso (false).
Cualquier variable puede contener alguno de estos tipos de valores,
incluso contener un tipo de valores y más adelante cambiará otro tipo
diferente.

Operadores y expresiones
En los lenguajes de las personas, se usan unas reglas para construir
frases que tengan sentido.
Para crear "frases" correctas en cualquier lenguaje de programación,
se usan expresiones. Estas son unidas por uno o más operadores.
Ejemplos de expresiones correctas en PHP son:

$subtotal = 100;
$contador = $contador + 1;
$ancho = $largo * 100 / 500;
$x = sin($y * ($r - 1) / $pi );
$bandera = false;
$cadena = "Hola, cara de bola";
print "PHP dice: $letrero<br>";
$i++;

Para asignar un valor a una variable, se usa el operador de


asignación: "=". Lo que esta al lado izquierdo es el "contenedor" de la
operación, y lo que esta al lado derecho es la operación a ejecutar.

Operadores Aritméticos

Nombre Ejemplo Resultado


+ adición 3 + 0.1415 3.1415
-substracción 5-7 -2
* multiplicación 258444.8275 * 1.16 299795.9999
/división 5/2 2.5
% residuo 5%2 1

Atajos a operaciones comunes


Para ahorrar la escritura repetida de nombres de variables, existen
atajos de operaciones aritméticas comunes:

Operador Ejemplo Equivalente a


+= $total += $subtotal $total = $total + $subtotal
-= $total -= $descuento $total = $total - $descuento
*= $total *= $iva $total = $total * $iva
/= $promedio /= $total $promedio = $promedio / $total
%= $residuo %= $residuo = $residuo %
$subtotal $subtotal
.= $letrerototote .= $letrerototote = letrerototote .
$letrerito $letrerito
++ $contador++ $contador = $contador + 1
-- $asistentes-- $asistentes = $asistentes - 1
Operador de concatenación
Para "unir" cadenas de caracteres se usa el operador punto ".":

$letrerototote = $letrerito . " para " . $nombre . " " . $apellido . "<br>";

Operadores de comparación
Para comparar una cosa con otra y saber si el resultado es verdadero
o falso se usan estos operadores. Para los ejemplos, se asume que la
variable $todo es igual a 5.

Operador Es verdadero si... Ejemplo Resultado


== igual a ambos lados son $todo == 5 true
iguales
!= de ambos lados son $todo != 5 false
diferente diferentes
=== ambos lados son $todo === false
idéntico iguales y son del "5"
mismo tipo de datos
> mayor la izquierda es mayor $todo > 4 true
que que la derecha
>= mayor la izquierda es mayor $todo >= 5 true
o igual o igual a la derecha
< menor la izquierda es menor $todo < 4 false
que que la derecha
<= menor la izquierda es menor $todo <= 5 true
o igual o igual a la derecha

Operadores booleanos
Estos operadores se usan para crear comparaciones mas complejas.
Ejemplo de la vida real son:

"Si te haces tu tarea y te lavas los dientes puedes ir al cine" - Solo si


se cumplen ambas condiciones podrá ir al cine
"Si haces tu tarea o tiras la basura puedes ir al cine" - Con una de las
dos condiciones que se cumplan podrá ir al cine

Nombre Es verdadero Ejemplo Resultado


si...
and , && ambos lados true
son verdaderos
or, || Una de las true
opciones es
verdadera

Cambio de tipo
Es posible "forzar" a que el resultado de una operación cambie de
tipo, como por ejemplo una división entre números con decimales
regrese un número entero. La manera mas fácil de forzar este cambio
es así:
$entero = (integer) $subtotal / $iva;

La variable $entero sólo recibirá un valor entero, sin los decimales.

Operador Cambia a Ejemplo Resultado


(integer) numero entero $contador = (integer) 2
5/2
(double) numero con $promedio = (double) 5.0
decimales 3+2
(string) cadena de $letrero = 3.1415 / 2 "1.57075"
caracteres
(boolean) verdadero o falso $respuesta = 5 * 2 true
En el ultimo caso, cualquier valor que sea diferente de cero regresa
"true", y cero regresa "false".

Precedencia
Como en los lenguajes de oriente, los lenguajes de programación
modernos leen las expresiones de derecha a izquierda. Pero los
operadores tienen una precedencia o jerarquía establecida para su
ejecución. Considere esto:
$resultado = 3 + 2 * 5;

La variable $resultado vale 13, debido a las siguientes reglas de


precedencia:

Prioridad de Operadores
ejecución
1 ++ , -- , cambio de tipo
2 /, * , %
3 +,-
4 < , <= , > , >=
5 == , === , !=
6 &&
7 ||
8 = , += , -= , *= , /= , %=
, .=
9 and
10 or

Si se desea alterar las reglas de precedencia, se usan


paréntesis, ya que lo que está entre paréntesis se ejecuta
primero. SIEMPRE. Considere esto:
$resultado = (3 + 2) * 5;
La variable $resultado vale 25.

Comandos " print" y " echo"


Para mostrar al usuario un resultado en la pantalla de su navegador,
se usa cualquiera de los comandos "print" o "echo". Estos comandos
llevan los valores a mostrar entre comillas o apóstrofes, y se pueden
incluir variables, las cuales mostraran su valor.

$iva = 0.15;
print "Este ejemplo es menos primitivo que 'Hola mundo!' El valor del
iva es $iva<br>";
echo 'El comando "echo" es equivalente al comando "print" y se
pueden usar indistintamente';

Uso de etiquetas HTML


Cuando las rutinas de PHP se usan en un ambiente de servidores de
web, los resultados serán mostrados en un navegador, y los
navegadores entienden etiquetas de HTML para dar formato a los
textos.
Es por esto que en los comandos "print" o "echo" se incluyan etiquetas
de HTML. Es bueno familiarizarse con las etiquetas de HTML, ya que
es difícil prescindir totalmente de ellas.

Con la técnica del uso de plantillas para separar el diseño de la


programación, se reduce a un mínimo el uso de etiquetas HTML
desde la rutina PHP.
2. Control de flujo

En los lenguajes de programación existen dos grandes grupos de


comandos para el control del flujo del programa, para decidir qué
hacer, o si se trata de un ciclo, cuantas veces hacerlo o hasta que
momento dejar de hacerlo.
El primer grupo de comandos son los condicionales, los cuales
evalúan una expresión y dependiendo del resultado de la
evaluación (verdadero o falso) ejecutan o dejan de ejecutar ciertas
instrucciones.

Comando " if"

En un ejemplo anterior examinamos una situación parecida a esta: "Si


haces tu tarea puedes ir al cine". Este ejemplo contiene una condición,
que si se cumple, trae una consecuencia. Pero de no cumplirse, no se
hace realidad dicha consecuencia.
El comando "if" se traduce como "Si...", y es un comando
condicional. Lo primero a realizar es preguntar por una condición
evaluando una expresión, la cual sólo puede ser verdadera o falsa,
no existe otro resultado. Si el resultado es "verdadero", se ejecutan
las instrucciones que están delimitadas por un par de caracteres
especiales: "{" y "}". La condición es generalmente una o varias
comparaciones.
La sintaxis básica para este comando es:

if ( expresión ) {
comando;
comando;
...
}

Ejemplo:
1 $edad = 45;
2 $bono = 2500;
3 $salario = 25000;
4 if ( $edad >= 40 ) {
5 $salario += $bono;
6 print "Su edad lo hace acreedor a un bono por antigüedad. Su nuevo sueldo es
7 $salario <br>";
8 }
9 print "Su edad es $edad <br>";

Pruebe este código. Luego cambie el valor de la variable $edad y


compare los resultados.

El comando "if" tiene otra forma que incluye la instrucción equivalente


a "de lo contrario":
1 if ( expresión ) {
2 comando;
3 comando;
4 ...
5 } else {
6 otro comando;
7 otro comando;
8 }

Ejemplo:

1 $limite = 4;
2 $llegadas_tarde = 5;
3 $penalidad = 500;
4 $salario = 8000;
5 if ( $llegadas_tarde > $limite ) {
6 $salario -= $penalidad;
7 print "Por llegar tarde mas de $limite veces este mes, su nuevo sueldo es
8 $salario
9 <br>";
10 } else {
11 print "Su sueldo no fue modificado por su puntualidad este mes, y sigue siendo
12 de
13 $salario <br>";
14 }
15 print "Usted lleg&oacute; tarde este mes $llegadas_tarde veces <br>";

Pruebe este código. Luego cambie el valor de las variables $limite y


$llegadas_tarde y compare los resultados.
Es posible incluir un comando "if" dentro de otro comando "if". En este
caso es conveniente alinear los comandos y sus"llaves" ( { y } ) para
facilitar la lectura y comprensión de la lógica de la programación.

Ejemplo:
1 $edad = 38;
2 $estado_civil = "casado";
3 if ( $edad < 40 ) {
4 print "Disfrute de nuestro crucero al caribe ";
5 if ( $estado_civil == "casado" ) {
6 print " en compa&ntilde;&iacute;a de su familia ";
7 }
8 print " con un descuento especial y agradables sorpresas <br>";
9 } else {
10 print "Lo invitamos a nuestro retiro al campo, donde disfrutará de paz ";
11 if ( $estado_civil != "casado" ) {
12 print " de estar solo con usted mismo ";
13 } else {
14 print " de compartir con los suyos ";
15 }
16 print " en un increíble lago en lo alto de la montaña <br>";
17 }
18 print "Su edad es de $edad años y es usted $estado_civil <br>";

Pruebe este código y cambie los valores de las variables para


comparar los resultados.
A veces es necesario preguntar por una serie de "rangos" en las
condiciones, y se deben escribir varios estatutos "if", ya
seaindependientes o unos dentro de otros.

Ejemplo:
1 $edad = 25;
2 if( $edad <= 20 ) {
3 print "Te regalamos boletos para el concierto de One Direction<br>";
4 }
5 if( $edad > 20 and $edad <= 30 ) {
6 print "Te regalamos unos boletos para ir al concierto de Justin Bieber<br>";
7 }
8 if( $edad > 30 and $edad <= 40 ) {
9 print "Te regalamos unos boletos para ir al teatro <br>";
10 }
11 if( $edad > 40 ) {
12 print "Te regalamos unos boletos para ir a la opera <br>";
13 }
14
Comando " switch"
Una alternativa a usar varios comandos "if" es el comando "switch". A
diferencia de los comandos "if", el comando "switch" sólo puede
evaluar una sola expresión. La sintaxis básica para este comando es:

1 switch ( expresión ) {
2 case resultado1:
3 comando;
4
5 comando;
6 break;
7 case resultado2:
8 comando;
9 comando;
10
break;
11
12 case resultado3:
13 comando;
14 comando;
15 break;
16 default:
17
18
comando;
19 comando;
}

Ejemplo:

1 $estado_civil = "divorciado";
2 print "Lo invitamos a un viaje por el amazonas ";
3 switch ( $estado_civil ) {
4 case "soltero":
5 print " donde podrá conocer a otras personas en ";
6 break;
7 case "casado":
8 print " para que su familia viva ";
9 break;
10 case "divorciado":
11 print " en el que podrá olvidar sus problemas en ";
12 break;
13 case "arrejuntado":
14 print " para que se anime a tomar esa importante decisión en ";
15 break;
16 case "viudo":
17 print " para recordar los mejores momentos de su vida en ";
18 break;
19 default:
20 print " que le ayudará a definir su estado social gracias a ";
21 }
22 print " una extraordinaria experiencia de 2 semanas, todo incluido <br>";

El operador condicional
¡Un atajo de un comando "if" con solo un comando para el caso "true"
y uno solo para el caso "false" lo proporciona este operador.
La sintaxis básica para este operador es:

$resultado = ( expresión) ? resultado-si-es-true : resultado-si-es-false;

Ejemplo:

1 $total = 35000;
2 $tipo_de_cambio = 11.35;
3 $gran_total = ( $tipo_de_cambio > 0 ) ? $total * $tipo_de_cambio : $total;
4 $letrero = ( $tipo_de_cambio > 0 ) ? ", tipo de cambio " . $tipo_de_cambio : "";
5 print "El gran total de su pedido es $gran_total $letrero <br>";
6

El segundo grupo de comandos de control de flujo son los "ciclos",


los cuales evalúan una expresión y dependiendo delresultado de la
evaluación (verdadero o falso) ejecutan o dejan de ejecutar un ciclo
de instrucciones.

Los ciclos, como los de la vida real, se apoyan en "contadores", que


permiten ejecutar un ciclo un numero finito de veces, yasea en un
rango especifico (algo así como "solo 7 veces") o hasta que suceda
algo.

Comando " while"


La sintaxis básica para este comando es:

1 while ( expresión ) {
2 comando;
3 comando;
4 ...
5 }

Mientras la expresión se evalúe como "true", se ejecutarán los


comandos que delimitan los caracteres "{" y "}". Al terminar el bloque
de comandos, se regresa a evaluar la expresión. Cuando la expresión
se evalúe como "false", termina el ciclo y ya no se ejecuta ningún
comando del "while".
Este comando primero pregunta y luego ejecuta, y es posible que
nunca se llegue a ejecutar el ciclo. Algo así como primero preguntar
"¿Quien vive?" y dependiendo de la respuesta "disparar" o no.

Ejemplo:
1 $contador = 0;
2 $veces = 7;
3 print "Se van a imprimir $veces n&uacute;meros: <br>";
4 while ( $contador < 7 ) {
5 print " N&uacute;mero: $contador <br>";
6 $contador++;
7 }
8 print "Fin del ciclo, el contador vale $contador<br>";

Pruebe asignar a la variable $contador el número 7 (o mayor) en vez


de 0 y observe el resultado.
En la sección de manejo de archivos volveremos a ver este comando,
esta ves sin el uso de un contador especifico.

Comando " do ... while"


La sintaxis básica para este comando es:

1 do {
2 comando;
3 comando;
4 ...
5 } while ( expresión );
Primero se ejecutan los comandos, y luego se evalúa la expresión.
Mientras la expresión se evalúe como "true", se ejecutarán los
comandos que delimitan los caracteres "{" y "}". Cuando la expresión
se evalúe como "false", termina el ciclo y ya no se ejecuta ningún
comando del "do ... while".

Este comando primero ejecuta y luego pregunta, y siempre se ejecuta


al menos un ciclo.

Ejemplo:

1 $contador = 0;
2 $veces = 7;
3 print "Se van a imprimir $veces
4 n&uacute;meros: <br>";
5 do {
6 print " N&uacute;mero: $contador <br>";
7 $contador++;
8 } while ( $contador < 7 );
9 print "Fin del ciclo, el contador vale
10 $contador<br>";

Pruebe asignar a la variable $contador el numero 6 (o mayor) en ves


de 0 y observe el resultado.

Comando " for"

Como se observa en los ejemplos anteriores, es muy común usar una


variable "contador", la cual es inicializada en algún valor(en los
ejemplos fue "cero") e incrementada en un valor a cada vuelta del ciclo
(en los ejemplos se incrementó en "1").
El comando "for" representa una manera "diferente" de hacer un ciclo
de tipo "while", pero con la inicialización de la variable"contador", y su
incremento, en una sola linea.

La sintaxis básica para este comando es:

1 for ( inicializacion-del-contador ; expresión ; incremento-del-contador ) {


2 comando;
3 comando;
4 ...
5 }
6

La inicialización del contador solo se ejecuta una ves y nunca más


vuelve a ejecutarse, antes de evaluar la expresión por primera ves.
La expresión se evalúa al menos una ves y mientras su resultado sea
"true", se ejecutarán las instrucciones del ciclo.
Cuando se termina de ejecutar los comandos del ciclo, se incrementa
el contador, y se vuelve a evaluar la expresión.

Ejemplo:

1 $veces = 7;
2 print "Se van a imprimir $veces n&uacute;meros: <br>";
3 for ( $contador = 0 ; $contador < $veces ; $contador++ ) {
4
5 print " N&uacute;mero: $contador <br>";
6 }
7 print "Fin del ciclo, el contador vale $contador<br>";

Comandos " break" y " continue"


A veces es necesario salir prematuramente de un ciclo, debido a una
condición excepcional. El comando "break " termina elciclo y no vuelve
a evaluar la expresión, terminando definitivamente el ciclo, sin importar
el valor de la expresión. Este comando funciona dentro de cualquier
comando de ciclos y condicionales (if, switch, while, do...while y for).

Ejemplo:

1 $veces = 7;
2 print "Se van a imprimir $veces n&uacute;meros: <br>";
3 for ( $contador = 0 ; $contador < $veces ; $contador++ ) {
4 // aquí checo por una condición especial para terminar el ciclo
5 if ( $contador == 5 ) {
6 print "Se va a terminar el ciclo prematuramente <br>";
7 break;
8 }
9 print " N&uacute;mero: $contador <br>";
10
11 }
print "Fin del ciclo, el contador vale $contador<br>";

El comando "continue " sirve para saltarse un ciclo, sin terminar de


ejecutar los comandos restantes del ciclo.
Ejemplo:

1 $veces = 7;
2 print "Se van a imprimir $veces n&uacute;meros: <br>";
3 for ( $contador = 0 ; $contador < $veces ; $contador++ ) {
4 // aquí checo por una condición especial para saltar un ciclo
5 if ( $contador == 4 ) {
6 print "Se va a saltar un ciclo <br>";
7 continue;
8 }
9 print " N&uacute;mero: $contador <br>";
10 }
11 print "Fin del ciclo, el contador vale $contador<br>";
3- Arreglos

Existen un tipo de variables que pueden contener más de un valor


independiente a la ves, y se llaman "arreglos" (arrays). Esto puede
visualizarse como una caja de herramientas con compartimentos
independientes, pero todos unidos formando una sola caja. No se
pueden separar los compartimentos de la caja principal, y ahí donde
va la caja principal, van las cajitas que esta contiene.
La variable tiene un solo nombre, pero las cajitas que contiene
son numeradas, desde el "cero" en adelante, para saber con qué
compartimento se va a trabajar.

Creación de arreglos
1- Usando el comando "array":
$meses = array ( "Enero", "Febrero", "Marzo", "Abril", "Mayo",
"Junio", "Julio",
"Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");

2- Usando los caracteres "[" y "]" para ir llenando "el siguiente


elemento" del arreglo, comenzando en el elemento "cero":
$días[] = "Lunes";
$días[] = "Martes";
$días[] = "Miércoles";
$días[] = "Jueves";
$días[] = "Viernes";
$días[] = "Sábado";
$días[] = "Domingo";

3- Usando los caracteres "[" y "]" con un número en su interior para ir


llenando "el elemento número..." del arreglo:
$calificaciones[0] = 8;
$calificaciones[1] = 9;
$calificaciones[2] = 7;
$calificaciones[3] = 6;

La manera de accesar un elemento de un arreglo es escribir el


nombre del arreglo, seguido de los caracteres "[" y "]" con el número
del elemento en su interior:
print "El elemento 3 del arreglo meses es $meses[3] <br>";
Esto muestra el mes "Abril". Recuerde que todos los elementos
comienzan en cero.
Para mostrar todos los elementos de un arreglo se usan los ciclos.

Ejemplo:

1 foreach( $meses as $mes ) {


2 print " $mes <br> ";
3 }
4 print "Fin del ciclo <br>";

Recorriendo todo un arreglo con " foreach"

Para evitar todo este manejo de contadores, tamaño del arreglo y el


uso de los caracteres "[" y "]" se puede usar el comando"foreach" para
recorrer todo un arreglo.
La sintaxis básica para este comando es:
foreach( nombre-del-arreglo as elemento ) {
comando;
}
La parte del "elemento" es una variable que se define en ese instante y
va a servir como "cajita provisional" para contener el valor de cada
elemento. La desventaja de este método es que no se puede saber
que número de elemento es, salvo que se vuelva a usar un contador.
Operaciones con arreglos
Algunos comandos para manipular arreglos son:

Mezclar dos o más arreglos en uno solo, con el


comando " array_merge" .
Ejemplos:

1 $meses_y_dias = array_merge($meses, $días);


2 foreach( $meses_y_dias as $elemento ) {
3 print " $elemento <br> ";
4 }
5 print "Fin del ciclo <br>";
6 $meses_dias_califs = array_merge($meses, $días, $calificaciones);
7 foreach( $meses_dias_califs as $elemento ) {
8 print " $elemento <br> ";
9 }
10 print "Fin del ciclo <br>";

Agregar varios elementos al principio del arreglo,


con el comando " array_push"

Normalmente al agregar elementos a un arreglo se insertan al final del


arreglo.

Ejemplo:

1 $quince_meses = array_push( $meses, "nuevo mes en el elemento 0", "nuevo mes


2 en el elemento 1", "nuevo mes en el elemento 2");
3 foreach( $ meses as $elemento ) {
4 print " $elemento <br> ";
5 }
6 print "Fin del ciclo <br>";

Quitar el primer elemento de un arreglo, con el


comando " array_shift"
1 $primer_dia = array_shift( $días );
2 print "El primer día es $primer_dia <br>";
3 foreach( $días as $día ) {
4 print " $día <br> ";
5 }
6 print "Fin del ciclo <br>";

Quitar cualquier elemento de un arreglo, con el


comando " unset"
1 unset( $días[2] );
2 foreach( $días as $día ) {
3 print " $día <br> ";
4 }
5 print "Fin del ciclo <br>";

Buscar por un valor exacto en todo el arreglo, con


el comando " in_array"
1 $busca = "Lunes";
2 $si_no = in_array( $busca, $días );
3 if( $si_no == false ) {
4 print "No existe la palabra $busca en el arreglo 'días' <br>";
5 } else {
6 print "Si existe la palabra $busca en el arreglo 'días' <br>";
7 }

Ordenando arreglos
A veces es necesario ordenar los elementos de un arreglo. Esto se
logra fácilmente con el comando "sort", el cual ordena todos los
elementos de un arreglo de manera "ascendente", o "de menos a
mayor".

1 sort($días);
2 foreach( $días as $día ) {
3 print " $día <br> ";
4 }
5 print "Fin del ciclo <br>";
Arreglos asociativos

No siempre es conveniente usar números para identificar los


elementos de un arreglo. Para las personas es más fácil usar
"nombres" para identificar las cosas.
PHP permite crear arreglos cuyos elementos tienen nombres en ves
de números.
Existen varias formas de "crear" un arreglo asociativo:
1- Usando el comando "array":

Ejemplo:

1 $empleado = array (
2 nombre=>"Fulana de Tal",
3 puesto=>"Diseñadora",
4 edad=>28,
5 "proyecto actual"=>"pagina web"
6 );

2- Usando los caracteres "[" y "]" con un "nombre" en su interior para ir


llenando "el elemento nombre..." del arreglo:

Ejemplo:

1 $empleado[“nombre”] = "Fulana de Tal";


2 $empleado[“puesto”] = "Diseñadora";
3 $empleado[“edad”] = 28;
4 $empleado["proyecto actual"] = "pagina web";

Para mostrar todos los elementos de un arreglo asociativo se usa una


pequeña variante del comando "foreach". Ejemplo:

Ejemplo:

1 foreach( $empleado as $llave=>$valor ) {


2 print "El elemento $llave contiene $valor <br>";
3 }
4 print "Fin del ciclo <br>";
Para ordenar los elementos de un arreglo asociativo se usa el
comando "asort".

Ejemplo:

1 asort( $empleado );
2 foreach( $empleado as $llave=>$valor ) {
3 print "El elemento $llave contiene $valor <br>";
4 }
5 print "Fin del ciclo <br>";
4- Funciones

Una función es un bloque de código de PHP que no es ejecutado


inmediatamente, sino que puede ser "llamado" o ejecutado desde el
código "principal" varias veces. Una función es la definición de una
"rutina", que es probable que se vaya a ejecutar muchas veces. Una
función se puede comparar a una receta de cocina.
Todas las recetas de cocina tienen un nombre: "Pay de cerezas",
"Pastel de chocolate", etc. También una lista de ingredientes: huevos,
harina, leche, etc. Y finalmente una descripción o método para llevarla
a cabo. Los lenguajes de programación trabajan de manera similar.

Creación de funciones
La sintaxis general para crear o definir una función es la siguiente:
function nombre_de_la_receta ( ingredientes ) {
comando;
comando;
}

El nombre de las funciones sigue las reglas de los nombres de las


variables, con una excepción: el símbolo "$" al principio del nombre.
Los ingredientes son una lista de variables, separada por comas. Aquí
es posible crear una "receta de cocina" sin ingredientes, por más
extraño que parezca.
Ejemplo:

1 function muestra_arreglo ( $arreglo ) {


2 foreach( $arreglo as $elemento ) {
3 print " $elemento <br> ";
4 }
5
6 print "Fin del ciclo <br>";
7 }
8 // aquí comienza el código principal
9 $meses = array ( "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
10 "Julio","Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
11 $calificaciones[0] = 8;
12 $calificaciones[1] = 9;
13 $calificaciones[2] = 7;
14 $calificaciones[3] = 6;
15 print "Se va a imprimir el contenido del arreglo 'calificaciones' <br>";
16 muestra_arreglo( $calificaciones );
17 print "Se va a imprimir el contenido del arreglo 'meses' <br>";
18 muestra_arreglo( $meses );
print "Fin de la rutina principal <br>";

Parámetros
A los ingredientes de la receta se les llama parámetros.

Variables locales y globales


Los parámetros de una función se convierten en variables "locales":
son copias y sólo son validas y existen mientras se esta ejecutando la
función. Al terminar, desaparecen, sin alterar o modificar las variables
"gloables" de la rutina principal.
Las variables de la rutina principal se conocen como "globales", pero
son muy respetuosas y no se meten a las funciones amenos que las
inviten.
A veces es necesario modificar el valor de alguna o algunas variables
"globales" desde una función. Así que es obligación de la función el
invitar a las variables globales para que puedan ser modificadas por la
función. No pueden ser pasadas como parámetros, ya que estos son
copias locales.
Para invitar a una variable global en una función se usa el comando
"global". La sintaxis general es la siguiente:
global lista-de-variables;
La lista de variables es separada por comas.

Ejemplo:
1 function calcula_iva ( $subt, $porcentaje ) {
2 global $iva;
3 $iva = $subt * ( 1 + $porcentaje );
4 }
5
6 // aquí comienza el código principal y aquí comienza la ejecución 'automática'
7
8 $subtotal = 1500;
9 $tasa = 0.15;
10 $iva = 0;
11 print "Subtotal $subtotal <br>";
12 calcula_iva ( $subtotal, $tasa );
13 print "IVA $iva <br>";
14 $total = $subtotal + $iva;
15 print "Total $total <br>";

Regreso de valores
En el ejemplo de la compra del refresco, la rutina regresa un valor: el
refresco. ¿Y que pasa si no hubo el sabor y tamaño especificado? Si
esto se le encargó a un adulto es posible que tome una decisión en la
tienda y traiga otro sabor y/o tamaño derefresco. Pero un niño, o
persona sin experiencia en esta rutina, regresará con las manos
vacías.
Las funciones pueden regresar un valor después de ser llamadas, pero
solo pueden regresar un valor directamente. Si se desea simular el
regreso de varios valores, se declaran variables globales y se
modifican dentro de la función. Así, al terminar la función dejará una
"herencia" de variables globales modificadas.
Para regresar un valor, se usa el comando "return".

Ejemplo:

1 function calcula_iva ( $subt, $porcentaje ) {


2 $iva_local = $subt * ( 1 + $porcentaje );
3 return $iva_local;
4 // también se puede usar esta forma:
5 // return $subt * ( 1 + $porcentaje );
6 }
7 function valida_edad ( $edad ) {
8 if ( $edad <= 0 or $edad > 120 ) {
9 return true;
10 } else {
11 return false;
12 }
13 // también se puede usar esta forma:
14 // return ( $edad <= 0 or $edad > 120 ) ? true : false;
15 }
16 // aquí comienza el código principal
17 $subtotal = 1500;
18 $tasa = 0.15;
19 $iva = 0;
20 $edad = 294;
21 print "Subtotal $subtotal <br>";
22 $iva = calcula_iva ( $subtotal, $tasa );
23 print "IVA $iva <br>";
24 $total = $subtotal + $iva;
25 print "Total $total <br>";
26 if( valida_edad($edad) ) {
27 print "La edad es v&aacute;lida: $edad <br>";
28 } else {
29 print "Favor de corregir la edad <br>";
30 }
5- Formas de HTML
Hasta ahora los ejemplos usados han usado el comando "print" para
comunicar algo al usuario: resultados de las rutinas. Peroel usuario ha
estado "mudo", sin posibilidad de una comunicación de dos vías con la
rutina de PHP.
Al usar el PHP mediante un servidor de páginas web, el único medio
de comunicación "interactiva" con los usuarios es a través de formas
de HTML. En ellas, el usuario escribe datos que son evaluados y
procesados por una rutina de PHP y se genera un resultado.

Paso de valores y llamado de la rutina de PHP

Todos los valores que recibe una rutina PHP son de tipo "string"
(cadena de caracteres), aún los valores numéricos que el usuario final
pudiera llegar a escribir.
Es muy importante especificar en el HTML dos cosas:

1- El URL (nombre) de la rutina a ejecutar cuando el usuario oprime el


botón de "mandar" los datos escritos y/o seleccionados de la forma.

2- Nombrar los elementos de la forma que van a ser evaluados por la


rutina de PHP.

Para el primer punto se incluye en la etiquete "action" de la forma el


nombre del archivo donde está la rutina de php a usar. Si se usa un
editor de páginas web, se debe escribir en el campo "Action" el mismo
nombre.
Ejemplo de HTML:

<form action="valida.php" method="POST">


Para el segundo punto, es indispensable nombrar los campos,
botones, combos y listas de HTML, usando las mismas reglas
denombres de variables de PHP, pero sin el "$".
Ejemplos de HTML:

1 Escriba su nombre: <input type="text" name="nombre">


2 Escriba su password: <input type="password" name="contrasena">
3 Escriba sus comentarios: <textarea name="comentarios" rows="10" cols="60">
4 </textarea>
5 Estado civil: <input name="edo_civil" type="radio" value="soltero" checked> Soltero
6 <input name="edo_civil" type="radio" value="casado"> Casado
7 <input name="edo_civil" type="radio" value="divorciado"> Divorciado
8 <input name="edo_civil" type="radio" value="viudo"> Viudo
9 Gustos Musicales: <input name="musica[]" type="checkbox" value="rock"> Rock
10 <input name="musica[]" type="checkbox" value="pop"> Pop
11 <input name="musica[]" type="checkbox" value="clasica"> Clasica
12 Pasatiempo favorito: <select name="hobbie">
13 <option value="cine" selected>Cine</option>
14 <option value="baile">Baile</option>
15 <option value="dormir">Dormir</option>
16 <option value="comer">Comer</option>
17 </select>
18 <select name="idiomas[]" size="3" multiple>
19 <option value="esp" selected>Espa&ntilde;ol</option>
20 <option value="ing">Ingl&eacute;s</option>
21 <option value="fra">Franc&eacute;s</option>
22 <option value="ita">Italiano</option>
23 <option value="ale">Alem&aacute;n</option>
24 <option value="por">Portugu&eacute;s</option>
25 <option value="rus">Ruso</option>
26 <option value="jap">Japon&eacute;s</option>
27 <option value="gae">Ga&eacute;lico</option>
28 </select>
29

Generalmente el servidor de PHP está configurado para crear


variables globales con los mismos nombres de los elementos de las
formas. Usando los ejemplos anteriores, al ejecutar la rutina
"valida.php" se crearán automáticamente las siguientes queda "no
definida" y por lo tanto, vacía .

Nombre de la
Tipo Contenidos
variable
lo que el usuario escriba en el campo
$nombre string
"nombre"
$contrasena string lo que el usuario escriba en el campo
"contrasena"
lo que el usuario escriba en el campo
$comentarios string
"comentarios"
solo uno de estos: "soltero" , "casado",
$edo_civil string
"divorciado", viudo"
$musica array en los elementos del arreglo estarán las
opciones que el usuarioseleccione en los
cuadros: "rock", "pop", "clasica". Si el
usuario NOselecciona una sola opción,
la variable $musica queda "no definida"y
por lo tanto, vacía
solo uno de estos: "cine" , "baile",
$hobbie string
"dormir"
$idiomas array en los elementos del arreglo estarán las
opciones que el usuarioseleccione de la
lista: "esp", "ing", "fra", "ita", "ale", "por",
"rus","jap", "gae".Si el usuario NO
selecciona una sola opción, la variable
$idiomas

Para crear una variable de tipo arreglo, en el nombre del campo se


deben incluir los caracteres "[" y "]" al final del nombre. Esta opción es
muy útil en las etiquetas "<select>".

Campos ocultos
A veces es necesario incluir valores que sean asignados a una
variable al mandar una forma pero sin que el usuario se entere. Para
esto se usan los campos ocultos. Supongamos que se desea pasar los
nombres de las plantillas de HTML que se van amostrar si hubo un
error en el llenado de la forma, y otra cuando el llenado fue exitoso.
En la sección "Redirección a otra páginas" se verá un ejemplo del uso
de estos campos y la redirección a plantillas de HTML.Ejemplo de
HTML:
<input name="error" type="hidden"
value="forma_error.html">
<input name="ok" type="hidden" value="forma_ok.html">

Validaciones

Una ves recibidos los valores del usuario hay que validarlos antes
de poder procesarlos. Las validaciones son operaciones necesarias
en toda rutina, y pueden llegar a consumir tiempo y esfuerzo. En
esta sección se muestra un tipo muy básico de validaciones, sólo
como base para usarse en la vida real.
Para los campos de tipo texto, como nombre, dirección, contraseña,
etc, lo primero a validar es que contengan algo. El usuario puede
escribir espacios, y también hay que validar esta situación.
Lo primero es quitar espacios antes y después de otros caracteres,
para recortar el espacio en blanco. Para esto se usa la función
trim():
$nombre = trim( $nombre );

Luego hay que checar si después de este "recorte" aun queda algo, o
sea probar si la variable está vacía o no. Esto puede hacerse de varias
formas y aquí hay dos ejemplos:

Ejemplo:

1 if ( $nombre == "" ) {
2 // aquí va la rutina de error
3 comando;
4 comando;
5 ...
6 }
7 if ( strlen($nombre) == 0 ) {
8 // aquí va la rutina de error comando;
9 comando;
10 ...
11 }
El primer ejemplo compara la variable $nombre contra un string
"vacío", representado por dos comillas. El segundo usa una función
integrada que obtiene la longitud de un string (strlen) y la compara
contra el número 0. En ambos casos, si esto llega aser verdadero
(true), se ejecutará el código para manejar ese error.
En el caso de valores numéricos, como edad, precio, cantidades, etc,
hay que recordar que llegan a la rutina de PHP como cadena de
caracteres. Así que la primera validación es igual a la de los ejemplos
anteriores. Pero luego hay que convertir esos valores a enteros
(integer) o números con punto decimal (double) y validar rangos.

Ejemplos:

1 // validación de edad, mínima 18 y máxima 130 (por poner un máximo)


2 $edad = trim( $edad );
3 $edad = (integer) $edad;
4 if ( $edad < 18 or $edad > 130 ) {
5 // aquí va la rutina de error
6 comando;
7 comando;
8 ...
9 }
10 // validación de cantidad, como en un carrito de compra, limite máximo:
11 $limax = 20;
12 $cantidad = trim( $cantidad );
13 $cantidad = (integer) $cantidad;
14 if ( $cantidad < 1 or $cantidad > $limax ) {
15 // aquí va la rutina de error
16 comando;
17 comando;
18 ...
19 }
20 // validación de un campo de tipo subtotal de una factura o pedido
21 // por el momento se asume que no incluye ni comas ni "$"
22 $subtotal = trim( $subtotal );
23 $subtotal = (double) = $subtotal;
24 if ( $subtotal <= 0 ) {
25 // aquí va la rutina de error
26 comando;
27 comando;
28 }

Para las variables de tipo array, que se manejan en los combos de lista
y los cuadros de verificado, lo primero a validar es siexiste el arreglo,
ya que si el usuario no selecciona ninguna opción, no se genera un
arreglo vacío, sino que la variable ni siquiera existe. En el caso de
existir, es bueno saber cuántos elementos tiene el arreglo.
Ejemplos:

1 // validar el arreglo $musica, que contiene los gustos musicales del usuario
2 if ( isset( $musica ) ) {
3 // si existe el arreglo, averiguo cuantos elementos tiene
4 $num_elementos = count( $musica );
5 } else {
6 // no existe el arreglo
7 $num_elementos = 0;
8 // el hecho de que no exista el arreglo no necesariamente
9 // genera un error, por eso no muestro una plantilla de error
10 }

La función isset() checa por la existencia de una variable, y regresa


"true" si existe (y tiene algún valor).

Redirección a otras paginas


Para mostrar una página de HTML previamente diseñada, o enviar al
usuario a alguna localidad del internet, existe la función header(), que
sólo lleva un parámetro con el URL (dirección local o global).
La sintaxis básica para este comando es:
header ( "location: URL" );
Es recomendable terminar la rutina después de usar este comando, ya
que si se usa algún comando que muestre algo (print,echo), se va a
generar un error. Para esto se usa el comando "exit". Esto hace que ya
no se ejecute ninguna otra instrucción dela rutina de PHP, sin importar
donde se encuentre ejecutandose.
Cuando se usan campos ocultos en formas de HTML, se pueden
definir desde el HTML el nombre de las plantillas que se vana
desplegar en caso de error y en caso de éxito, liberando así la
necesidad de cambiar o editar el código de PHP cuando sedesean
crear nuevos archivos gráficos. Tal vez para el programador no
representa mucho esfuerzo este cambio tan sencillo al código, pero
para los diseñadores sin experiencia en programación es en extremo
fácil cambiar el valor de una variable oculta en algún editor de páginas
web.
Ejemplos:

1 // validación de nombre
2 $nombre = trim( $nombre );
3 if ( $nombre == "" ) {
4 // aquí muestro la plantilla de HTML que contiene la variable $error
5 // por el momento no le paso ningún parámetro, solo muestro la página
6 header( "location: $error");
7 // es indispensable terminar la ejecución de la rutina
8 exit;
9 }
10 // ejemplo de redirección a otra página, local
11 header( "location: menu.html" );
12 exit;
13 // ejemplo de redirección a otro sitio
14 header( "location: http://www.apple.com/quicktime/" );
15 exit;
Hipervínculos a rutinas php
Hasta ahora se ha visto como llamar una rutina o archivo de PHP
desde una forma de HTML y desde un navegador de páginas web.
Pero es posible crear hipervínculos en una página de HTML a
cualquier rutina de PHP.
Sólo basta con escribir el nombre del archivo que contiene la rutina de
PHP.
Ejemplo en HTML:

<a href="ayuda.php">ayuda</a>

Paso de parámetros en hipervínculos

Como ya se describió anteriormente, es posible pasar valores sin que


el usuario final se entere o se involucre, usando campos ocultos en
formas de HTML. Esto también es posible hacerlo en un hipervínculo
de HTML.
La sintaxis básica para el vínculo es:
archivo.php?variable1=valor1&variable2=valor2&variable2=valor3

Se escribe el nombre del archivo que contiene la rutina de PHP,


seguido del caracter "?" y una lista de nombres de variables, el
símbolo "=" y el valor de esa variable, separada por el caracter "&". Si
algún valor lleva espacios, se deben usar comillas o apóstrofes para
delimitar el valor.
Ejemplos en HTML:
<a href="ayuda.php?tema=5&plantilla=ayuda_gral.html">ayuda</a>

<a href="ayuda.php?tema='llenado de
formas'&plantilla=ayuda_gral.html">ayuda</a>
6- Fechas y strings
En esta sección se cubren las instrucciones para manejo de horas y
fechas, manejo de cadenas de caracteres y ejemplos de usoscomunes
en validación de fechas y textos.
El manejo de hora y fecha es una herencia del Unix, y aunque el
manejo interno es muy sencillo, hay que entender el formato"nativo".
En PHP los datos de hora y fecha se representan exclusivamente
como "segundos": los segundos transcurridos desde el 1 de enero de
1970 (fecha "oficial" de la era del Unix). Así es que cualquier hora o
fecha es representada en "segundos". Esto facilita las operaciones
de adición y sustracción de fechas, pero impone un formato poco
familiar a las personas.
Afortunadamente, existen varios comandos para lidiar con esto y
convertir las horas y fechas entre los formatos interno y el formato
que pueda entender una persona.

Comando " time"


Para obtener la hora y fechas actuales, se usa la función integrada
"time". Es importante notar que este comando reporta la fecha del
servidor donde se está ejecutando la rutina de PHP, y no la fecha de
la máquina del usuario.
Esta función regresa un número entero que representa el número
de segundos desde el inicio de la época de Unix ( 1 enero1970).
La sintaxis básica para este comando es:
$segundos = time();

Comando " date"


Afortunadamente existe una función que permite mostrar el número de
segundos de una manera familiar: date(). Es importante saber que los
nombres o abreviaciones de meses y días de la semana se reportan
generalmente en inglés.

La sintaxis básica para este comando es:


$cadena = date( "caracteres", segundos );
Los caracteres que se pueden incluir son muchos y se describen en la
siguiente tabla. Cualquier otro caracter se ignora y se pasa
directamente al resultado.

Caracter Descripción Ejemplos

a "am" o "pm", en minúsculas am


A "AM" o "PM", en mayúsculas PM
numero de día del mes, con ceros antes
d 02 , 25
cuando es menor a 10
día de la semana, abreviado a tres letras en
D Sat , Mon
inglés
January ,
F nombre del mes
June
hora del día, formato de 12 horas, con ceros
h 02 , 11
antes cuando es menor a 10
hora del día, formato de 24 horas, con ceros
H 09 , 13 , 23
antes cuando es menor a 10
hora del día, formato de 12 horas, sin ceros
g 2 , 11
antes cuando es menor a 10
hora del día, formato de 24 horas, sin ceros
G 9 , 13 , 23
antes cuando es menor a 10
i minutos 06 , 34 , 59
numero de día del mes, sin ceros antes
j 2 , 25
cuando es menor a 10
Sunday,
l día de la semana
Thursday
L año bisiesto (0 para no, 1 para si) 1
m número del mes del año, con ceros antes 01 , 12
cuando es menor a 10
M mes del año, abreviado a tres letras Mar, Dec
número del mes del año, con ceros antes
n 02 , 10
cuando es menor a 10
s segundos 07 , 45
U numero de segundos desde 1 enero 1970 948373546
y año, dos dígitos 59 , 99 , 04
1960 , 1994
Y año, cuatro dígitos
, 2003
8 , 186 ,
z número de día del año, entre 0 y 365
237 , 364
desfase en segundos de la hora GMT
Z 0 , 368
(meridiano de Greenwitch)

Ejemplos:

1 $fecha = time();
2 $letrero = date ( "d/m/Y" , $fecha );
3 print "La fecha de hoy es $letrero <br>";
4 // esto imprime algo así: La fecha de hoy es 09/02/2003
5
6 $tiempo = time();
7 $hora = date ( "H:i:s" , $tiempo );
8 print "La hora es $hora <br>";
9 // esto imprime algo así: La hora es 09:58:37
10
11 $segundos = time();
12 $día = date( "l" , $segundos );
13 $dia2 = date( "j" , $segundos );
14 $mes = date( "F" , $segundos );
15 $anio = date( "Y" , $segundos );
16 $hora = date( "h" , $segundos );
17 $ampm = date( "A" , $segundos );
18 $mins = date( "i" , $segundos );
19 print "Hoy es $día $dia2 de $mes de $anio, y son las $hora $ampm con $mins
20 minutos...
21 buen día! <br>";
22 // esto imprime algo así: Hoy es Friday 18 de September de 1959, y son las 2 PM
23 con
24 18 minutos... buen día!
Más adelante veremos como obtener los nombres de los días y meses
en otro idioma.

Comando " getdate"

Existe una manera de obtener los datos más comunes de hora y


fecha, mediante la función integrada "getdate".
La sintaxis básica para este comando es:
$arreglo = getdate( segundos );

Si el parámetro "segundos" se omite, se usa el resultado de la función


"time".

Este comando regresa un arreglo asociativo con los siguientes datos:

Nombre del Descripción Ejemplo


elemento
segundos del minuto, entre 0 y
seconds 23
59
minutes minutos de la hora, entre 0 y 60 15
hours horas del día, entre 0 y 23 22
mday día del mes, entre 1 y 31 10
wday día de la semana, entre 0 y 6 2
mon mes del año, entre 1 y 12 2
year año, cuatro dígitos 2001
yday día del año, entre 0 y 365 43
weekday nombre del día de la semana Tuesday
month nombre del mes del año February
0 segundos 983671286

Ejemplo:
1 // defino los meses en español
2 $meses = array ( "vacio", "Enero", "Febrero", "Marzo",
3 "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre",
4 "Diciembre");
5
6 // defino los nombres del día de la semana en español
7 $días = array ( "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes",
8 "Sabado" );
9
10 // como la flojera de escribir, en ves de usar esto:
11 // $segundos = time();
12 // $detalle = getdate( $segundos );
13 // uso esto mas corto:
14 $detalle = getdate();
15
16 $día = $días[$detalle[wday]];
17 $mes = $meses[$detalle[mon]];
18
19 print "Hoy es $día $detalle[mday] de $mes de $detalle[year], y son las
20 $detalle[hours] con $detalle[minutes] minutos... y todo eso salió de aquí:
21 $detalle[0]<br>";

Comando " mktime"

Cuando se desea saber que hora y fecha es, todo va muy bien hasta
aquí. Pero ¿que pasa cuando se desean hacer operacionescon
fechas? El PHP sólo entiende de segundos, y nada más. Y ¿qué
pasa si el usuario escribe una fecha o una hora?
El comando mktime() es el primer paso para solucionar los problemas
descritos, convirtiendo hora y fecha de formato "humano" a segundos.
La sintaxis básica para este comando es:
$segundos = mktime( hora, minuto, segundo, mes, dia, anio );
Todos los parámetros son números enteros.

Ejemplo:

1 // este código supone que el usuario selecciono un día, mes y año de


2 // tres combos (pop-up menus) llamados "mes", "día" y "anio"
3 // que regresan solo números. ejemplo del combo "mes":
4 // <select name="mes">
5 // <option value="1" selected>Enero</option>
6 // <option value="2">Febrero</option>
7 // <option value="3">Marzo</option>
8 // <option value="4">Abril</option>
9 // <option value="5">Mayo</option>
10 // <option value="6">Junio</option>
11 // <option value="7">Julio</option>
12 // <option value="8">Agosto</option>
13 // <option value="9">Septiembre</option>
14 // <option value="10">Octubre</option>
15 // <option value="11">Noviembre</option>
16 // <option value="12">Diciembre</option>
17 // </select>
18
19 // validaciones, validaciones!!! dan flojera pero son necesarias...
20 // como los valores vienen de un combo, la validación es mínima
21
22 $día = (integer) $día;
23 $mes = (integer) $mes;
24 $anio = (integer) $anio;
25
26 $hoy = time();
27
28 // fecha de nacimiento del usuario
29 // como no se saben la hora, minuto y segundo, se ponen ceros
30 $nace = mktime( 0, 0, 0, $mes, $día, $anio );
31 $día = date( "l", $nace );
32
33 $vivido = $hoy - $nace; // BIEN VIVIDOS! :-)
34
35 print "Usted nació un $día y ha vivido: <br>";
36 print " $vivido segundos <br>";
37 $minutos = $vivido / 60;
38 print "o $minutos minutos <br>";
39 $horas = $vivido / 60 / 60;
40 print "o $horas horas <br>";
41 $días = $vivido / 60 / 60 / 24;
42 print "o $días días <br>";
43 $semanas = $vivido / 60 / 60 / 24 / 7;
44 print "o $semanas semanas <br>";
45 $meses = $vivido / 60 / 60 / 24 / 30;
46 print "o aproximadamente $meses meses <br>";
47 $anios = $vivido / 60 / 60 / 24 / 365;
48 print "o aproximadamente $anios anios <br>";
49 print " wow! <br>";

Validando fechas con " checkdate"


No siempre se puede dar el lujo de recibir la fecha del usuario a
través de combos. A veces no hay otra mas que poner un campo
de texto. Esto complica un poquito más las cosas, pero nada que
no se pueda resolver.
Examinemos de cerca el problema y deduzcamos lo que se necesita
para resolverlo. Al usuario final se le mostrará un campode texto
pidiendo que escriba una fecha, en formato "dd/mm/aaaa" (día, mes y
año numéricos, separados por un "/").
Lo primero por hacer es deshacerse de los espacios extras que
pudieran "colarse", usando el comando "trim". Luego checar siaun
sobra algo después de la rasurada. Pan comido, esto ya lo deben de
dominar a estas alturas... o no?
Lo siguiente es separar de alguna manera el día, mes y año, para
posteriormente validarlos. "Mmmm... suena sencillo, pero...".Para esto
se usa la función integrada "explode", que permite separar textos que
están delimitados por un caracter en especial, ycrear un arreglo con
las partes "explotadas".
La sintaxis básica para este comando es:
$arreglo = explode( separador, string );

El parámetro "separador" es un caracter o caracteres que separan los


textos del "string".
Ejemplo:
$datos_fecha = explode ( "/", $fecha );

En el caso de nuestro "problema", el arreglo $datos_fecha contiene 3


elementos: día, mes y año. ¿Y que pasa si el usuario usó otro
"separador", como "-"? Una vez pasada la validación básica, hay que
checar que los datos de día no se salgan del rango, según su mes, y
que febrero pueda tener 29 días en años bisiestos.
Para esto llega al rescate el comando "checkdate". Se le pasan como
parámetros el mes, día y año y regresa un valor booleano, indicando
si la fecha es válida o no (true o false).
La sintaxis básica para este comando es:
$si_o_no = checkdate( mes, día, anio );
Ejemplo:

1 // este código asume que la fecha la escribe el usuario en un campo de texto


2 // llamado "fecha", en formato "dd/mm/aaaa"
3 // y que la plantilla de "error" esta en un campo invisible llamado "error"
4 // validación, parte 1
5 $fecha = trim($fecha);
6 if( $fecha == "" ) {
7 // mando plantilla de error y termino el programa
8 header( "location: $error" );
9 exit;
10 }
11
12 // vamos a explotar cosas, como en los video juegos... que divertido!
13 $df = explode( "/", $fecha );
14 // validación, parte 2
15 if( count($df) != 3 ) {
16 // mando plantilla de error y termino el programa
17 header( "location: $error" );
18 exit;
19 }
20
21 // validación, parte 3
22 foreach( $df as $valor ) {
23 $valor = (integer) $valor;
24 if( $valor < 1 ) {
25 // mando plantilla de error y termino el programa
26 header( "location: $error" );
27 exit;
28 }
29 }
30
31 // validación
32 if( checkdate( $df[1], $df[0], $df[2] ) == false ) {
33 // mando plantilla de error y termino el programa
34 header( "location: $error" );
35 exit;
36 }
37
38 // al fin!!! ahora si ya puedo comenzar a hacer ALGO con esa fecha...
39 $nace = mktime( 0, 0, 0, $df[1], $df[0], $df[2] );

En el ejemplo cabe notar que el orden de la fecha es "día/mes/año":


"día" en el elemento 0 del arreglo $df, "mes" en el elemento 1 del
arreglo $df, y "año" en el elemento 2 del arreglo $df (si es que el
usuario hizo caso). Pero las funciones demanejo de fechas en PHP
usan el formato "mes/día/año", por eso el orden en los parámetros
es "$df[1], $df[0], $df[2]".

Comando " printf"

Para "formatear" un valor numérico de modo que seamás fácil su


lectura, se usa la función integrada "printf".
La sintaxis básica para este comando es:
printf ( control_del_formato, lista_de_numeros );

El primer parámetro es un "string" en el cual se indica el formato a dar


al segundo parámetro, que puede ser desde un solo número (o
variable numérica), hasta una lista de números separada por comas.
El formato a aplicar son una combinación de caracteres, que
comienzan siempre con el caracter "%", seguidos de algún
caracter especial. Los caracteres más usados se describen en
esta tabla:
Caracter Descripción
d muestra un número en base 10, o en formato decimal
b muestra un número entero en base 2, o en formato
binario
f muestra un número entero como un número con
decimales (double)
s muestra un número como "string"

Si antes de estas letras se incluye un número positivo, se insertan


ese número de espacios al formato antes del número. Si el número
es negativo, se insertan ese número de espacios al formato después
del número.
Finalmente, para los números con decimales, se puede incluir un "."
seguido del número de decimales a mostrar.
Ejemplo:
1 $entero= 1500;
2 $enterototote = 568423597;
3 $pi = 3.141592653589793;
4 print "Este es el valor de 'pi': $pi <br>";
5 printf ( "Lo mismo, pero solo con dos decimales: %.2f <br>", $pi );
6 printf ( "Y ahora con 6 decimales: %.6f <br>", $pi );
7 printf ( "Combinación. Un entero: %d, un enterototote: %d, y pi: %.4f <br>",
8 $entero, $enterototote, $pi );
9 // los documentos HTML normalmente no muestran mas de un espacio
10 // aunque se incluyan muchos, así que para ver el siguiente ejemplo
11 // hay que ver el "texto fuente" de la pagina en el navegador (view source)
12 printf ( "Ahora con espacios. Entero: %8d, y pi: %4.4f <br>", $entero, $pi );

Comando " sprintf"


Esta variante del comando "printf" no manda el resultado al navegador
del usuario, sino que crea un "string" para ser guardado y usado más
adelante.
La sintaxis básica para este comando es:
$cadena = sprintf ( control_del_formato, lista_de_numeros );

Comando " number_format"


Este comando es muy usado para formatear valores numéricos de una
manera más sencilla, y muy orientado a mostrar cantidades en formato
de moneda. Sólo incluye comas para separar miles, millones, etc, y el
número de decimales indicado.
La sintaxis básica para este comando es:

$cadena = number_format ( numero, decimales );


Ejemplo:

1 $entero = 1500;
2 $enterototote = 568423597;
3 $pi = 3.141592653589793;
4 $iva = 0.15;
5
6 $total1 = $entero * ( 1 + $iva );
7 $total2 = $enterototote * ( 1 + $iva );
8 $stotal1 = number_format ( $total1, 2 );
9 $stotal2 = number_format ( $total2, 2 );
10 $spi = number_format ( $pi, 6 );
11 //
12 print "El total 1 es: $ $stotal1 <br>";
13 print "El total 2 es: $ $stotal2 <br>";
print "pi es: $spi <br>";

Operaciones básicas de strings


Existen muchas operaciones que aplican a las cadenas. Aqui sólo se
mencionan las más usadas.
Obtener la longuitúd de un string, con el comando "strlen".

Ya se ha visto su uso en las validaciones.

Ejemplo:

1 $letrero = "Esta es una cadena de caracteres";


2 $largo = strlen( $letrero );
3 print "El letrero '$letrero' tiene $largo caracteres <br>";

Buscar y extraer un "sub-string" dentro de otro string, con el


comando "strstr".

Primero busca el "sub-string" dentro del"string. Si no lo encuentra,


regresa "false". Si lo encuentra, regresa el "sub-string" encontrado.
Ejemplo:

1 $letrero = "Esta es una cadena de caracteres";


2 $busca = "cadena";
3 $resultado = strstr( $letrero, $busca );
4 if( $resultado === false ) {
5 print "No se encontro '$busca' en '$letrero' <br>";
6 } else {
7 print "Si se encontro '$busca' en '$letrero' <br>";
8 }

Buscar un "sub-string" dentro de otro string y reportar la posición


donde comienza, con el comando "strpos".
Primero busca el "sub-string" dentro del "string. Si no lo encuentra,
regresa "false". Si lo encuentra, regresa un entero indicando la
posición donde comienza.
Ejemplo:

1 $letrero = "Esta es una cadena de caracteres";


2 $busca = "cara";
3 $resultado = strpos( $letrero, $busca );
4 if( $resultado === false ) {
5 print "No se encontro '$busca' en '$letrero' <br>";
6 } else {
7 print "Si se encontro '$busca' en '$letrero'
8 print "comienza en el caracter # $resultado<br>";
9 }

Extraer parte de un string, con el comando "substr".

Se especifica el string de donde extraer, el caracter donde se va


acomenzar a extraer y opcionalmente la longuitud o número de
caracteres a extraer. Si no se especifica la cantidad de caracteresa
extraer, se extrae hasta el final del string.
Ejemplo:

1 $numero = 12548.3698;
2 $snumero = (string) $numero;
3 $busca = ".";
4 $comienza = strpos( $snumero, $busca );
5 if( $comienza === false ) {
6 print "No se encontro '$busca' en '$snumero' (no tiene decimales) <br>";
7 } else {
8 $enteros = substr( $snumero, 0, $comienza );
9 $decimales = substr( $snumero, $comienza+1 );
10 print "El numero $snum tiene esta parte entera: $enteros, y esta parte decimal:
11
12 $decimales <br>";
13 }
14

-Cambiar todo un string a mayusculas, con el comando


"strtoupper", o a minusculas, con el comando "strtolower".
Ejemplo:

1 $letrero = "Este es Un Letrero, con ALTAS y bajas";


2 $altas = strtoupper( $letrero );
3 $bajas = strtolower( $letrero );
4 print "Letrero original: $letrero <br>";
5 print "Convertido a altas: $altas <br>";
6 print "Convertido a bajas: $bajas <br>";

Validación de campos con números en formato de pesos y


centavos

Este caso es muy común, ya que los usuarios finales al pedir que
llenen un campo numérico con una cantidad, al menos usarán comas
"," para separar miles, millones, etc. Y a veces hasta incluyen el "$", a
pesar de que se le indica que no lo haga. Para esto, se usa el
comando "str_replace", que reemplaza unos caracteres por otros en
un string .

La sintaxis básica para este comando es:

$string_nuevo = str_replace( caracter_antiguo, caracter_nuevo, string


);
Ejemplo:

1 // esta rutina supone que hay un campo en una forma de HTML llamado 'cantidad',
2 // que es la cantidad a pagar
3 // si no se revisa que la variable $cantidad no tenga comas y el signo "$",
4 // lo siguiente puede regresar un CERO
5 // $subtotal = (double) $cantidad;
6 // para asegurar que no haya caracteres "extraños" en la variable $cantidad,
7 // se sustituyen las "," y el "$" por un caracter nulo, borrandolas del mapa
8 $cantidad2 = str_replace( "$", "", $cantidad );
9 $cantidad2 = str_replace( ",", "", $cantidad2 );
10 $subtotal = (double) $cantidad2;
11 $ssubt = number_format( $subtotal, 2 );
12 $iva = $subtotal * 1.15;
13 $siva = number_format( $iva, 2 );
14 $total = $subtotal + $iva;
15 $stot = number_format( $total, 2 );
16 print "Subtotal $ $ssubt <br>";
17 print "IVA $ $siva <br>";
18 print "Total $ $stot <br>";

Convertir caracteres especiales de texto a HTML


Al estar manipulando datos de texto (nombres, descripciones, datos de
archivos creados previamente, datos de bases de datos,datos escritos
por el usuario en una forma, etc.) se presenta la necesidad de mostrar
algunos caracteres especiales (acentos,eñes, diéresis, etc.) en formato
válido de HTML al generar resultados que van a un navegador.
Para lograr esto de una manera rápida y sencilla se usa el comando
"get_html_translation_table".
La sintaxis básica para este comando es:
$tabla = get_html_translation_table( HTML_ENTITIES );

El parámetro debe ser escrito tal y como se muestra en la sintaxis.


Una ves obtenida la tabla de caracteres especiales, hay quesustituir
todos los caracteres especiales de un string con el comando "strtr".
Ejemplo:

1 // aquí se obtiene la tabla de traducción


2 // esto solo es necesario hacerlo UNA SOLA VES en el código principal
3 $tablahtml = get_html_translation_table( HTML_ENTITIES );
4 // necesito convertir un texto a HTML
5 $texto = "Esto es un ejemplo de caracteres especiales: ñ, á, ü... ";
6 print "El texto 'crudo' es: $texto <br>";
7 $texto2 = strtr( $texto, $tablahtml );
8 print "El texto 'traducido' es: $texto2 <br>";
7- Manejo de archivos
El manejo de archivos es importante al manejar plantillas de
HTML que se van a mezclar con rutinas de PHP, y para
almacenar y manejar datos si no se cuenta con una base de
datos.
Es importante señalar que al manipular archivos, se debe contar con
los permisos de acceso necesarios en el directorio detrabajo (o en el
que se desean almacenar). Se recomienda crear un directorio donde
almacenar los archivos, para que solo este directorio tenga permisos
especiales que le permitan crear, grabar y modificar archivos.
En algunos sistemas operativos y/o servidores se pueden cambiar
los permisos de acceso de un directorio mediante algúnprograma de
FTP. Verifique el procedimiento específico para su servidor y/o
sistema operativo.
Es aconsejable incluir la terminación del archivo como ".txt", ".pdf", etc.
La mayor parte de los comandos están orientados a manejar archivos
de texto.

Verificar si existe un archivo


Antes de hacer alguna operación sobre algún archivo, es buena idea
asegurarse que exista, de lo contrario se genera un error que el
usuario final verá en su navegador. Para esto se usa el comando
"file_exists".
La sintaxis básica para este comando es:
$si_no = file_exists( nombre_del_archivo )
El parámetro "nombre_del_archivo" es de tipo "string". El resultado es
de tipo booleano.
Ejemplo:

1 $archivo = "contador.txt";
2 $error = "error_archivo.html";
3 // antes de abrir y usar un archivo, checo si existe
4 if( ! file_exists( $archivo ) ) {
5 // archivo NO encontrado, mandar error
6 header( "location: $error " );
7 exit;
8 }
9 // aquí continuo trabajando con el archivo...

Verificar si es archivo o directorio


Al estar trabajando con los archivos de un directorio, es posible
"toparse" con uno o varios directorios dentro del directorio quese está
examinando. Para saber de que tipo es un "archivo", se usan los
comandos "is_file" y "is_dir".
La sintaxis básica para estos comandos es:
$si_no = is_file(nombre_del_archivo );
$si_no = is_dir( nombre_del_archivo );
El parámetro "nombre_del_archivo" es de tipo "string". El resultado es
de tipo booleano.
Ejemplo:

1 // esta rutina supone que ya se abrió un directorio


2 // y se están leyendo sus contenidos
3 // el detalle de esto se verá mas adelante
4 // el nombre del directorio está en la variable $dir,
5 // y el de los archivos en $arch
6 if( is_dir( "$dir/$arch" ) {
7 // es un directorio, y por lo tanto hay que abrirlo y leer sus contenidos
8 }

Propiedades de archivos
Todos los archivos poseen ciertas propiedades, como tamaño y fechas
de creación y modificación. Estas cualidades se puedenobtener con
los comandos "filesize", "filectime" y "filemtime".
La sintaxis básica para estos comandos es:
$bytes = filesize( nombre_del_archivo );
$segundos = filectime( nombre_del_archivo );
$segundos = filemtime( nombre_del_archivo );

El parámetro "nombre_del_archivo" es de tipo "string". El resultado de


"filesize" es un entero que representa el número debytes. El resultado
de "filectime" y "filemtime" son segundos.
Ejemplo:

1 // obtengo información de un archivo


2 $arch = "algo.txt";
3 $tamano = filesize( $arch );
4 $creado = filectime( $arch );
5 $modificado = filemtime( $arch );
6 if( $tamano < 1024 ) {
7 $medida = "Bytes";
8 }
9 if( $tamano >= 1024 and $tamano < 1024000) {
10 $tamano /= 1000;
11 $medida = "KB";
12 }
13 if( $tamano >= 1024000 and $tamano < 102400000) {
14 $tamano /= 1000000;
15 $medida = "MB";
16 }
17 $screado = date( "d/m/Y H:i:s", $creado );
18 $smodificado = date( "d/m/Y H:i:s", $creado );
19 print "El archivo $arch mide $tamano $medida <br>";
20 print "Fue creado en $screado <br>";
21 print "Fue modificado en $smodificado <br>";

Creando y borrando un archivo


La manera más segura de crear un archivo es usando el comando
"touch", el cual recibe el nombre de un archivo y primerocheca si
existe.
Si el archivo existe, no le hace nada a sus contenidos y solo cambia la
fecha de modificación.
Si el archivo existe, crea un archivo vacío.
Al ejecutar este comando ya no es necesario usar el comando
"file_exists". Recuerde tomar en cuanta los permisos para
creararchivos en el directorio de trabajo, o directorio especificado.
La sintaxis básica para este comando es:
touch( nombre_del_archivo );
Para borrar un archivo, se usa el comando "unlink". Si el archivo no
existe, no pasa nada. Si el archivo existe, es
borradoinmediatamente. NO SE TRANSLADA EL ARCHIVO A LA
PAPELERA (TRASH), NI SE PIDE CONFIRMACIÓN.
La sintaxis básica para este comando es:
unlink( nombre_del_archivo );
Ejemplo:

1 // se va a abrir un archivo
2 $arch = "contador.txt";
3 touch( $arch );
4 // aquí se continúa la rutina ...

Abrir y cerrar un archivo


Para poder trabajar con los contenidos de un archivo, es necesario
abrirlo primero. Esta operación establece un "canal decomunicación
directo" entre la rutina de PHP y el archivo.

Existen tres formas de abrir un archivo:

Letra Modo Descripción

solo abre un archivo solo para leer sus contenidos, no se


r
lectura pueden cambiar ni borrar
solo abre un archivo borrando todo su contenido previo,
w
escritura y comienza a escribir desde el principio
abre un archivo sin borrar su contenido previo, y
a agregar
comienza a escribir al final

Una vez abierto un archivo, se pueden llevar a cabo las operaciones


de lectura, escritura o agregar (append). Es posible abrir ytrabajar con
varios archivos al mismo tiempo.
La sintaxis básica para este comando es:
$apuntador_al_archivo = fopen( nombre_del_archivo, "Letra" );
El parámetro "nombre_del_archivo" es de tipo "string". El parámetro
"Letra" es una letra de la tabla anterior. El resultado es unnumero
entero único que identifica ese canal de comunicación .
Ejemplo:

1 $arch = "contador.txt";
2 // se va a abrir el archivo para lectura
3 $archID = fopen( $arch, "r" );
4 // aquí sigue la rutina

Al terminar de trabajar con un archivo, se recomienda cerrar el canal


de comunicación, con el comando "fclose". La sintaxis básica para
este comando es:

fclose( apuntador_al_archivo );
El parámetro "apuntador_al_archivo" es un entero que se obtuvo al
abrir el archivo.

Ejemplo:

1 $arch = "contador.txt";
2 // se va a abrir el archivo para escritura, borrando contenidos anteriores
3 $archID = fopen( $arch, "w" );
4 // aquí van comandos de escritura

Leer un archivo
Cuando se abre un archivo en modo de lectura, los contenidos del
archivo se accesan con el comando "fgets". Este comandolee linea
por linea del archivo, donde una linea termina con el caracter
"newline" o "\n".
Los archivos de texto creados en los sistemas Windows, Unix, Linux y
algunos programas de Mac OS X incluyen este caracterpara separar
las líneas. Pero los programas del sistema Mac OS 9 o menor, y
algunos programas del sistema Mac OS X, nogeneran este caracter
para separar las lineas. Así que debe tener cuidado al leer un archivo
de texto creado bajo estascircunstancias.
La sintaxis básica para este comando es:
$linea = fgets( apuntador_al_archivo, max_caracteres );
El parámetro "apuntador_al_archivo" es un entero que se obtuvo al
abrir el archivo. A veces no se encuentra un caracter"newline", y para
cubrir estos casos, el segundo parámetro indica cuantos caracteres
máximo deben leerse si no se encuentra un"newline". El comando
regresa un "string".

Ejemplo:

1 $arch = "contador.txt";
2 // se va a abrir el archivo para lectura
3 $archID = fopen( $arch, "r" );
4 // por que será que siempre usan en este ejemplo el # 1024? todo un misterio...
5 $linea = fgets( $archID, 1024 );
6 // aquí termino de usar el archivo y lo cierro
7 fclose( $archID );
8

En el ejemplo anterior, solo se lee una linea. ¿Qué pasa si se


desea leer más líneas? ¿Cómo saber cuantas lineas tiene
unarchivo?
El comando "feof" permite preguntar si ya se llegó al final de un
archivo.

La sintaxis básica para este comando es:


$si_no = feof( apuntador_al_archivo );
El parámetro "apuntador_al_archivo" es un entero que se obtuvo al
abrir el archivo. El comando regresa un booleano indicandosi ya se
llegó al final del archivo: mientras no se llegue al final del archivo, este
comando regresa "false".

Ejemplo:

1 // se va a leer un archivo y a mostrar sus contenidos, linea por linea


2 $arch = "plantilla.html";
3 // se va a abrir el archivo para lectura
4 $archID = fopen( $arch, "r" );
5 // mientras no se llegue al final del archivo...
6 while( ! feof( $archID ) ) {
7 // leer (otra) linea
8 $linea = fgets( $archID, 1024 );
9 // mostrar linea
10 print "$linea";
11 }
12 // aquí termino de usar el archivo y lo cierro
13 fclose( $archID );

Este ejemplo constituye la base para el siguiente capítulo, donde


se explora el uso de plantillas de HTML en conjunto conrutinas de
PHP.

Agregando datos a un archivo


Para agregar datos al final de un archivo existente, se abre
el archivo en modo "a" y se usa el comando "fwrite". La
sintaxis básica para este comando es:
fwrite( apuntador_al_archivo, dato_a_grabar );
El parámetro "apuntador_al_archivo" es un entero que se obtuvo al
abrir el archivo. El parámetro "dato_a_grabar" es un"string". Si se esta
escribiendo un archivo de texto, hay que incluir el caracter "\n" al final
de cada linea.

Ejemplo:

1 // se va a agregar una persona a un archivo de registro de visitantes


2 $arch = "registro.txt";
3 // para asegurarse que el archivo existe...
4 touch( $arch );
5 // este código asume que el usuario final llenó una forma de HTML
6 // donde se encuentran los campos: nombre, email, teléfono
7 // (no se incluye aquí la validación mínima...)
8 // preparo el dato a grabar, para separar los campos uso un "*"
9 $dato = $nombre . "*" . $email . "*" . $teléfono . "\n";
10
11 // se va a abrir el archivo en modo "agregar"
12 $archID = fopen( $arch, "a" );
13
14 // escribo una linea mas
15 fwrite( $archID, $dato );
16
17 // cierro el archivo
18 fclose( $archID );
19
20 Reescribiendo un archivo
21 Para reescribir datos a un archivo existente, borrando todos los datos anteriores, se
22 abre el archivo en modo "w" y se usa elcomando "fwrite".
23 La sintaxis básica para este comando es:
24
25 fwrite( apuntador_al_archivo, dato_a_grabar );
26
27 El parámetro "apuntador_al_archivo" es un entero que se obtuvo al abrir el archivo.
28 El parámetro "dato_a_grabar" es un"string". Si se esta escribiendo un archivo de
29 texto, hay que incluir el caracter "\n" al final de cada linea.
30 Ejemplo:
31 // se va a incrementar un contador de visitas
32 $arch = "contador.txt";
33
34 // para asegurarse que el archivo existe...
35 touch( $arch );
36
37 // primero leo el archivo y obtengo el valor actual del contador
38 $archID = fopen( $arch, "r" );
39 $linea = fgets( $archID, 1024 );
40 // aquí termino de usar el archivo y lo cierro
41 fclose( $archID );
42 // valido que haya leído algo
43
44 if( strlen( $linea ) == 0 ) {
45 // si no leyó nada, iniciar contador en ceros
46 $contador = 0;
47 } else {
48 $contador = (integer) $linea;
49 }
50
51 // incremento el contador en 1
52 $contador++;
53
54 // ahora grabo el contador, destruyendo el valor anterior
55 $archID = fopen( $arch, "w" );
56
57 // escribo el contador
58 fwrite( $archID, $contador );
59
60 // cierro el archivo
fclose( $archID );

Protegiendo archivos contra escrituras múltiples


El ejemplo anterior funciona muy bien hasta que varios "visitantes"
lleguen al mismo tiempo a visitar la página donde tengo elcontador de
visitas.
Para evitar que varios usuarios escriban sobre un archivo al mismo
tiempo, se usan los comandos "flock" y "is_writable". Estoscomandos
evitan que otra rutina pueda escribir en un archivo mientras se está
actualizando.
La sintaxis básica para estos comandos es:
$si_no=is_writable(nombre_de_archivo);
flock( apuntador_al_archivo, entero );

El parámetro "nombre_del_archivo" es un "string". El parámetro


"apuntador_al_archivo" es un entero que se obtuvo al abrir elarchivo.
El parámetro "entero" es un número de la siguiente tabla:

Entero Tipo Descripción

de "seguro" permite a otras rutinas leer el archivo, pero


1
compartido no escribir en él.
evita que otras rutinas lean y escriban el
2 exclusivo
archivo.
3 liberar quita el seguro al archivo.

El comando "flock" siempre se usa en pares, uno para proteger el


archivo y otro para liberarlo. Estas operaciones se ejecutanjusto
después de abrir el archivo y justo antes de cerrarlo.
Ejemplo:

1 // se va a incrementar un contador de visitas


2 $arch = "contador.txt";
3
4 // para asegurarse que el archivo existe...
5 touch( $arch );
6
7 // leo el archivo y obtengo el valor actual del contador
8 $archID = fopen( $arch, "r" );
9
10 $linea = fgets( $archID, 1024 );
11
12 // aquí termino de usar el archivo y lo cierro
13 fclose( $archID );
14
15 // valido que haya leído algo
16
17 if( strlen( $linea ) == 0 ) {
18 // si no leyó nada, iniciar contador en ceros
19 $contador = 0;
20
21 } else {
22 $contador = (integer) $linea;
23
24 }
25
26 // incremento el contador en 1
27 $contador++;
28
29 // ahora grabo el contador, destruyendo el valor anterior
30
31 // pero primero checo si el archivo se puede escribir
32 $bandera = false;
33 $máximo = 120000;
34 $contador = 0;
35
36 // esta parte se deja de tarea entender que hace... :-)
37 while ( ! $bandera ) {
38
39 if( is_writabe( $arch ) ) {
40 $bandera = true;
41 break;
42
43 }
44 $contador++;
45 if( $contador > $máximo ) {
46
47 break;
48 }
49 }
50
51
52 // si el archivo se puede escribir...
53
54 if( $bandera ) {
55 // abro el archivo
56 $archID = fopen( $arch, "w" );
57
58 // lo protejo contra escritura
59 flock( $archID, 2 );
60
61 // escribo el contador
62 fwrite( $archID, $contador );
63
64 // quito el candado
65 flock( $archID, 3 );
66
67 // cierro el archivo
68 fclose( $archID );
}

Operaciones con directorios


Es posible abrir y leer los contenidos de un directorio, para averiguar si
un archivo existe en un directorio, o para buscar un
texto en todos los archivos de un directorio.
Para abir un directorio se usa el parámetro "opendir", el cual funciona
de manera similar al comando "fopen".
La sintaxis básica para este comando es:
$apuntador_al_directorio = opendir( nombre_del_directorio );
El parámetro "nombre_del_directorio" es de tipo "string". El resultado
es un numero entero único que identifica ese canal decomunicación.
En un sistema Unix - Linux - Mac OS X el directorio de trabajo se
representa con un "." y el directorio "padre"(o un nivel superior) por ".."
.
Para leer el contenido del directorio se usa el comando "readdir".
La sintaxis básica para este comando es:
$nombre_de_archivo = readdir( apuntador_al_directorio );

El parámetro "apuntador_al_directorio" es un entero que se obtuvo al


abrir el directorio. El comando regresa un "string", que
contiene el nombre de un archivo. Si se llegó al final del directorio, el
comando regresa "false".
Al terminar de trabajar con un directorio, se recomienda cerrar el canal
de comunicación, con el comando "closedir".

Ejemplo:

1 La sintaxis básica para este comando es:


2
3 closedir( apuntador_al_directorio );
4
5 El parámetro "apuntador_al_directorio" es un entero que se obtuvo al abrir el
6 directorio.
7
8 Ejemplo:
9 // se va a leer un directorio y mostrar los nombres de los archivos que ahí residen
10 $dir = ".";
11
12 $dirID = opendir( $dir );
13
14 while( gettype( $nombre = readdir( $dirID ) ) != boolean ) {
15 print "$nombre ";
16 if( is_dir( $nombre ) ) {
17
18 print " (directorio) ";
19 } else {
20
21 print " (archivo) ";
22 }
23 print " <br>";
24
25 }
26 closedir( $dirID );
27
8 - Galletas
Las galletas son pequeñas cantidades de información que se guardan
en la computadora del usuario. De manera general, solo elservidor que
guardó una galleta puede leerla o modificarla.
El uso mas común de las galletas es guardar preferencias de los
usuarios o datos de acceso a un sistema (como IDs, passwords,etc.).
Para evitar guardar datos de cientos o miles de usuarios en un
servidor, se usa la computadora de cada usuario para queahí se
guarden estas pequeñas cantidades de información.
En el "Sistema de Pedidos" que se incluye como material avanzado
del curso, se usa una galleta para guardar el ID del usuarioy su nivel
de acceso. Esta información permite validar si un usuario tiene acceso
al sistema o no.
La implementación de este sistema de seguridad (de nivel básico)
requiere que en cada una de las rutinas de PHP lo primeroque se
haga es checar si el ID del usuario es válido en una base de datos, y
así permitirle el acceso al sistema. El nivel deacceso sirve para
mostrar la lista de productos y precios de ese nivel, restringiendo el
acceso a productos y/o preciosespeciales.
Cada servidor puede crear hasta 20 galletas para su uso, y cada
galleta tiene un valor máximo de 4 Kbytes. Solo al
mandarinformación de la rutina de PHP al usuario final es posible
crear la galleta en la maquina del usuario (comandos "print","printf",
"echo", "header").

Creación de galletas
Las galletas tienen esta información:
-Nombre de la galleta: un string que se adhiera a las reglas de los
nombres de las variables. El nombre de la galleta va a crear una
variable global con el mismo nombre.
-Valor de la galleta: un string que contenga los datos a guardar. Es
común usar un caracter "separador" si se desea guardar datos con
una estructura.
-Expiración de la galleta: toda galleta debe tener un tiempo de
vigencia, medido en segundos. Después de este tiempo, la galleta
no es válida. Si se pasa un valor 0 (cero), la galleta solo es válida
mientras el usuario tiene abierto su navegador.
-Ruta: define el "área" del sitio donde esta galleta será mandada al
servidor, cada ves que se accesa una página dentro de esta ruta. Si
se desea mandar la galleta para todo el sitio, se usa "/".
-Dominio: define los dominios a los cuales se va a mandar la galleta.
Como esto restringe el mandar la galleta solo desde ciertos
dominios, generalmente se omite al crear galletas de uso "universal".
Si no se desea especificar un dominio, se usa unstring vacío ("") o se
omite el parámetro.
-Transmisión segura: si se especifica el valor 1 (uno, tipo entero,
NO string), solo se transmite la galleta si la conexión essegura
(https). De lo contrario hay que especificar el valor 0 (cero). Se
puede omitir el parámetro.
Para crear una galleta desde una rutina de PHP se usa el comando
"setcookie".
La sintaxis básica para este comando es:
setcookie( nombre_de_la_galleta, valor_de_la_galleta, expiración, ruta
);

Ejemplo:

1 function crea_galleta( $nombre, $valor, $expira ) {


2 // la variable $expira tiene el # de HORAS que va a durar la galleta
3 $t = time() + ( 60 * 60 * $expira);
4 // si la variable $expira fuera en DÍAS se usa esta forma:
5 // $t = time() + ( 60 * 60 * 24 * $expira );
6 // se asume una ruta para todo el sitio: "/"
7 setcookie( $nombre, $valor, $t, "/" );
8 // recuerde que aun no se manda la galleta al usuario,
9 // solo se está creando
10 }
11
12
13 ...
14
15 $galleta = "misitio_prefs";
16 $valor_galleta = $cantidad . "|" . $num_parte . "|" . $precio_unitario;
17 $expira = 24;
18 // solo es válida por 24 horas
19 crea_galleta( $galleta, $valor_galleta, $expira );
20 // aun no se manda la galleta...
print "Aquí se manda la galleta a la maquina del usuario <br>";

Lectura de galletas
Para leer una o varias galletas guardadas, es necesario que el usuario
ejecute una rutina de PHP. Esto hace que todas lasgalletas activas
generen variables globales con el mismo nombre de la galleta. Si la
galleta ya no es válida, no se crea lavariable.
Ejemplo:

1 // código principal
2 ...
3 // checar si existe la variable "$misitio_prefs"
4 if( isset( $misitio_prefs ) ) {
5 // la galleta existe, se va a leer y separar su valor
6 $datos = explode( "|", $misitio_prefs );
7 $cantidad = $datos[0];
8 $num_parte = $datos[1];
9 $precio_unitario = $datos[2];
10 } else {
11 $cantidad = 0;
12 $num_parte = "";
13 $precio_unitario = 0;
14
15 }
16 // voy a preguntar si existe la variable GLOBAL con nombre $nombre
17 global ${$nombre};
18 if( isset( ${$nombre} ) {
19 global $datos;
20 $datos = explode( $separador, ${$nombre} );
21 return true;
22 } else {
23 return false;
24 }
25 }
26
27 ...
28
29 $nombre_galleta = "misitio_prefs";
30
31 if( existe_galleta( $nombre_galleta, "|" ) ) {
32 $cantidad = $datos[0];
33 $num_parte = $datos[1];
34 $precio_unitario = $datos[2];
35 } else {
36 $cantidad = 0;
37 $num_parte = "";
38 $precio_unitario = 0;
39 }
40
41 ...
42
43 $nombre_galleta = "folderx_prefs";
44
45 if( existe_galleta( $nombre_galleta, "**" ) ) {
46 // ejecutar código para la galleta "folderx_prefs"
47 ...
48 }

Borrar una galleta


En este ejemplo se usa un "constructor" de variables "dinámico", en el
cual el nombre de la variable está contenido en otravariable:
${"nombre"} o ${$variable}.
Para borrar una galleta, la manera más segura es crear la galleta con
el mismo nombre, con un valor "vacío" y una fecha deexpiración
"vencida".
Ejemplo:

1 function borra_galleta( $nombre ) {


2 $t = time() - 1;
3 // se asume una ruta para todo el sitio: "/"
4 setcookie( $nombre, "", $t, "/" );
5 }
9- Acceso a base de datos
Las rutinas de PHP pueden accesar varias bases de datos,
incluyendo las basadas en SQL. La más popular es la base de
datosMySQL, y es la que se va a usar para estos ejemplos básicos.

Conexión al servidor
Para establecer una conexión al servidor de base de datos se usa el
comando "mysql_connect" o "mysql_pconnect". El segundocomando
es mas usado en conexiones desde paginas web.
La sintaxis básica para este comando es:
$link = mysql_pconnect( hostname, usuario, pwd );

El parámetro "hostname" es el nombre del servidor de la base de


datos. Es muy usado el nombre "localhost" para indicar quees el
mismo servidor que el del servidor de páginas web. El parámetro
"usuario" y "pwd" son el nombre de un usuario y sucontraseña en el
servidor de base de datos.

Ejemplo:

1 La función regresa un numero entero único que identifica el canal de comunicación


2 con la base de datos, o si hubo un error,regresa "false".
3 Ejemplo:
4
5 $usuario = "folderx";
6 $pwd = "unobiendificil";
7 $servidor = "localhost";
8
9 $link = mysql_pconnect( $servidor, $usuario, $pwd );
10
11 if( ! $link ) {
12
13 header( "location: error_mysql.html" );
14
15 exit;
16 }
Conexión a la base de datos
Una ves conectados al servidor de base de datos, hay que
seleccionar una base de datos específica, de todas las que
puedacontener el servidor. El acceso a esa base de datos debe
estar permitida al usuario con el que se estableció la conexión
alservidor de base de datos. El comando para hacer esto es
"mysql_select_db".
La sintaxis básica para este comando es:
$si_no = mysql_select_db( nombre_de_la_base, link );
El parámetro "nombre_de_la_base" es un string que contiene
precisamente eso. El segundo parámetro es opcional, ya que si
seomite se asume que se va a usar la ultima conexión establecida al
servidor de base de datos. El comando regresa "true" si elusuario tiene
acceso a dicha base, y si esta existe. De no ser exitosa la selección de
la base, regresa "false".

Ejemplo:

1 Ejemplo:
2 $usuario = "folderx";
3 $pwd = "unobiendificil";
4 $servidor = "localhost";
5 $db = "empleados";
6
7 $link = mysql_pconnect( $servidor, $usuario, $pwd );
8
9 if( ! $link ) {
10 header( "location: error_mysql.html" );
11 exit;
12
13 }
14
15 if( ! mysql_select_db( $db ) ) {
16 header( "location: error_mysql.html" );
17 exit;
18
19 }

Operaciones básicas
En general solo existen 4 operaciones básicas que se pueden realizar
con una base de datos:
1- Crear un registro nuevo (agregar datos).
2- Borrar un registro existente (borrar datos).
3- Cambiar datos a un registro existente (modificar datos).
4- Buscar datos (búsquedas).
Una ves establecida la conexión al servidor, y seleccionada la base
de datos a usar, es posible llevar a cabo estas operacionescon el
comando "mysql_query".
La sintaxis básica para este comando es:
$si_no = mysql_query( comando_de_sql, link );
El parámetro "comando_de_sql" es un string que contiene
precisamente eso. El segundo parámetro es opcional, ya que si
seomite se asume que se va a usar la ultima conexión establecida al
servidor de base de datos. El comando regresa el resultadodel
"query" si el comando se ejecutó exitosamente, y "false" si no lo fue.
Está fuera del alcance de este curso explicar a detalle los siguientes
ejemplos:

Ejemplo:

1 // crear un registro nuevo


2 $nombre = "Gerardo";
3 $sueldo = 25000;
4 $query = "insert into empleados ( nombre, sueldo ) values ( '$nombre', '$sueldo') ";
5 mysql_query( $query )
6 or die ("Error FATAL al crear datos en $db: " . mysql_error() );
7
8 // borrar un registro existente
9 $nombre = "Fulano";
10 $query = "delete from empleados where nombre='$nombre' ";
11 mysql_query( $query )
12 or die ("Error FATAL al borrar datos de $db: " . mysql_error() );
13
14 // modificar un registro existente
15 $nombre = "Gerardo";
16 $sueldo = 35000;
17 $query = "update empleados set sueldo='$sueldo' where nombre='$nombre' ";
18 mysql_query( $query )
19 or die ("Error FATAL al modificar datos en $db: " . mysql_error() );
20
21 // buscar todos los registros
22 $tablahtml = get_html_translation_table( HTML_ENTITIES );
23 $query = "select * from empleados ";
24
25 // esta ves voy a guardar el resultado del 'query'
26 $resultado = mysql_query( $query )
27 or die ("Error FATAL al buscar datos de $db: " . mysql_error() );
28
29 // aquí averiguo cuantos registros fueron encontrados
30 $registros = mysql_num_rows( $resultado );
31
32 // aquí leo todos los registros encontrados, uno por uno, y los muestro
33 while( $renglon = mysql_fetch_object($resultado) ) {
34 $nombre = strtr( $renglon->nombre, $tablahtml );
35 print "Nombre del empleado: $nombre <br>\n";
36 $sueldo = number_format( $renglon->sueldo, 2 );
37 print "Sueldo actual: $ $sueldo <br>\n";
38 }
39
10- Otros recursos Referencias en el internet
El sitio oficial del lenguaje PHP en la red es www.php.net

El mejor lugar en la red para recursos generales de PHP es


www..zend.com , en especial el manual en línea
(www.zend.com/manual/) y la galería de código (www.zend.com/).

El sitio oficial de MySQL en la red es www.mysql.com

También podría gustarte