Introducción PHP 2

Anuncio
DFSI Curso 2003-2004
PHP
1
PHP Introducción
Qué es y qué herramientas vamos a usar
El PHP (Profesional Home Pages - Páginas Personales
Profesionales) es un un lenguaje para la creación de páginas
web. Es una solución para la construcción de Webs con
independencia de la Base de Datos (aunque normalmente se
usará MySQL) del servidor Web (aunque normalmente se
usará Apache), válida para cualquier plataforma (Unix,
Windows, Mac). El objetivo final es conseguir la integración
de las páginas HTML con aplicaciones que corran en el
servidor como procesos integrados en el mismo, y no como
un proceso separado, como ocurre con los CGIs (aunque PHP
también puede funcionar como un CGI) . Igualmente interesa
que dichas aplicaciones sean totalmente independientes del
navegador (lo que no ocurre con otros lenguajes basados en
scripts como JavaScript o VisualBasic Script).
Para trabajar con PHP nos va a hacer falta:
Un editor para poder escribir los programas PHP, por
ejemplo, FrontPage (o notepad) en windows y xemacs (o
kwrite) en Linux
•
Un servidor de páginas web , que ejecute y muestre
los programas realizados con PHP, nosotros usaremos
Apache.
•
Una Base de Datos, donde podamos guardar y
recuperar información. Esta parte es optativa, aunque en un
proyecto real suele ser necesaria. Nosotros utilizaremos
MySQL.
•
Un navegador, para ver las páginas generadas con
PHP, por ejemplo, el Internet Explorer o el Netscape
•
Y, por supuesto, el PHP.
•
DFSI Curso 2003-2004
PHP
Índice
1.
1.
2.
3.
4.
2.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
3.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Introducción a PHP
Introducción
Instalación de PHP en Windows
Instalación de PHP en Linux
Ejercicios
Conceptos básicos del lenguaje PHP
Inserción de PHP en HTML
Separación de instrucciones
Comentarios
Tipos de datos
Variables
Constantes
Expresiones y operadores
Estructuras de control
Funciones
Ejercicios
Conceptos Avanzados del lenguaje PHP
Clases y objetos
Manejo de errores
Creacion de imágenes
Autentificación de un usuario con PHP
Cookies (Galletitas)
Utilización de ficheros remotos
Subida de ficheros usando HTTP
Manejo de Conexiones
Funciones de PHP para MySQL
Referencia de funciones de PHP
Ejercicios
2
DFSI Curso 2003-2004
PHP
3
1.- Inserción de PHP en HTML
EL PHP va dentro dentro de la página HTML (o página PHP,
según se vea) y para insertarlo dentro de utilizan, entre otras
cosas, las instrucciones de procesado (<? ... ?>).
<? .... ?> Sólo si se activa la función short_tags() o la
bandera de configuración short_open_tag.
•
<?php .... ?>
•
<script languaje="php"> .... </script>
•
Sólo si se activan los tags para ficheros 'asp' con la
bandera de configuración asp_tags.
•
Ejemplos de PHP en HTML:
<html>
<head> <title>Ejemplo 1 </title></head>
<body>
<h1> Ejemplo de PHP </h1>
<? echo ("esta es la más simple, una instrucción de
procesado SGML\n"); ?>
<br>
<?php print "si quiere servir documentos XML, se
puede hacer esto\n"; ?>
<br>
<script language="php">
printf ("a algunos editores -como
FrontPage- no les
gustan las intrucciones de
procesado");
</script>
<br>
<% echo ("Puedes también usar etiquetas tipo ASP");
%>
<br>
<br>
</body>
</html>
DFSI Curso 2003-2004
PHP
En el ejemplo anterior se puede observar que echo, printf y
print sirven para lo mismo para escribir en la página HTML
que genera PHP como resultado .
2.- Separación de instrucciones
Las instrucciones se separan con ';', en el caso de ser la
última instrucción no es necesario el punto y coma.
3.- Comentarios
Los comentarios en PHP pueden ser:
Como en C o C++, /*...*/ ó //
•
Otro tipo de comentario de una línea es #, que
comentará la línea en la que aparezca pero sólo hasta el tag
?> que cierra el código php.
•
4.- Tipos de Datos
Los tipos de cada variable en PHP no están tan claros como
en C. El intérprete asigna el tipo de una variable según el uso
que se esté haciendo de ella. Para asignar un tipo fijo a una
variable se utiliza la función settype(). Los tipos son:
•
•
•
•
•
•
Enteros
Flotantes
String
Arrays
Objetos
Variables variables
Respecto al tipo entero y flotante, no hay mucho que decir,
así que detallaremos sólo los tipos String, Arrays y Objetos.
Ejemplos de Tipos de datos simples de PHP:
<html>
<head> <title>Ejemplo 2 </title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
4
DFSI Curso 2003-2004
#Enteros
$a = 1234;
$a = -123;
$a = 0123;
decimal)
$a = 0x12;
decimal) */
PHP
5
# número decimal
# un número negativo
# número octal (equivalente al 83
/* número hexadecimal (equivalente al 18
//Flotantes o reales
$b = 1.234; $b = 1.2e3;
//Escribimos algo
print "\n La a= $a y la b= $b <br>\n";
?>
</body>
</html>
En el ejemplo anterior puede verse que se han usado
distintos tipos de comentarios
4.1. -String
Las cadenas pueden estar delimitadas por " o '. Si la cadena
está delimitada por comillas dobles, cualquier variable
incluida dentro de ella será sustituida por su valor (ver y
ejecutar el ejemplo anterior). Para especificar el carácter " se
escapará con el carácter backslash( \ ) Otra forma de
delimitar una cadena es utilizando la sintaxis de documentos
incrustado "<<<" Ejemplo:
$variable = <<< EOD
Ejemplo de cadena
que ocupa
varias líneas
EOD;
La marca de final de un docuemento incrustado (en este caso
EOD) debe estar en la primera columan del documento.
Las operaciones con cadenas son exactamente igual que en
PERL. Por ejemplo, con strlen se ve el tamaño de una
cadena y con el punto ( . ) se concatenan cadenas.
DFSI Curso 2003-2004
PHP
6
Operaciones con cadenas
<html>
<head> <title>Ejemplo 3 </title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
/* Asignando una cadena. */
$str = "Esto es una cadena";
/* Añadiendo a la cadena. */
$str = $str . " con algo más de texto";
/* Otra forma de añadir, incluye un carácter de
nueva línea */
$str .= " Y un carácter de nueva línea al
final.\n";
print "$str <br>\n";
/* Esta cadena terminará siendo '<p>Número: 9</p>'
*/
$num = 9;
$str = "<p>Número: $num</p>";
print "$str <br>\n";
/* Esta será '<p>Número: $num</p>' */
$num = 9;
$str = '<p>Número: $num</p>';
print "$str <br>\n";
/* Obtener el primer carácter de una cadena
una vector*/
$str = 'Esto es una prueba.';
$first = $str[0];
print "$str 0->$first <br>\n";
como
/* Obtener el último carácter de una cadena. */
$str = 'Esto es aún una prueba.';
$last = $str[strlen($str)-1];
print "$str last->$last <br>\n";
?>
</body>
</html>
DFSI Curso 2003-2004
PHP
7
Para hacer conversión de cadenas a otros tipos de datos hay
que tener en cuenta una cadena se evalúa como un valor
numérico, el valor resultante y el tipo se determinan como
sigue. La cadena se evaluará como un doble si contiene
cualquiera de los caracteres '.', 'e', o 'E'. En caso contrario, se
evaluará como un entero. El valor viene dado por la porción
inicial de la cadena. Si la cadena comienza con datos de valor
numérico, este será el valor usado. En caso contrario, el valor
será 0 (cero). Cuando la primera expresión es una cadena, el
tipo de la variable dependerá de la segunda expresión.
Ejemplos de tipos de datos
<html>
<head> <title>Ejemplo 4</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
$foo = 1 + "10.5";
// $foo es doble
(11.5)
print "$foo <br>\n";
$foo = 1 + "-1.3e3";
// $foo es doble (1299)
print "$foo <br>\n";
$foo = 1 + "bob-1.3e3";
// $foo es entero
(1)
print "$foo <br>\n";
$foo = 1 + "bob3";
// $foo es entero
(1)
print "$foo <br>\n";
$foo = 1 + "10 Cerditos";
// $foo es entero
(11)
print "$foo <br>\n";
$foo = 1 + "10 Cerditos"; // $foo es entero (11)
print "$foo <br>\n";
$foo = "10.0 cerdos " + 1;
// $foo es entero
(11)
print "$foo <br>\n";
$foo = "10.0 cerdos " + 1.0;
// $foo es doble
(11)
print "$foo <br>\n";
?>
DFSI Curso 2003-2004
PHP
</body>
</html>
4.2.-Arrays
Los Arrays en PHP se pueden utlizar tanto como Arrays
indexados (vectores) o como Arrays asociativos (tablas
hash). Para PHP, no existen ninguna diferencia arrays
indexados unidimensionales y arrays asociativos. Las
funciones que se utilizan para crear Arrays son list() o
array() , o se puede asignar el valor de cada elemento del
array de manera explícita. En el caso de que no se
especifique el índice en un array, el elemento que se asigna
se añade al final.
Ejemplos de Arrays
<html>
<head> <title>Ejemplo 5</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
#forma explicita
$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
#Añadiendo valores al array
$a[] = "hola"; // $a[2] == "hola"
$a[] = "mundo"; // $a[3] == "mundo"
#mostramos los resultados
print "a= $a[0] , $a[1] , $a[2] , $a[3] <br>\n";
print "b[foo]=".$b["foo"]."<br>\n";
?>
</body>
</html>
8
DFSI Curso 2003-2004
PHP
Los arrays se pueden ordenar usando las funciones asort(),
arsort(), ksort(), rsort(), sort(), uasort(), usort(), y uksort()
dependiendo del tipo de ordenación que se desee.
Se puede contar el número de elementos de un array usando
la función count().
Se puede recorrer un array usando las funciones next() y
prev(). Otra forma habitual de recorrer un array es usando la
función each().
Los arrays multidimensionales son bastante simples, para
cada dimensión array, se puede añadir otro valor [clave] al
final. Los indices de un array multidimensional pueden ser
tanto numéricos como asociativos.
Arrays multidimensionales
$a[1]
dimensión
$a["foo"]
= $f;
# ejemplos de una sola
= $f;
$a[1][0]
= $f;
# bidimensional
$a["foo"][2] = $f;
# (se pueden mezclar
índices numéricos y asociativos)
$a[3]["bar"] = $f;
# (se pueden mezclar
índices numéricos y asociativos)
$a["foo"][4]["bar"][0] = $f;
# tetradimensional!
Los arrays se puede rellenar también usando =>
# Ejemplo 1:
$a["color"]
$a["sabor"]
$a["forma"]
$a["nombre"]
$a[3]
=
=
=
=
=
"rojo";
"dulce";
"redondeada";
"manzana";
4;
# Ejemplo 2:
$a = array(
"color" => "rojo",
"sabor" => "dulce",
"forma" => "redondeada",
"nombre" => "manzana",
9
DFSI Curso 2003-2004
3
PHP
10
=> 4
);
4.3.-Objetos
Para inicializar un objeto se utiliza el método new , y para
acceder a cada uno de sus métodos se utiliza el operador -> .
class nada {
function haz_nada () {
echo "No estoy haciendo nada.";
}
}
$miclase = new nada;
$miclase->haz_nada();
Posteriormente veremos como trabajar con objetos en PHP
con más profundidad.
4.4.-Conversión de Tipos de datos
Una variable en PHP, define su tipo según el contenido y el
contexto en el que se utilice, es decir, si se asigna una
cadena a una variable, el tipo de esa variable será string . Si
a esa misma variable se el asigna un número, el tipo
cambiará a entero .
Para asegurarte de que una variable es del tipo adecuado se
utiliza la función settype() . Para obtener el tipo de una
variable se utiliza la función gettype() .
También es posible utilizar el mecanismo del casting tal y
como se utiliza en C.
Ejemplos de Castings
<html>
<head> <title>Ejemplo 6</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
$foo = 10;
// $foo es un entero
DFSI Curso 2003-2004
$bar = (double) $foo;
PHP
11
// $bar es un doble
#Mostramos resultados
print "bar=$bar , foo=$foo <br>\n";
?>
</body>
</html>
Los tipos de casting permitidos son:
•
•
•
•
•
(int), (integer) - fuerza a entero (integer)
(real), (double), (float) - fuerza a doble (double)
(string) - fuerza a cadena (string)
(array) - fuerza a array (array)
(object) - fuerza a objeto (object)
5.- Variables
En PHP las variables se representan como un signo de dólar
seguido por el nombre de la variable. El nombre de la
variable es sensible a minúsculas y mayúsculas. Las variables
se asignan normalmente por valor, pero desde PHP4, también
se asignan por referencia usando el símbolo &
Variables por valor y referencia
<html>
<head> <title>Ejemplo 7</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
$foo = 'Bob';
// Asigna el valor 'Bob'
a $foo
$bar = &$foo;
// Referencia $foo vía
$bar.
$bar = "Mi nombre es $bar"; // Modifica $bar...
echo $foo." <br>\n";
// $foo
también se modifica.
echo $bar." <br>\n";
?>
DFSI Curso 2003-2004
PHP
</body>
</html>
Algo importante a tener en cuenta es que sólo las variables
con nombre pueden ser asignadas por referencia.
5.2.- Variables predefinidas
En PHP cada vez que se ejecuta un script, existen variables
que se crean y que nos pueden informar del entorno en el
que se está ejecutando dicho script.
Para obtener una lista de todas estas variables predefinidas
se puede utilizar la funcion PHPinfo().
De todas estas variables, algunas se crean dependiendo del
servidor que se esté utilizando y otras son propias de PHP.
Si se tratara de un servidor Apache, la lista de variables es:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
GATEWAY_INTERFACE:
SERVER_NAME
SERVER_SOFTWARE
SERVER_PROTOCOL
REQUEST_METHOD
QUERY_STRING
DOCUMENT_ROOT
HTTP_ACCEPT
HTTP_ACCEPT_CHARSET
HTTP_ENCODING
HTTP_ACCEPT_LANGUAJE
HTTP_CONNECTION
HTTP_HOST
HTTP_REFERER
HTTP_USER_AGENT
REMOTE_ADDR
REMOTE_PORT
SCRIPT_FILENAME
SERVER_ADMIN
SERVER_PORT
SERVER_SIGNATURE
PATH_TANSLATED
SCRIPT_NAME
12
DFSI Curso 2003-2004
PHP
REQUEST_URL
•
las variables creadas por el propio PHP son:
argv
argc
PHP_SELF
HTTP_COOKIE_VARS
HTTP_GET_VARS
HTTP_POST_VARS
•
•
•
•
•
•
Nota: Esta lista no es exhaustiva ni pretende serlo.
Simplemente es una guía de qué tipo de variables
predefinidas se puede esperar tener disponibles en un script
PHP.
5.3.- Ámbito de una Varible
El ámbito de una variable en PHP es exactamente igual que
en C o en Perl tomando siempre en cuenta los ficheros
incluidos al principio de cada programa.
La única diferencia se encuentra en las variables globales,
que tienen que ser expresamente definidas dentro de las
funciones.
Variables globales
<html>
<head> <title>Ejemplo 8</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
$a = 1;
$b = 2;
Function Sum () {
global $a, $b;
$b = $a + $b;
}
Sum ();
echo $b;
13
DFSI Curso 2003-2004
PHP
14
?>
</body>
</html>
5.4. Varibles variables
PHP permite un mecanismo para mantener variables con un
nombre no fijo.
Por ejemplo:
$a = "hola";
$$a = "mundo";
El ejemplo anterior, define dos variables, una denominada $a
que contiene el valor "hola" y otra que se llama $hola que
contiene el valor "mundo"
Para acceder al valor de una variable, se accede con:
echo "$a ${$a}";
La sentencia anterior provocará la salida "hola mundo".
Algo que se debe tener en cuenta cuando se utilizan
variables, es que hay que resolver la ambiguedad que se crea
al utilizar arrays de variables de este tipo. Por ejemplo
$$a[1] provoca una ambiguedad para el intérprete, puesto
que no sabe si se desea utilizar la variable denominada $a[1]
o utilizar la variables $a indexándola en su primer valor. Para
esto se utiliza una sintaxis especial que sería ${$a[1]} o
${$a}[1] según se desee una opción u otra.
5.5.- Variables de los formularios HTML
Cuando existe un formulario en HTML, inmediatamente
después de ser enviado, dentro del ámbito PHP se crean
automáticamente una variable por cada uno de los objetos
que contiene el formulario.
Por ejemplo, consideremos el siguiente formulario:
DFSI Curso 2003-2004
PHP
15
Formulario simple
<html>
<head> <title>Ejemplo 9</title></head>
<body>
<h1> Ejemplo de Formulario 1 </h1>
<p>
Dame tu nombre !!!
<form action="ej10.php" method="post">
Nombre: <input type="text" name="nombre">
<input type="submit">
</form>
</body>
</html>
Cuando es enviado, PHP creará la variable $nombre, que
contendrá lo que sea que se introdujo en el campo Nombre::
del formulario.
Procesado de Formulario siple
<html>
<head> <title>Ejemplo 10</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
print "<h2>Hola $nombre </h2>\n";
?>
</body>
</html>
PHP también maneja arrays en el contexto de variables de
formularios, pero sólo en una dimensión. Se puede, por
ejemplo, agrupar juntas variables relacionadas, o usar esta
característica para recuperar valores de un campo select
input múltiple:
DFSI Curso 2003-2004
PHP
Formulario complejos
<html>
<head> <title>Ejemplo 11</title></head>
<body>
<h1> Ejemplo de Formulario 2 </h1>
<form action="ej12.php" method="post">
Nombre: <input type="text"
name="personal[name]">
E-mail: <input type="text"
name="personal[email]">
Cerveza: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog
<option value="guinness">Guinness
<option value="stuttgarter">Stuttgarter
Schwabenbräu
</select>
<input type="submit">
</form>
</body>
</html>
Variables de formularios complejos
<html>
<head> <title>Ejemplo 12</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
print "<h2>Hola $personal[name] , ";
print "tu email es $personal[email] y ";
print "te gusta la cerveza $beer[0] </h2>\n";
?>
</body>
</html>
16
DFSI Curso 2003-2004
PHP
17
Si la posibilidad de PHP de track_vars está activada (se hace
en la configurtación previa a la compilación), las variables
enviadas con los métodos POST o GET también se
encontrarán en los arrays asociativos globales
$HTTP_POST_VARS y $HTTP_GET_VARS.
5.6.- Cookies HTML
Las cookies son un mecanismo para almacenar datos en el
navegador y así rastrear o identificar a usuarios que vuelven.
La función SetCookie() es una función PHP para asignar
Cookies a un ordenador cliente. Esta función se debe llamar
siempre antes de comenzar a crear la página puesto que
debe formar parte de la cabecera de HTML.
Cualquier Cookie que se envía a un cliente, se convierte
dentro de PHP en una variable.
Ejemplos de cookies con PHP
<?php
$cuenta++;
SetCookie ("cuenta", $cuenta, time()+3600);
SetCookie ("visita[$cuenta]", "Visita número
$cuenta", time()+3600);
?>
<html>
<head> <title>Ejemplo 13</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
print "cuenta: $cuenta <br>\n";
print "Número de Visitas:".count($visita)."
<br>\n";
for ($i=0; $i < count ($visita) ; $i++)
{
print "Visita $i:".$visita[$i]." <br>\n";
}
?>
DFSI Curso 2003-2004
PHP
18
</body>
</html>
Este ejemplo mantiene dos Cookies en el cliente. La primera
mantiene el contador cuenta y la segunda contiene una lista
de los comentarios de cada una de las veces que se ha
actualizado la cookie, visita.
Más adelante veremos con más profundidad el uso de las
cookies.
5.7.- Variables de entorno
Las variables de entorno, tales como $HOME, para entornos
Linux, se pueden utilizar desde PHP.
Para asegurarnos podemos usar la función getenv()
También se puede asignar un valor a una variable de entorno
con la función putenv()
6.- Constantes
Las constantes en PHP tienen que ser definidas por la función
define() y además no pueden ser redefinidas con otro valor.
Además, existen una serie de variables predefinidas
denominadas:
_FILE_: Fichero que se está procesando.
_LINE_: Línea del fichero que se está procesando
•
_PHP_VERSION: Versión de PHP.
•
PHP_OS: Sistema operativo del cliente.
•
TRUE: Verdadero.
•
FALSE: Falso.
•
E_ERROR: Error sin recuperación.
•
E_WARNING: Error recuperable.
•
E_PARSE: Error no recuperable (sintaxis).
•
E_NOTICE: Puede Tratarse de un error o no.
Normalmente permite continuar la ejecución.
Ejemplo:
•
•
DFSI Curso 2003-2004
PHP
19
Todas las constantes que empiezan por "E_"se utilizan
normalmente con la función error_reporting().
Ejemplos de constantes
<html>
<head> <title>Ejemplo 14</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
define("CONSTANTE", "hello world.");
echo CONSTANTE;
?>
</body>
</html>
7.- Expresiones y operadores
En PHP una expresión es cualquier cosa que pueda contener
un valor. Las expresiones más simples son las variables y las
constantes y otras más complicadas serán las funciones,
puesto que cada función devuelve un valor al ser invocada,
es decir, contiene un valor, por lo tanto, es una expresión.
Todas las expresiones en PHP son exactamente igual que en
C. Los operadores abreviados, los incrementos, etc, son
exactamente iguales. Incluso existen otros operadores
adicionales como el operador "." que concatena valores de
variables, o el operador "===" denominado operador de
identidad que devolverá verdadero si las expresiones a
ambos lados del operador contienen el mismo valor y a la vez
son del mismo tipo. Por último, el operador "@" sirve para el
control de errores. Para poder ver como funciona el operador
@, veamos un ejemplo:
<?php
$res = @mysql_query("select nombre from clientes")
or die
("Error en la selección, '$php_errormsg'");
?>
DFSI Curso 2003-2004
PHP
20
Este ejemplo, utiliza el operador @ en la llamada a
mysql_query y en el caso de dar un error, se salvará el
mensaje
devuelto
en
una
variable
denominada
php_errormsg. Esta variable contendra el mensaje de error
de cada sentencia y si ocurre otro error posterior, se
machaca el valor con la nueva cadena.
PHP mantiene también los operadores " ' " que sirven para
ejecutar un comando del sistema tal y como hace la función
system().
En PHP existen dos operadores and y dos operadores or que
son: 'and', '&&' y 'or', '||' respectivamente, que se diferencian
en la precedencia de cada uno.
La tabla que nos puede resumir la precedencia de cada uno
de los operadores es:
Asocitividad
Operadores
Izquierda
Izquierda
,
or
Izquierda
Izquierda
Derecha
xor
and
print
Izquierda
Izquierda
= += -* *= /= .= %= &= |= ^= ~= <<= >>=
?:
Izquierda
Izquierda
Izquierda
||
&&
|
Izquierda
Izquierda
^
&
No posee
No posee
Izquierda
== != ===
< <= > >=
>> <<
Izquierda
Izquierda
+-.
*/%
Derecha
Derecha
No posee
! ~ ++ -- (int) (double) (string) (array) (object) @
[
new
DFSI Curso 2003-2004
PHP
21
Ejemplos de expresiones
<html>
<head> <title>Ejemplo 15</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
function double($i) {
return $i*2;
}
$b = $a = 5;
/* asignar el valor cinco a las
variables $a y $b */
$c = $a++;
/* postincremento, asignar el
valor original de $a (5) a $c */
$e = $d = ++$b;
/* preincremento, asignar el
valor incrementado de $b (6) a
$d y a $e */
/* en este punto, tanto $d como $e son iguales a 6
*/
$f = double($d++); /* asignar el doble del valor
de $d antes
del incremento, 2*6 = 12 a
$f */
$g = double(++$e); /* asignar el doble del valor
de $e después
del incremento, 2*7 = 14 a
$g */
$h = $g += 10;
/* primero, $g es incrementado
en 10 y termina valiendo 24.
después el valor de la
asignación (24) se asigna a $h,
y $h también acaba valiendo
24. */
#Operador de ejecución
$output = `ls -al`;
echo "<pre>$output</pre><br>";
echo "<h3>Postincremento</h3>";
DFSI Curso 2003-2004
PHP
22
$a = 5;
echo "Debería ser 5: " . $a++ . "<br>\n";
echo "Debería ser 6: " . $a . "<br>\n";
echo
$a =
echo
echo
"<h3>Preincremento</h3>";
5;
"Debería ser 6: " . ++$a . "<br>\n";
"Debería ser 6: " . $a . "<br>\n";
echo
$a =
echo
echo
"<h3>Postdecremento</h3>";
5;
"Debería ser 5: " . $a-- . "<br>\n";
"Debería ser 4: " . $a . "<br>\n";
echo
$a =
echo
echo
?>
"<h3>Predecremento</h3>";
5;
"Debería ser 4: " . --$a . "<br>\n";
"Debería ser 4: " . $a . "<br>\n";
</body>
</html>
8.- Estructuras de Control
Además de la sintaxis normal (parecida al Perl o al C), PHP
ofrece una sintaxis altenativa para alguna de sus estructuras
de control; a saber, if, while, for, y switch. En cada caso, la
forma básica de la sintaxis alternativa es cambiar abrir-llave
por dos puntos (:) y cerrar-llave por endif;, endwhile;,
endfor;, or endswitch;, respectivamente.
Ejemplo de sintaxis alternativa para el if
<html>
<head> <title>Ejemplo 16</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
$a=8;
DFSI Curso 2003-2004
PHP
$b=6;
#Primer if
if ($a > $b) {
print "a es mayor que b<br>";
$b = $a;
}
#if alternativo
if ($a > $b):
print "A es mayor que B<br>";
endif;
#Segundo if (con else y
if ($a > $b) {
print "a es mayor
} elseif ($a == $b) {
print "a es igual
} else {
print "b es mayor
}
elseif )
que b<br>";
que b<br>";
que a<br>";
#Segundo if alternativo
if ($a > $b):
print "A es mayor que B<br>";
print "...";
elseif ($a == $b):
print "A es igual a B<br>";
print "!!!";
else:
print "B es mayor que A<br>";
endif;
?>
</body>
</html>
La mejor forma de resumir cada una de las opciones que ofrece PHP para las
estructuras de control es mediante una tabla:
Estructura
Alternativa
If, if else, if elseif
while
if: endif;
while: endwhile;
for
do.. while
foreach(array as $value)
for: endfor;
-
23
DFSI Curso 2003-2004
PHP
24
foreach(array as $key=>$value)
switch
continue
switch: endswitch;
-
break
require()(Necesitan estar dentro de tags PHP)
include()(Necesitan estar dentro de tags PHP)
-
La sentencia require() se sustituye a sí misma con el archivo
especificado, tal y como funciona la directiva #include de C.
La sentencia include() incluye y evalúa el archivo
especificado.
A diferencia de include(), require() siempre leerá el archivo
referenciado, incluso si la línea en que está no se ejecuta
nunca. Si se quiere incluir condicionalmente un archivo, se
usa include(). La sentencia conditional no afecta a
require(). No obstante, si la línea en la cual aparece el
require() no se ejecuta, tampoco se ejecutará el código del
archivo referenciado.
De forma similar, las estructuras de bucle no afectan la
conducta de require().. Aunque el código contenido en el
archivo referenciado está todavía sujeto al bucle, el propio
require() sólo ocurre una vez. Esto significa que no se
puede poner una sentencia require() dentro de una
estructura de bucle y esperar que incluya el contenido de un
archivo distinto en cada iteración. Para hacer esto, usa una
sentencia include(). Así, require, reemplaza su llamada por
el contenido del fichero que requiere, e include, incluye y
evalua el fichero especificado.
Ejemplo de include 1
<?php
print "Hola Caracola<br>\n";
?>
Ejemplo de include 2
<html>
<head> <title>Ejemplo 18</title></head>
<body>
<h1> Ejemplo de PHP </h1>
DFSI Curso 2003-2004
PHP
25
<?php
include( 'ej17.php' );
?>
</body>
</html>
9.-. Funciones
9.1.- Funciones definidas por el usuario
Un ejemplo puede ser:
function foo($arg1, $arg2, ..., $argN)
{
echo "Función ejemplo"
return $value;
}
Dentro de una función puede aparecer cualquier cosa, incluso
otra función o definiciones de clase.
Respecto al paso de argumentos, son siempre pasados por
valor y para pasarlos por referencia hay que indicarlo y se
puede hacer de dos formas diferentes, en la definición de la
función, anteponiendo el símbolo & al argumento que
corresponda, en este caso la llamada será igual que la
llamada a una función normal, o manteniendo la definición de
la función normal y anteponer un & delante del argumento
que corresponda en la llamada a la función.
Ejemplo de parámetros de funciones
<html>
<head> <title>Ejemplo 19</title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
#Definimos la función con parametros por referencia
DFSI Curso 2003-2004
PHP
26
function suma1 (&$a, &$b)
{
$c=$a+$b;
return $c;
}
#Definimos la función con parametros por valor
function suma2 ($a, $b)
{
$c=$a+$b;
return $c;
}
$a=2; $b=3; $suma;
#Llamamos la función 1 por referencia (no puede ser
de otra forma)
print $suma=suma1($a,$b);
#Llamamos la función 2 por referencia
print $suma=suma1(&$a,&$b);
#Llamamos la función 2 por valor
print $suma=suma1($a,$b);
?>
</body>
</html>
PHP permite el mecanismo de argumentos por defecto. Un
ejemplo de esta caracteristica es:
function hacerCafe($tipo="capuchino")
{
return "he hecho un café $tipo\n";
}
En la llamada a esta función se obtendrá una frase u otra
según se llame:
echo hacerCafe();
echo hacerCafe("expreso");
DFSI Curso 2003-2004
PHP
En el caso de tratarse de una función con argumentos por
defecto y argumentos normales, los argumentos por defecto
deberán estar agrupados al final de la lista de argumentos.
En PHP4 el número de argumentos de una función definida
por el usuario, puede ser variable, se utilizan las funciones
func_num_args(), func_get_arg() y func_get_args().
9.2- Valores devueltos
A diferencia de C, PHP puede devolver cualquier número de
valores, sólo hará falta recibir estos argumentos de la forma
adecuada. Ejemplo:
function numeros()
{
return array(0,1,2);
}
list ($cero, $uno, $dos) = numeros();
9.3- Funciones Variables
PHP soporta el concepto de funciones variable, esto significa
que si una variable tiene unos paréntesis añadidos al final,
PHP buscará una función con el mismo nombre que la
evaluación de la variable, e intentará ejecutarla.
<?php
funtcion foo()
{
echo "En foo()<br>\n";
}
function bar ($arg ='')
{
echo " bar();El argumento ha sido
'$arg'.<br>\n";
}
$func = 'foo';
$func();
$func='bar';
$func('test');
?>
27
DFSI Curso 2003-2004
PHP
28
10. Ejercicios
Ejercicio: Realizar una página PHP que genere dos vectores
ordenados y los una en un tercero.
Ejercicio: Escribir una función mcd que calcule el máximo
comúm divisor de dos números y lo devuelva.
Ejercicio: Hacer un formulario que pida las horas trabajadas
al día, el número de días. Dicho formulario debe entregar los
datos a una página PHP que calculará el salario neto, a partir
del salario bruto y las retenciones fiscales (suponer un 12%)
Ejercicio: Realizar una página PHP que genere, escriba y
suma dos matrices NxN.
Ejercicio: Realizar una página PHP que ilustre el uso de los
distintos tipos de casting posible, mostrando los tipos de las
variables
Ejercicio: Hacer un formulario que pida el nombre del
usuario. Dicho formulario debe entregar dicho nombre a una
página PHP que guardará el nombre del usuario y las veces
que ha visitado el script PHP con Cookies.
1.- Clases y objetos
Una clase es una colección de variables y de
funciones que acceden a esas variables. Una clase se
define con la siguiente sintaxis: La sintaxis para
definir una clase es la siguiente:
<?php
class Carrito {
var $items; // Artículos en nuestro
carrito de la compra
// Añadir $num artículos de tipo $artnr
al carro
function add_articulo ($artnr, $num) {
$this->items[$artnr] += $num;
}
DFSI Curso 2003-2004
PHP
// Sacar $num artículos del tipo $artnr
del carro
function remove_articulo ($artnr, $num)
{
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>
El ejemplo define una clase llamada Carrito que
consiste en un array asociativo de artículos de un
carrito de la compra y dos funciones para añadir y
sacar ítems del carro. Las clases son tipos, es decir,
son plantillas para variables. Con el operador new
crea una instancia de la clase Carrito.
$carro = new Carrito;
$carro->add_articulo("Plancha Filips 202",
1);
En el anterior ejemplo creamos un objeto carro
de la clase carrito a la que le añadimos 1 artículo.
Entre funciones de una clase, la variable $this
hace referencia al propio objeto. Tienes que usar
$this->loquesea para acceder a una variable o
función llamada loquesea del objeto actual.
PHP soporta herencia, las clases extendidas o
derivadas tienen todas las variables y funciones de la
clase base y lo que les añadas al extender la
definición. La herencia múltiple no está soportada.
La herencia en PHP se realiza con extends.
Los constructores de cada clase se llaman
automáticamente por el operador new . El
constructor de cada clase debe tomar el mismo
nombre de la clase y cuando se trata de una clase
derivada, hay que tener cuidado porque sólo se
29
DFSI Curso 2003-2004
PHP
llama automáticamente al constructor de dicha clase
pero no al constructor de la clase padre.
class Carrito_con_amo extends Carrito {
var $amo;
function fijar_amo ($nombre) {
$this->amo = $nombre;
}
}
El
ejemplo
anterior
define
una
clase
Carrito_con_amo que tiene todas las variables y
funciones de Carrito, y además añade la variable
$amo y una función adicional fijar_amo(). Un carro
con amo se crea de la forma habitual y, una vez
hecho, puedes acceder al propietario del carro. En
los carros con nombre también puedes acceder a las
funciones normales del carro:
$miCarro = new Carrito_con_amo;
//
Creamos un carro con dueño
$miCarro ->fijar_amo ("Richal");
//
Nombramos el carro
print $miCarro->amo;
//
Imprimimos el nombre del propietario
$miCarro->add_articulo ("Monitor Soni
GD450", 1); // Funcionalidad heredada de
Carrito
Los constructores también pueden recibir
parámetros y estos parámetros pueden ser
opcionales, lo que los hace más útiles.
class Otro_Carrito extends Carrito {
function Otro_carrito ($articulo =
"Boli Byc Azul", $cantidad = 1) {
$this->add_articulo ($articulo,
$cantidad);
}
}
// Compramos las mismas cosas aburridas de
siempre
$default_cart
= new Otro_Carrito;
30
DFSI Curso 2003-2004
PHP
31
// Compramos las cosas interesantes
$different_cart = new Otro_Carrito
("AzlonXP 3000+", 17);
2-. Manejo de Errores
En PHP hay cuatro tipos de errores y avisos:
•
•
•
•
1Error )
248-
Errores Normales de Funciones (Normal Function
Avisos Normales (Normal Warnings)
Errores del analicador de código (Parse Errors)
Avisos que se pueden ignorar( Notices )
Los 4 números de la izquierda son sumados para definir
un nivel de aviso de error. El nivel de error por defecto es 7
(1+2+4), pero esto puede ser modificado en tiempo de
ejecución usando la función error_reporting ().
Cualquier expresión en PHP se puede llamar con la "@" al
principio que invocará a la función de manejo de errores, y el
error podremos encontrarlo en la variable $php_errormsg.
Error en un documento PHP
<html>
<head> <title>Ejemplo error </title></head>
<body>
<h1> Ejemplo de error en PHP </h1>
<?php
error_reporting(0);
$a=5/0;
print "<p>La siguiente variable no existe:
$zx \n";
?>
</body>
</html>
DFSI Curso 2003-2004
PHP
32
3-. Creación de Imágenes
PHP tiene una funcionalidad muy potente: la creación de
imágenes al vuelo (aunque también puede generar, por
ejemplo, documentos PDF). Esto puede ser útil para crear
gráficas partir de datos y generar cualquier gráfico
dinámicamente.Para esto, PHP utiliza la librería GD de la
empresa Boutell.com, por lo que es necesario tenerla
instalada en el sistema (se puede ver si está instalada viendo
el resultado generado por phpinfo() ). A partir de la versión
1.6 no se puede trabajar con imágenes GIF (por problema de
patentes) y desde la 1.8 se puede trabajar con jpeg.
El ejemplo más sencillo es abrir una imagen que esté en
un fichero de disco y mostrarla tal cual.
<?php
#En la cabecera decimos no es HTML lo que
devolvemos, si no una imagen jpeg
Header("Content-type: image/jpeg");
#Creamos la imagen a partir de un fichero
$im=imagencreatefromjpeg("php.jpg");
#La mostramos
ImageJPEG($im);
#Liberamos la memoria ocupada
ImageDestroy($im);
?>
Si en el anterior ejemplo cambiamos jpeg por png nos
servirá para leer imágenes en formato png. Con la función
imagecreatefromjpeg creamos una imagen a partir de un
fichero jpeg.Con imagejpeg devolvemos al navegador una
imagen jpeg.
En el siguiente ejemplo será llamado desde una página
con una línea como esta:
<img src="boton.php?texto=hola"> El siguiente
script de arriba toma la cadena "text" la situa sobre la imagen
base, en este caso es "images/button1.jpg" y muestra la
DFSI Curso 2003-2004
PHP
33
imagen resultante. Esta es una forma muy conveniente para
evitar tener que dibujar un nuevo botón cada vez que quiera
cambiar el texto del mismo. Con este método los botones son
generados dinámicamente.
Un ejemplo de esta característica se muestra en el
siguiente ejemplo:
<?php
#Decimos que es una imagen
Header("Content-type: image/jpeg");
#Creamos la imagen a partir de un fichero
$im =
imagecreatefromjpeg("images/button1.jpg");
#Creamos un color blanco (se usan valores RGB)
$blanco = ImageColorAllocate($im, 255, 255,
255);
#Tomamos el sitio por donde vamos a empezar a
escribir el texto
$px = (imagesx($im)-7.5*strlen($texto))/2;
#Escribimos el texto
ImageString($im,10,$px,9,$texto,$blanco);
#Creamos la imagen
ImageJPEG($im);
#Liberamos la memoria ocupada
ImageDestroy($im);
?>
Con este método puedes generar la imagen adecuada
dinámicamente. El parámetro texto nos permitirá poner el
texto que deseemos en la imagen que vamos a generar.
4.- Autentificación de un Usuario con PHP
El protocolo HTTP proporciona un mecanismo de
autentificación de clientes. Lo más común es que se presente
una cajita con dos campos: uno para el login y el otro para la
clave. PHP tiene la función Header(). Esta función debe ser
llamada antes de que se haya producido ninguna salida del
DFSI Curso 2003-2004
PHP
34
fichero html que se está generando. Esta función envía una
línea a la cabecera de dicho HTML. Y con esta función es
posible enviar un mensaje de "Autentificación Requerida " que
forzará al usuario a completar los datos solicitados.
El funcionamiento es muy sencillo. Una vez que el
usuario ha completado los datos que se le piden, se fuerza
una
nueva
llamada
al
script
con
las
variables
$PHP_AUTH_USER, $PHP_AUTH_PW y $PHP_AUTH_TYPE que
contendrán el nombre del usuario, el pasword y el tipo de
autentificación.
Autentificación de usuarios
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header("WWW-Authenticate: Basic
realm=\"flanagan.ugr.es\"");
header("HTTP/1.0 401 Unauthorized");
}
?>
<html>
<head> <title>Ejemplo 20 </title></head>
<body>
<h1> Ejemplo de PHP </h1>
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
echo "Texto a enviar si pulsa el botón
Cancelar\n";
exit;
} else {
echo "<p>Hola
".$_SERVER['PHP_AUTH_USER'].".</p>";
echo "<p>Has introducido
<b>".$_SERVER['PHP_AUTH_PW']." </b>como tu
contraseña.
";
}
?>
</body>
</html>
DFSI Curso 2003-2004
PHP
35
Hay que tener mucho cuidado con el orden en el que se
envian los diferentes tipos de cabeceras. La cabecera de
WWW-authenticate, debe ir siempre delante de la del tipo
HTTP/1.0 401.
Es una especie de cookie que se mantiene mientras el
usuario no apague el navegador. Además el usuario debe ser
consciente de que, desde el momento que ha insertado su
login y su clave, ha sido identificado y que todo lo que haga
puede ser registrado.
5.- Cookies (Galletitas)
Una cookie no es más que una variable que se registras
dentro del navegador del internauta.Si el navegador tiene
configurado que se rechacen las cookies o que se pregunte si
se permite aceptarlas, pueden ser controladas. En cambio,
por defecto, los navegadores dejan que las cookies se creen
sin que el usuario sea consciente de ello.
Para PHP las cookies son fáciles de utilizar. Para esto se
utiliza la función setcookie() y al igual que la función anterior,
Header, tiene que ser invocada antes de producir ninguna
salida.
La función posee el siguiente formato:
int setcookie(string name, string value, int
expire, string path, string domain, int secure);
Esta función define la cookie que se va a enviar. Todos
los argumentos son opcionales a excepción del nombre, Si
sólo se especifica el parámetro name, la cookie con ese
nombre se borrará del cliente remoto. También puede
sustituir cualquier parámetro por una cadena de texto vacía
("") y saltar así ese parámetro. Los parámetros expire y
secure son números enteros y no se pueden saltar con una
cadena de texto vacía. En su lugar utilice un cero (0). El
parámetro expire es un entero de tiempo.El parámetro secure
indica que la cookie se debe transmitir única y
exclusivamente sobre una conexión segura HTTPS. Todos los
parámetros excepto name son opcionales. Si sólo se
especifica el parámetro name, la cookie con ese nombre se
DFSI Curso 2003-2004
PHP
36
borrarára del cliente remoto. Los parámetros path y domain
sirven para distinguir nuestras cookies de las de otros sitios
web.
setcookie("TestCookie","Test Value");
setcookie("TestCookie",$value,time()+3600);
expira en 1 hora */
/*
setcookie("TestCookie",$value,time()+3600,"/~rasmus/
",".utoronto.ca",1);
Para poder ver el contenido de un cookie, podemos
utilizar:
print $TestCookie;
print $HTTP_COOKIE_VARS["TestCookie"];
Se pueden utilizar vectores de cookies.
setcookie( "cookie[three]", "cookiethree" );
setcookie( "cookie[two]", "cookietwo" );
setcookie( "cookie[one]", "cookieone" );
if ( isset( $cookie ) ) {
while( list( $name, $value ) = each( $cookie ) )
{
echo "$name == $value
\n";
}
}
Fallos habituales: Las cookies no se hacen visibles hasta
la siguiente carga de una página para la que la cookie deba
estar visible. Las llamadas múltiples a setcookie() en el
mismo script se ejecutarán en orden inverso. Si estas
intentando borrar una cookie antes de insertar otra, se debe
situar la llamada de inserción antes de la de borrado.
6.- Utilización de ficheros locales y remotos
6.1.- Utilización de ficheros
La utilización de ficheros en PHP es muy similar a como
se hace en C. Tenemos fopen para abrir un fichero, donde se
indica el nombre del fichero y el modo de apertura y nos
devuelve el descriptor del fichero. Con feof miramos si
DFSI Curso 2003-2004
PHP
37
estamos al final de un fichero. Con fclose cerramos un
fichero. Y con fputs y fgets escribimos o leemos,
respectivamente, una línead de un fichero.
Ejemplo de escritura en un fichero
<?
//Abrimos el fichero en modo de escritura
$DescriptorFichero =
fopen("fichero_prueba.txt","w");
//Escribimos una línea
$string1 = "Esta es la primera línea de texto\r\n";
fputs($DescriptorFichero,$string1);
//Escribimos otra
$string2 = "Y esta es la segunda\r\n";
fputs($DescriptorFichero,$string2);
//Cerramos el fichero
fclose($DescriptorFichero);
?>
Ejemplo de lectura de un fichero
<?
//Abrimos el fichero en modo lectura
$DescriptorFichero =
fopen("fichero_prueba.txt","r");
//Repetimos hasta que no lleguemos al final del
fichero
while(!feof($DescriptorFichero)){
//Leemos una línea de como max 4096 caracteres
(4KB), que será menos si hay un retorno de carro
$buffer = fgets($DescriptorFichero,4096);
//Escribimos la línea
echo $buffer."<BR>";
}
?>
DFSI Curso 2003-2004
PHP
38
También disponemos de fwrite y fread para escribir o
leer, respectivamente, un buffer de un fichero.
6.2.- Utilización de ficheros remotos
PHP permite la utilización de ficheros remotos para
realizar algún tipo de lectura de ellos. En el caso de querer
realizar algún tipo de escritura, se debe hacer a través de un
servidor ftp. Un ejemplo de ambas cosas se muestra a
continuación.
Leyendo un fichero remoto
<?php
#Abrimos el fichero remoto
$archivo = fopen("http://www.php.net/", "r");
if (!$archivo) {
echo "<p>No se pudo abrir el archivo
remoto.\n";
exit;
}
#Mostramos el fichero línea a línea
$i=0;
while (!feof($archivo))
{
$linea = fgets($archivo, 1024);
print "LINEA $i: $linea <BR>";
$i++;
}
#Cerramos el fichero
fclose($archivo);
?>
También se puede escribir a archivos en un FTP siempre
que se conecte como un usuario con los correctos derechos
de acceso, y el archivo no exista ya.Para conectar como un
usuario distinto de 'anonymous', se necesita especificar el
nombre de usuario (y posiblemente contraseña) dentro de la
URL, tales como
'ftp://usuario:[email protected]/camino/a/archivo'.
DFSI Curso 2003-2004
PHP
39
Escribiendo en un fichero remoto usando ftp
<?php
$file =
fopen("ftp://ftp.php.net/incoming/outputfile", "w");
if (!$file) {
echo "<p>Unable to open remote file for
writing.\n";
exit;
}
/* Escribimos el fichero. */
fputs($file, "$HTTP_USER_AGENT\n");
/*Lo cerramos*/
fclose($file);
?>
7-. Subida de ficheros usando HTTP
La solución ideal para intercambios de ficheros es el
protocolo FTP, pero los internautas a lo que están
acostumbrados es a utilizar la web. Con HTTP Upload
podemos lograr que el cliente envie ficheros locales de su
computador pulsando un botón.
Lo primero que hay que hacer es crear una página HTML
con un formulario con el cual enviaremos el fichero:
Formulario HTML para enviar ficheros
<html>
<head> <title>Ejemplo 21</title></head>
<body>
<h1> Ejemplo de Formulario 3 </h1>
<p>
<form enctype="multipart/form-data"
action="ej22.php" method="post">
Fichero: <input type="file"
name="fichero_usuario">
<br>
<input type="submit" value="Enviar Fichero">
</form>
DFSI Curso 2003-2004
PHP
40
</body>
</html>
Debemos destacar de este formulario HTML la posibilidad
de restringir el tamaño del fichero que se va a enviar. Como
HTTP no está pensado para estos menesteres (al contrario de
FTP) no es aconsejable usarlo para ficheros grandes.
Dentro el PHP que va a procesar el anterior formulario, se
encarga de ir recibiendo el fichero y guardarlo en el disco
duro . Es importante tener en cuenta que el usuario que está
guardando el fichero es aquel con el que se ejecuta el
servidor web (normalmente nobody), por lo que deberá tener
permisos para escribir en el direcgtorio y ficheros que se
utilicen.
En el programa PHP que recibe este fichero se van a
definir una serie de variables:
•
•
•
•
$fichero_usuario nombre del fichero temporal en el
que se ha almacenado en el servidor el fichero enviado por el
usuario. El lugar donde se guardan estos ficheros es el
directorio temporal del servidor web.
$fichero_usuario_name nombre original del fichero
$fichero_usuario_size tamaño del fichero
$fichero_usuario_type el tipo MIME del fichero con el
que navegador lo ha enviado.
Script PHP para recibir ficheros
<html>
<head> <title>Ejemplo 22</title></head>
<body>
<h1> Ejemplo de Formulario 3 </h1>
<p>
<?php
#Mostramos información del fichero recibido
print "El fichero recibido está $fichero_usuario
<br>\n";
print "El nombre del fichero recibido es
$fichero_usuario_name <br>\n";
DFSI Curso 2003-2004
PHP
print "El tamaño del fichero recibido es
$fichero_usuario_size <br>\n";
print "El tipo MIME del fichero recibido es
$fichero_usuario_type <br>\n";
#mostramos el contenido
print "El contenido del fichero recibido es:
<br>\n";
#Abrimos el fichero remoto
$archivo = fopen("$fichero_usuario", "r");
if (!$archivo) {
echo "<p>No se pudo abrir el archivo
remoto.\n";
exit;
}
#Mostramos el fichero línea a línea
$i=0;
while (!feof($archivo))
{
$linea = fgets($archivo, 1024);
print "LINEA $i: $linea <BR>";
$i++;
}
#Cerramos el fichero
fclose($archivo);
?>
</body>
</html>
8-. Manejo de conexiones
En PHP las conexiones que se mantinen pueden tener
tres estados, Normal (0), Aborted (1) y Timeout (2).
En un script normal, el estado es NORMAL, cuando el
cliente desconecta, el estado pasa a ser ABORTED y si el
límite impuesto por PHP-imposed ha transcurrido,
(set_time_limit(), el tiempo por defecto es 30 segundos) el
estado es TIMEOUT.
41
DFSI Curso 2003-2004
PHP
42
Una función muy util para estos casos, es
connection_status() que devuelve el estado de la conexión.
8.1.- Conexiones a bases de datos
Las conexiones persistentes son enlaces SQL que no se
cierran cuando la ejecución del script termina. El
comportamiento de estas conexiones es el siguiente.
Cuando se invoca una conexión de este tipo, PHP
comprueba si existe una conexión de este mismo tipo o por el
contrario, se trata de una nueva conexión. En el caso de que
exista, se procede a su uso, y en el caso de que no exista, la
conexión se crea. Dos conexiones se consideran iguales
cuando están realizadas sobre el mismo servidor, con el
mismo usuario y la misma contraseña.
Pero en realidad, estas conexiones permanentes, no
proporcionan ningún tipo de funcionabilidad adicional frente a
conexiones temporales, debido a la forma en que los
servidores Web funcionan.
Aún así se utilizan debido a la eficiencia, debido al tiempo
de establecimiento de la conexión, y debido a que si tienes
una sóla conexión sobre el servidor, irá mucho más rápido
que si tienes 10 conexiones temporales, puesto que la carga
que soporta es diferente.
9.- Funciones de PHP para MySQL
La lista de funciones disponibles es la siguiente:
•
mysql_affected_rows: Otiene el número de
tuplas modificadas en la última operacion MySql.
int mysql_affected_rows(int [identificador de link])
Devuelve el número de líneas afectadas por la última
operación, INSERT, UPDATE o DELETE, asociadas con el
identificador que se especifica.
Si no se especifica el link, se asume que se refiere al
último.
DFSI Curso 2003-2004
PHP
43
Excepción: Si la última operación ha borrado todos los
registros de una tabla, esta función devuelve 0.
Esta función no tiene efecto con ninguna operación
SELECT, puesto que no modifican ninguna línea.
•
mysql_change_user: Modifica el usuario
responsable de las operaciones.
int mysql_change_user(string user, string password,
string[database], int [identificador de link]
Los parámetros database y link son opcionales.
Si la nueva combinación de usuario y password no es
correcta, seguirá activa la actual.
•
mysql_close : Cierra la conexión MySql.
int mysql_close(int [identificador de link]
Esta función cierra la conexión permanente que mantiene
el link. El parámetro es opcional. Si no se especifica, se
cerrará la última conexión abierta.
Si una conexión no se cierra, el script la cierra
automáticamente al terminar su ejecución.
Esta función no opera correctamente con las conexiones
abiertas con la función mysql_pconnect().
•
mysql_connect: Open a connection to a MySQL
Server.
int mysql_connect(string[hostname
[:port][:/path/to/socket]], string[username],string
[password])
Esta función establece una conexión a un servidor mysql.
Todos los argumentos son opcionales y los valores por
defecto son localhost, el usuario dueño del proceso, sin
password.
DFSI Curso 2003-2004
PHP
44
Si realizas dos veces una llamada a esta función con los
mismos parámetros, devuelve el mismo identificador que para
la llamada anterior.
Todas las conexiones terminan al terminar la ejecución
del script, a no ser que se elimine la conexión llamando a la
función mysql_close().
•
mysql_create_db: Crea una base de datos en el
gestor de Bases de Datos.
int mysql_create_db(string databaseName, int
[identificador del link])
Esta función crea una nueva base de datos asociada al
link especificado.
Para mantener la coherencia con otras versiones, se
utiliza mysql_createdb()
•
mysql_data_seek: Realiza un movimiento en el
puntero de los datos resultado.
int mysql_data_seek(int result_identifier, int
row_number)
Esta función permite que el puntero a los resultados
apunte a la línea especificada.
El número de líneas comienza en 0.
•
mysql_db_query: Realiza una consulta a una
base de datos.
int mysql_db_query(string database, string query, int
[identificador del link]
Selecciona la base de datos database y ejecuta una
consulta. Si no se especifica el link, utiliza el último abierto, si
no existe, intenta optener uno llamando internamente a la
función mysql_connect() sin argumentos.
DFSI Curso 2003-2004
•
PHP
45
mysql_drop_db: Realiza una operación Drop
sobre una base de datos.
int mysql_drop_db(string database_name, int
[identificador del link])
Devuelve True o False según haya o no tenido éxito.
Nota: Cuidado, según la versión de MySql, borra toda la
base de datos aún conteniendo tablas con datos.
•
mysql_errno: Devuelve un código de error
relacionado con la última operación MySql realizada.
int mysql_errno(int [identificador del link]
Esta función devuelve el número del código de error que
devuelve el servidor MySql.
•
mysql_error : Devuelve el mensaje de error
asociado a un código concreto relacionado con la última
operación MySql realizada.
string mysql_error(int [identificador del link]
Devuelve la cadena asociada a un error que posee el
identificador de conexión que se especifica.
•
mysql_fetch_array: Introduce el resultado en
un array asociativo.
array mysql_fetch_array(int result, int [result type])
Esta función es una versión extendida de
mysql_fetch_row(). Lo que hace es almacenar el resultado
en un array indexado, almacenando así los datos en un índice
asociativo utilizando los nombres de los campos como claves.
Si existen más de una columna con el mismo nombre,
tendrá precedencia la última columna. Para acceder a lal otras
columnas con el mismo nombre, se debe indexar la columna
o hacerun alias para ella.
DFSI Curso 2003-2004
PHP
46
Ejemplo:
select tabla1.precio as precio 1, tabla2.precio as
precio2 from tabla1, tabla2
El segundo argumento, es una constante que puede
tomar los siguientes valores.
MYSQL_ASSOC
MYSQL_NUM
MYSQL_BOTH
o
o
o
•
mysql_fetch_field: Devuelve un objeto con la
información de un resultado.
object mysql_fetch_field(int result, int [field_offset])
Devuelve un objeto con la información que contiene
result Puede utilizarse par obtener información de los campos
de ciertas consultas. Si el campo del desplazamiento no está
especificado, se selecciona el siguiente dato que no haya sido
ya asignado mediante esta función.
Las propiedades del objeto son:
name: Nombre del campo
table: Nombre de la tabla a la que pertenece el
o
o
campo.
o
o
o
o
o
o
o
o
o
o
max_length: Longitud máxima.
not_null: Será verdadero si el campo poosee esta
propiedad.
primary_key: Verdadero si el campo es la clave
principal.
unique_key: Verdadero si el campo es clave única.
multiple_key: Verdadero si el campo no es clave
única.
numeric: Verdadero si se trata de un campo
numérico.
blob: Verdadero si la columna es a BLOB.
type: Tipo de la columna.
unsigned: Verdadero si se trata de un dato sin
signo.
zerofill: Verdadero si la columna tiene la propiedad
zerofill.
DFSI Curso 2003-2004
•
PHP
47
mysql_fetch_lengths: Obtener la longitud de
los resultados.
array mysql_fetch_lengths(int result)
Devuelve un array que contiene las longitudes de todos
los campos que forman el último registro asignado con la
función mysql_fetch_row(), mysql_fetch_array() o
mysql_fetch_object().
•
mysql_fetch_object: Devuelve el resultado
como un objeto.
object mysql_fetch_object(int result, int [result_type])
Devuelve un objeto con las propiedades del último
registro extraido de un resultado.
Esta función es igual que mysql_fetch_array() con la
diferencia de que se obtiene un objeto en vez de un array.
El segundo argumento, es una constante que puede
tomar los siguientes valores.
MYSQL_ASSOC
MYSQL_NUM
MYSQL_BOTH
o
o
o
•
mysql_fetch_row : Devuelve el resultado como
un array.
array mysql_fetch_row(int result)
Devuelve un array con un registro del resultado o false
en el caso de que no existan registros.
Si se llama dos veces a esta función, él asignará el
primer registro del resultado la primera vez y el segundo
registro del resultado la segunda vez.
•
mysql_field_name: Devuelve el nombre de un
campo especificado en un resultado.
string mysql_field_name(int result, int field_index)
DFSI Curso 2003-2004
PHP
48
Devuelve el nombre del campo que se especifica,
mediante el orden que ocupe dentro del resultado.
•
mysql_field_seek: Asigna el puntero de los
resultados a una posición determinada.
int mysql_field_seek(int result, int field_offset)
Busca el desplazamiento que se especifica en el segundo
argumento, dentro del resultado.
•
mysql_field_table: Obtiene el nombre de la
tabla de un campo especificado.
string mysql_field_table(int result, int field_offset)
•
mysql_field_type: Obtiene el tipo de un campo
especificado.
Obtiene el nombre de la tabla para el campo que se
indica en el desplazamiento.
string mysql_field_type(int result, int field_offset)
Se devuelve el tipo del campo que se indica mediante el
desplazamiento.
Las cadenas que devuelve pueden ser:
int
real
string
blob
Otros tipos detallados en la documentación de
o
o
o
o
o
MySql.
•
mysql_field_flags: Obtiene los "Flags"
asociados del campo especificado.
string mysql_field_flags(int result, int field_offset)
Devuelve una cadena con las propiedades del campo
separadas por un espacio. Para partir esa cadena se puede
utilizar la función explode()
DFSI Curso 2003-2004
PHP
49
Las palabras que puede devolver son:
o
o
o
o
o
o
o
o
o
o
o
•
not_null
primary_key
unique_key
multiple_key
blob
unsigned
zerofill
binary
enum
auto_increment
timestamp
mysql_field_len: Obtiene las longitud de un
campo especificado.
int mysql_field_len(int result, int field_offset)
Devuelve la longitud del campo especificado.
•
mysql_free_result: Libera la memoria de los
resultados.
int mysql_free_result(int result)
Libera la memoria que utiliza el parámetro.
•
mysql_insert_id: Obtiene el identificador de la
última operación INSERT.
int mysql_insert_id(int [link_identifier] )
Devuelve el ID generado para un campo
AUTO_INCREMENTED. Devolverá el id autogenerado devuelto
por la última operación INSERT del enlace que se especifica
como argumento.
Si el identificador no se especifica, se utiliza la última
conexión abierta.
•
mysql_list_fields: Lista los campos resultado.
DFSI Curso 2003-2004
PHP
50
int mysql_list_fields(string database_name, string
table_name, int [link_identifier]
Devuelve información del nombre de la tabla que se
proporciona. El puntero que devuelve, puede ser utilizado con
las funciones mysql_field_flags(), mysql_field_len(),
mysql_field_name() y mysql_field_type().
El resultado es un entero positivo, sólo devuelve -1 en
caso de que exista algún error.
•
mysql_list_dbs: Lista las bases de datos
disponibles en el servidor MySQL.
int mysql_list_dbs(int [link_identifier] )
Devuelve un puntero que contiene la lista de bases de
datos disponibles en ese servidor MySql.
Con la información que devuelve, puede llamarse a la
función mysql_tablaname().
•
mysql_list_tables: Lista las tablas de una base
de datos MySql.
int mysql_list_tables(string database, int
[link_identifier] )
Extrae un putero a la lista de tablas que están en una
base de datos.
Para extraer el nombre de las tablas se puede
posteriormente utilizar mysql_db_query() o
mysql_tablename().
•
mysql_num_fields: Otiene el número de
campos del resultado.
int mysql_num_fields(int result);
Devuelve el número de campos que contiene el
parámetro resultado.
DFSI Curso 2003-2004
•
PHP
51
mysql_num_rows: Obtiene el número de líneas
del resultado.
int mysql_num_rows(int result)
Devuelve el número de líneas que contiene el parámetro
resultado.
•
mysql_pconnect: Abre una conexión permanente
con una base de datos.
int mysql_pconnect(string [hostname [:port]
[:/path/to/socket] ] , string [username] , string
[password] )
Devuelve una conexión persistente a un servidor MySql.
Todos los argumentos son opcionales y sus valores son
los mismos que para la función mysql_connect().
Esta función primero, intenta encontrar una conexión ya
existente, si la encuentra, devuelve un identificador para ella,
y en el caso de que no la encuentre, abre una nueva conexión
permanente.
Despues de esto, mantiene la conexión hasta que finaliza
la ejecución del script.
Hay que tener cuidado, porque mysql_close() no cierra
conexiones abiertas con esta función.
•
mysql_query: Envia una consulta SQL a MySQL.
int mysql_query(string query, int [identificador del
link] )
Envía una consulta a una base de datos activa en el
servidor asociado al link que se especifica. En el caso de que
no se especifique ninguna conexión abierta, la función intenta
reestablecer una conexión con la función mysql_connect().
La cadena de la consulta, debe terminar con ;.
DFSI Curso 2003-2004
PHP
52
La función devuelve TRUE o FALSE si la consulta tiene
éxito. Si el valor devuelto es TRUE, significa que la consulta
puede ser realizada, no que existan datos que respondan a
esa consulta.
Para consultar cuantas líneas responden a esa consulta,
se puede utilizar la función mysql_affecter_rows() y nos dirá
cuantas líneas se han visto afectadas por la última operación
INSERT, DELETE, REPLACE o UPDATE. En el caso de tratarse
de una operación SELECT la función mysql_query() devuelve
un identificador de resultado que se puede utilizar con la
función mysql_result().
•
mysql_result: Obtiene los datos resultados.
int mysql_result(int result, int row, mixed [field] )
Devuelve el contenido de una celda de la tabla dinámica
que devuelve MySql como resultado de una operación previa.
El último argumento es opcional y puede contener el
desplazamiento del campo que se desea obtener, el nombre
del campo o algo como tabla.campo o el alias del campo que
se desee consultar si se establecio previamente.
Cuando se trabaja con amplios conjuntos de resultados,
es mejor utilizar alguna de las funciones que extraen un
registro de esa consulta.
Hay que tener cuidado de no hacer llamadas a funciones
que obtienen resultados de result junto con esta función,
puesto que el puntero que va leyendo de los resultados,
puede perderse.
•
mysql_select_db: Selecciona una base de datos
MySql.
int mysql_select_db(string database_name, int
[identificador del link] )
Esta función asigna la base de datos activa en el servidor
asociado al identificador del link.
DFSI Curso 2003-2004
•
PHP
53
mysql_tablename: Obtiene el nombre de la
tabla de un campo.
string mysql_tablename(int result, int i)
Esta función devuelve el nombre de una tabla de un
puntero de resultados que ha devuelto previamente la función
mysql_num_rows.
9.1.- Ejemplos de utilización de MySQL desde PHP
Ejemplo de creación de una base de datos
<html>
<head><title>Ejemplo de creación de una BD con PHP y
MySQL</title>
</head>
<body>
<h2>Creación de una base de datos</h2>
<?php
$host="flanagan.ugr.es";
$user="serweb";
$password="serweb";
#Conectamos a MySQL
$bd=@mysql_connect($host,$user,$password)
or die ("No se puede conectar a MySQL:
".mysql_error());
#Creamos una base de datos
if (@mysql_create_db ("mi_bd")) {
print ("<p>Base de Datos creada con éxito
\n");
} else {
printf ("<p>ERROR al crear la base de
datos: %s\n", mysql_error ());
}
?>
</body>
</html>
DFSI Curso 2003-2004
PHP
54
Ejemplo de creación de una tabla
<html>
<head><title>Ejemplo de creación de una tabla con
PHP y MySQL</title>
</head>
<body>
<h2>Creación de una tabla</h2>
<?php
$host="flanagan.ugr.es";
$user="serweb";
$password="serweb";
#Conectamos a MySQL
$bd=@mysql_connect($host,$user,$password)
or die ("No se puede conectar a MySQL:
".mysql_error());
#Creamos una tabla de articulos
$campos_tabla_articulos=" id INT PRIMARY KEY,
nombre VARCHAR(200) NOT NULL, precio FLOAT";
#Creamos 1 variable con la sentencia SQL que crea
la tabla
$SQL_crea_tabla_articulos="create table
tabla_articulos ($campos_tabla_articulos);";
#Ejecutamos la sentencia
$result =@
mysql_db_query("mi_bd",$SQL_crea_tabla_articulos)
or die ("<p>ERROR, No puedo crear la
tabla". mysql_error());
print "<p>Tabla creada</p>";
?>
</body>
</html>
Ejemplo de inserción en una tabla
<html>
<head><title>Ejemplo de inserción en una tabla con
PHP y MySQL</title>
DFSI Curso 2003-2004
PHP
55
</head>
<body>
<h2>Inserción en una tabla</h2>
<?php
$host="flanagan.ugr.es";
$user="serweb";
$password="serweb";
#Conectamos a MySQL
$bd=@mysql_connect($host,$user,$password)
or die ("No se puede conectar a MySQL:
".mysql_error());
#Insertamos 2 artículos
$SQL_inserta1="insert into tabla_articulos values
(10,'patatas',1.4);";
$SQL_inserta2="insert into tabla_articulos values
(5,'manzanas',2.2);";
$result = @mysql_db_query("mi_bd",$SQL_inserta1)
or print ("\n No puedo insertar");
$result = @mysql_db_query("mi_bd",$SQL_inserta2)
or print ("\n No puedo insertar");
?>
</body>
</html>
Ejemplo de consulta en una tabla con arrays numéricos
<html>
<head><title>Ejemplo de consulta en una tabla con
PHP y MySQL</title>
</head>
<body>
<h2>Consulta en una tabla</h2>
<?php
$host="flanagan.ugr.es";
$user="serweb";
$password="serweb";
DFSI Curso 2003-2004
PHP
56
#Mostramos el contenido de la tabla
$result = @mysql_db_query("mi_bd","select * from
tabla_articulos;");
while($fila = mysql_fetch_array($result,
MYSQL_NUM)) {
echo "<p>".$fila[0]." ";
echo $fila[1]." ";
echo $fila[2]." ";
}
#Liberamos la memoria usada por la consulta
mysql_free_result($result);
?>
</body>
</html>
Otro ejemplo de consulta en una tabla con arrays asociativos
<html>
<head><title>Ejemplo de consulta en una tabla con
PHP y MySQL</title>
</head>
<body>
<h2>Consulta en una tabla</h2>
<?php
$host="flanagan.ugr.es";
$user="serweb";
$password="serweb";
#Mostramos el contenido de la tabla
$result = mysql_db_query("mi_bd","select * from
tabla_articulos;");
$result = @mysql_db_query("mi_bd","select * from
tabla_articulos;");
while($fila = mysql_fetch_array($result,
MYSQL_ASSOC)) {
echo "<p>".$fila["id"]." ";
echo $fila["nombre"]." ";
echo $fila["precio"]." ";
}
#Liberamos la memoria usada por la consulta
mysql_free_result($result);
?>
DFSI Curso 2003-2004
PHP
</body>
</html>
Otro ejemplo de consulta en una tabla con objetos
<html>
<head><title>Ejemplo de consulta en una tabla con
PHP y MySQL</title>
</head>
<body>
<h2>Consulta en una tabla</h2>
<?php
$host="flanagan.ugr.es";
$user="serweb";
$password="serweb";
#Mostramos el contenido de la tabla
$result = mysql_db_query("mi_bd","select * from
tabla_articulos;");
while($fila = mysql_fetch_object($result)) {
echo "<p>".$fila->id." ";
echo $fila->nombre." ";
echo $fila->precio." ";
}
#Liberamos la memoria usada por la consulta
mysql_free_result($result);
?>
</body>
</html>
57
Descargar