You are on page 1of 38

Una vez que ya tenemos instalados PHP y MySQL, y el servidor Apache configurado para usarlos, podemos

comenzar a escribir nuestro primer script en PHP.


Ejemplo script php
<html>
<body>
<?php
myvar ! "Hola. #ste es mi primer script en PHP $n"%
&&#sto es un comentario
es mi primer script en PHP $n"%
&&#sto es un comentario
echo myvar%
?>
<&body>
<&html>
Una vez escrito esto lo salvamos en un fichero con la e'tensi(n php3 )la nueva versi(n de PHP, la *, utiliza la
e'tensi(n php+, y lo colocamos en nuestro servidor, http://mi_servidor/php/test.php3. ,hora si
ponemos esta U-. en nuestro navegador veremos una l/nea con el te'to "Hola. Este es mi primer script en
PHP".
.o primero que apreciamos en el script son sus delimitadores. #n la primera l/nea del script vemos <?php que nos
indica que comienza un script en PHP, y en la 0ltima colocamos ?> para indicar el final del script. Hay que
destacar que todas las l/neas que se encuentre entre estos delimitadores deben acabar en punto y coma, e'cepto las
sentencias de control )if, s1icht, 1hile, etc.+.
2omo en toda programaci(n, es importante poner muchos comentarios, para lo cual si queremos comentar una sola
l/nea tenemos que poner al principio de la l/nea //, si lo que queremos es comentar varias utilizaremos los
delimitadores /* - */.
Para que el servidor envi3 te'to utilizaremos la instrucci(n echo, aunque tambi3n podemos utilizar printf de
uso similar al del C o Perl.
4inalmente, vemos que la palabra myvar comienza con el signo d(lar )$+ . #ste s/mbolo le indica a PHP que es
una variable. 5osotros le hemos asignado un te'to a esta variable, pero tambi3n pueden contener n0meros o tablas
)arrays+. #s importante recordar que todas las variables comienza con el signo dlar. 6ambi3n habr3is observado
que el te'to que le asignamos a la variable termina con \n, esto no se imprime sirve para indicarle al navegador
una nueva l/nea.
aria!les y operadores
la sinta"is en PHP.
aria!les#
2omo vimos antes todas la variables deben precedidas por signo dlar )$+, y le asignamos contenido con el signo
igual )=+. 2on las variables, PHP distingue entre may0sculas y min0sculas, por lo que bles, PHP distingue entre
may0sculas y min0sculas, por lo que no es lo mismo $myvar que $Myvar, 3stas son dos variables totalmente
distintas.
<html>
<body>
<?php
myvar ! "7#89.., $n"%
:yvar ! ":,;-9; $n"%
&&#sto imprimir< 7#89..,
echo myvar%
&&#sto imprimir< :,;-9;
#2H= :yvar%
1
?>
<&body>
<&html>
2omo veis he utilizado dos formas de escribir echo, en may0sculas y en min0sculas, para indicaros que PHP no
las distingue a la hora de usar funciones o sentencias del lengua>e.
#l uso de la barra invertida, como en \n, no es obligatorio, pero ayuda a la depuraci(n del c(digo que enviamos al
navegador, adem<s del \n e'isten otros usos?
\ 2ar<cter dobles comillas
\\ 2ar<cter barra invertida
\n 5ueva l/nea
\r -etorno de carro
\t $a!ulador hori%ontal
Constantes#
Las constantes son similares a las &aria!les' con la sal&edad de (ue no lle&an el signo dlar delante' y slo la
podemos asignar una &e%. Para de)inir una constantes usaremos la )uncin define como sigue#
*html+
*!ody+
*,php
de)ine -"C./S$A/$E"' "Hola Mundo"01
print) -C./S$A/$E01
,+
*2!ody+
*2html+
PHP crea di&ersas constantes al arrancar' como PHP3E4S5./ (ue contiene la &ersin de PHP' $46E
(ue le asigna 7 o 8ALSE (ue le asigna 9.
.peradores Aritm:ticos#
$a ! $" Suma
$a - $" 4esta
$a * $" Multiplicacin
$a / $" ;ss<codigoenlinea+=a 2 =! >i&isin
$a # $" 4esto de la di&isin de =a por =!
$a!! 5ncrementa en 7 a =a
$a-- 4esta 7 a =a
.peradores de Cadenas#
El ?nico operador de cadenas (ue e"isten es el de concatenacin' el punto. Pero no os asust:is' PHP dispone
de toda una !ater@a de )unciones (ue os permitirAn tra!ajar cmodamente con las cadenas.
$a = $o%a&
$" = $a . M'ndo& 22 Ahora =! contiene "Hola Mundo"
En este punto hay (ue hacer una distincin' la interpretacin (ue hace PHP de las simples y do!les comillas.
En el segundo caso PHP interpretarA el contenido de la cadena.
$a = M'ndo&
echo = ($o%a $a(& 22Esto escri!irA "Hola =a"
echo = $o%a $a& 22Esto escri!irA "Hola Mundo;(1 &&#sto escribir< "Hola :undo"
.peradores de Comparacin#
$a < $" a menor (ue b
$a > $" a mayor (ue b
$a <= $" a menor o igual (ue b
$a >= $" a mayor o igual (ue b
2
$a == $" a igual (ue b
$a )= $" a distinto (ue b
.peradores Lgicos#
$a *+, $" 8erdadero si ambos son verdadero
$a -- $" 8erdadero si ambos son verdadero
$a ./ $" 8erdadero si alguno de los dos es verdadero
$a )) $" 8erdadero si alguno de los dos es verdadero
$a 0./ $" 8erdadero si s(lo uno de los dos es verdadero
)$a 8erdadero si a es falso, y rec/procamente
.peradores de Asignacin#
$a = $" Asigna a a el contenido de b
$a != $" .e suma a b a a
$a -= $" .e resta a b a a
$a *= $" Multiplica a por b y lo asigna a a
$a /= $" >i&ide a por b y lo asigna a a
$a .= $" ABade la cadena b a la cadena a
7entencias de control
.as sentencias de control permiten e>ecutar bloque de c(digos dependiendo de unas condiciones. Para PHP el @ es
equivalente a 4also y cualquier otro n0mero es 8erdadero.
58...ELSE
.a sentencia 58...ELSE permite e>ecutar un bloque de instrucciones si la condici(n es erdadera y otro bloque de
instrucciones si 3sta es 8alsa. #s importante tener en cuenta q instrucciones si 3sta es 8alsa. #s importante tener en
cuenta que la condici(n que evaluemos ha de estar encerrada entre par:ntesis )esto es aplicable a todas la
sentencias de control+.
if )condici(n+ A
#ste bloque se e>ecuta si la condici(n es 8#-;,;#-,
B else A
#ste boque se e>ecuta si la condici(n es 4,.7,
B
#'iste una forma sencilla de usar la sentencia 94 cuando no tenemos que usar el #.7# y solo tenenemos que
e>ecutar una l/nea de c(digo.
if )a > *+ echo "a es mayor que *"%

58...ELSE58...ELSE
.a sentencia 94...#.7#94...#.7# permite e>ecuta varias condiciones en cascada. Para este caso veremos un
e>emplo, en el que utilizaremos los operadores l(gicos.
<?php
if )nombre !! ""+A
echo "60 no tienes nombre"%
B elseif ))nombre!!"eva"+ =- )nombre!!"#va"++ A
echo "
echo "6u nombre es #8,"%<
B else A
echo "6u nombre es " . nombre%
B

SC5$CH...CASE...>E8A6L$
Una alternativa a 94...#.7#94...#.7#, es la sentencia 7C962H, la cu<l eval0a y compara cada e'presi(n de la
sentencia 2,7# con la e'presi(n que evaluamos, si llegamos al final de la lista de 2,7# y encuentra una
condici(n 8erdadera , e>ecuta el c(digo de bloque que haya en ;#4,U.6. 7i encontramos una condici(n
3
verdadera debemos e>ecutar un D-#,E para que la sentencia 7C962H no siga buscando en la lista de 2,7#.
8eamos un e>emplo.
<?php
s1itch )dia+ A
case ".unes"?
echo "Hoy es .unes"%
breaF%
c
case ":artes"?
echo "Hoy es :artes"%
breaF%
case ":iercoles"?
echo "Hoy es :iercoles"%
breaF%
case "Gueves"?
echo "Hoy es Gueves"%
breaF%
case "8iernes"?
echo "Hoy es 8iernes"%
breaF%
case "7<bado"?
echo "Hoy es 7<bado"%
breaF%
case ";omingo"?
echo "Hoy es ;omingo"%
breaF%
default?
default?
echo "#sa cadena no corresponde a ning0n d/a de la semana"%
B
?>

CH5LE
.a sentencia CH9.# e>ecuta un bloque de c(digo mientras se cumpla una determinada condici(n.
<?php
num ! H%
1hile )num < I+ A
echo num%
numJJ
B
?>
Podemos romper un bucle CH9.# utilizando la sentencia D4EAE.
<?php
num ! H%
1hile )num < I+ A
echo num%
if )num !! K+A
echo ",qu/ nos salimos $n"%
breaF
B
numJJ
4
B
?>

>....CH5LE
#sta sentencia es similar a CH9.#, salvo que con esta sentencia primero e>ecutamos el bloque de c(digo y despu3s
se eval0a la condici(n, por lo que el bloque de c(digo se e>ecuta siempre al menos una vez.
<?php
num ! H%
do A
echo num%
if )num !! K+A
echo ",qu/ nos salimos $n"%
breaF
B
numJJ
B 1hile )num < I+%
?>

8.4
#l bucle 4=- no es estrictamente necesario, cualquier bucle 4=- puede ser sustituido f<cilmente por otro CH9.#.
7in embargo, el bucle 4=- resulta muy 0til cuando debemos e>ecutar un bloque de c(digo a condici(n de que una
variable se encuentre entre un valor m/nimo y otro m<'imo. #l bucle 4=- tambi3n se puede romper mediante la
sentencia D4EAE.
<?php
for )num ! H% 7num <!I% numJJ+A
echo num%
if )num !! K+A
echo ",qu/ nos salimos $n"%
breaF
B
B
?>
.as tablas
.as tablas )o array en ingl3s+, son muy importantes en PHP, ya que generalmente, las funciones que devuelven
varios valores, como las funciones ligadas a las bases de datos, lo hacen en forma de tabla.
#n PHP disponemos de dos tipos de tablas. #l primero ser/a el cl<sico, utilizando /ndices?
<?php
ciudadLM ! "Par/s"%
ciudadLM ! "Par/s"%
ciudadLM ! "-oma"%
ciudadLM ! "7evilla"%
ciudadLM ! ".ondres"%
print )"yo vivo en " . ciudadLNM . "<D->$n"+%
?>
#sta es una forma de asignar elementos a una tabla, pero una forma m<s formal es utilizando la funci(n array
<?php
ciudad ! array)"Par/s", "-oma", "7evilla", ".ondres"+%
&&contamos el n0mero de elementos de la tabla
numelentos ! count)ciudad+%
&&imprimimos todos los elementos de la tabla
5
for )i!@% i < numelentos% iJJ+
A
print )".a ciudad i es ciudadLiM <D->$n"+%
B
?>
7ino
?>
7ino se especifica, el primer /ndice es el cero, pero podemos utilizar el operador => para especificar el indice
inicial.
ciudad ! array)H!>"Par/s", "-oma", "7evilla", ".ondres"+%
Un segundo tipo, son las ta!las asociati&as, en las cu<les a cada elemento se le asigna un valor )Fey+ para acceder
a 3l.
Para entenderlo, que me>or que un e>emplo, supongamos que tenemos una tabla en al que cada elemento almacena
el n0mero de visitas a nuestra 1eb por cada d/a de la semana.
Utilizando el m3todo cl<sico de /ndices, cada d/a de la semana se representar/a por un entero, @ para lunes, H para
martes, etc.
visitasL@M ! N@@%
visitasLHM ! HOP%
si usamos las tablas asociativas ser/a
visitasL"lunes"M ! N@@%
visitasL"martes"M ! HOP%
o bien,
visitas ! array)"luodigo">visitas ! array)"lunes"!>N@@% "martes"!>HOP+%
,hora bien, recorrer una tabla y mostrar su contenido es sencillo utilizando los /ndices, pero Qc(mo hacerlo en las
tablas asociativas?. .a manipulaci(n de las tabas asociativas se a hace trav3s de funciones que act0an sobre un
puntero interno que indica la posici(n. Por defecto, el puntero se situa en el primer elemento aRadido en la tabla,
hasta que es movido por una funci(n?
c'rrent S devuelve el valor del elemento que indica el puntero
pos S realiza la misma funci(n que current
reset S mueve el puntero al primer elemento de la tabla
end S mueve el puntero al ?ltimo elemento de la tabla
ne1t S mueve el puntero al elemento si(uiente
prev S mueve el puntero al elemento anterior
co'ntTn co'nt S devuelve el n0mero de elementos de una tabla.

8eamos un e>emplo de las funciones anteriores?
<?php
semana ! array)"lunes", "martes", "mi3rcoles", ">ueves", "viernes", "s<bado", "domindo"+%
echo count)semana+% &&U
&&situamos el puntero en el primer elemento
reset)semana+%
echo current)semana+% &&lunes
ne't)semana+%
echo pos)semana+% &&martes
end)semana+
echo pos)semana+% &&domingo
prev)semana+%
echo current)semana+% &&s<bado
?>
-ecorrer una tabla con las funciones anteriores se hace un poco lioso, para ello se recomienda utilizar la funci(n
each23.
6
<?.
<?php
visitas ! array)"lunes"!>N@@, "martes"!>HOP, "mi3rcoles"!>HV@, ">ueves"!>HUI+%
reset)visitas+%
1hile )list)clave, valor+ ! each)visitas++
A
echo "el d/a clave ha tenido valor visitas<D->"%
B
?>
.a funci(n each23devuelve el valor del elemento actual, en este caso, el valor del elemento actual y su clave, y
desplaza el puntero al siguiente, cuando llega al final devuelve 8ALS., y termina el bucle 4hi%e23.
$a!las multidimensionales
.as tablas multidimensionales son simplemente tablas en las cuales cada elemento es a su vez otra tabla.
<?php
calendarioLM ! array )H, "enero", KH+%
calendarioLM ! array )N, "febrero", NO+%
calendarioLM ! arra
calendarioLM ! array )K, "marzo", KH+%
calendarioLM ! array )*, "abril", K@+%
calendarioLM ! array )I, "mayo", KH+%

1hile )list)clave, valor + ! each)calendario++A
A
cadena ! varlorLHM%
cadena .! " es el mes n0mero " . valorL@M%
cadena .! "y tiene " . varlorLNM . " d/as<D->"%
echo cadena%
B
?>
.a funci(n %ist23 es m<s bien un operador de asignaci(n, lo que hace es asignar valores a unas lista de
variables. #n este caso los valores son e'traidos de una tabla por la funci(n each23.
.as funciones
:uchas veces, cuando traba>amos en el desarrolo de una aplicaci(n, nos surge la necesidad de e>ectar un mismo
bloque de c(digo en diferentes partes de nuestra aplicaci(n. Una 8uncin no es m<s que un bloque de c(digo al
que le pasamos una serie de par<metros y nos devuelve un valor. 2omo todos los lengua>e de programaci(n, PHP
trae una gran cantidad de funciones para nuestro uso, pero las funciones m<s gran cantidad de funciones para
nuestro uso, pero las funciones m<s importantes son las que nosotros creamos.
Para declara una funcion debemos utilizar la instrucci(n f'nction seguido del nombre que le vamos a dar, y
despu3s entre parentesis la lista de argumentos separados por comas, aunque tambi3n habr< funciones que no
recogan ning0n argumento.
function nombreWdeWfuncion )argWH, argWN, ..., argWn+
A
bloque de c(digo
B
2ualquier instrucci(n v<lida de PHP puede aparecer en el cuerpo )lo que antes hemos llamado bloque de c(digo+
de una funci(n, incluso otras funciones y definiciones de clases.
#n PHP no podemos redefinir una funci(n previamente declarada, y adem<s en PHPK, las funciones deben
definirse siempre antes de que se invoquen, en PHP* este requerimiento ya no e'iste.
La instruccin 4E$64/
2uando invocamos una funci(n, la e>ecuci(n del programa pasa a e>ecutar las l/neas de c(digo que contenga la
funci(n, y una vez terminado, el programa continua su e>ecuci(n desde el punto en que fu3 llamada la funci(n.
7
#'iste una manera de terminar la e>ecuci(n de la funci(n aunque a0n haya c(digo por e>ecutar, mediante el u haya
c(digo por e>ecutar, mediante el uso de la instruci(n ret'rn terminamos la e>ecuci(n del c(digo de una funci(n y
devolvemos un valor. Podemos tener varios ret'rn en nuestra funci(n, pero por lo general, cuantos m<s
ret'rn tengamos menos reutilizable ser< nuestra funci(n.
<?php
function mayor )', y+
A
if )' > y+ A
return '." es mayor que".y%
B else A
return y." es mayor que".'%
B
B
?>
,unque quedari< me>or?
<?php
function mayor )', y+
A
msg ! ""%
if )' > y+ A
msg ! '." es mayor que".y%
B else A
msg ! y." es mayor que".'%
B
return msg%
B
?>
2on la instruci(n ret'rn puede devolverse cualquier tipo de valor, incluyendo tablas y ob>etos. PHP solo
permite a las funciones devolver un valor, y para solventar este pequeRo problema, si queremos que nuestra
funci(n devuelva varios tenemos que utilizar una tabla )array+.

ParAmetros de las )unciones
#'isten dos formas de pasar los par<metros a una funci(n, por &alor o por re)erencia.
2uando pasamos una variable por &alor a una funcion, ocurra lo que ocurra en 3sta en nada modificar< el
contenido de la variable. :ientras que si lo hacemos por re)erencia, cualquier cambio acontecido en la funci(n
sobre la variable lo har< para siempre.
# variable lo har< para siempre.
#n PHP, por defecto, las variables se pasan por valor. Para hacerlo por referencia debemos anteponer un
ampersand )-+ a la variable.
<?php
function suma )', y+
A
' ! ' J H%
return 'Jy%
B
a ! H%
b ! N%

&&par<metros por valor
echo suma )a, b+% && imprimir< *
echo a% && imprimir< H
8

&&par<metros por referencia
echo suma )Ta, b+% && imprimir< *
echo a% &&imprimir< N
?>
7i queremos que un par<metro de una funci(n se pase siempre por referencia debemos anteponer un ampersand )-+
al nombre del par<metro en la definici(n de la funci(n.
#n PHP podemos definir valores por defecto para los par<metro de una funci(n. #stos valores tienen que ser una
e'presi(n constante, y no una variable o miembro de una clase. ,dem<s cuando usamos par<metros por defectos,
3stos deben estar a la derecha de cualquier par<metro sin valor por defecto, de otra forma PHP nos devolver< un
error.
<?php
function suma )'!H, y+
A
' ! ' J H%
return 'Jy%
B
?>
7i e>ecutarmos esta funci(n nos dar/a error, ya que hemos dado a $1 el valor 5 por defecto y la hemos colocado a
la izquierda de un par<metro que no tiene valor por defecto. .a forma correcta es?
<?php
<?php
function suma )y, '!H+
A
' ! ' J H%
return 'Jy%
B
?>
2abe destacar que PHPK no soporta un n0mero variables de par<metros, pero PHP* s/.
.legados a este punto, damos un paso atr<s y volvemos a las variables, para distinguir entre variables est<ticas
)static+ y globales )6%o"a%+. .as variables est<ticas se definen dentro de una funci(n, la primera vez que es
llamada dicha funci(n la variable se inicializa, guardando su valor para posteriores llamadas.
<?php
function contador )+
A
static count ! @%
count ! count J H%
return count%
B
echo contador)+."<D->"% && imprimir< H
echo contador)+."<D->"% && imprimir< N
echo contador)+."<D->"% && imprimir< K
?>
.as variables globales, no se pueden declarar dentro de una funci(n, lo que hacemos el llamar a una variable que
ya ha sido declarada, tomando el valor que tenga en ese momento, pudiendo se modificado en la funci(n.
<?php
var a ! H%
function verWa)+
A
global a%
echo a."<D->"% && imprimir< el valor de a
9

a J! H% && sumamos H a a
B
echo verWa)+% && imprimir< H
echo verWa)+% && imprimir< N
a ! U%
echo verWa)+% && imprimir< U
echo verWa)+% && imprimir< O
?>

8unciones aria!le
PHP soporta el concepto de )unciones &aria!les, esto es significa que si una variable tiene unos parentesis
aRadidos al final, PHP buscar< un funci(n con el mismo nombre que el contenido de la variable, e intentar<
e>ecutarla.
<?php
function imprime)te'to+ A
echo te'to . "$n"%
B
function imprime5egrilla)te'to+A
echo "<D>te'to<&D>$n"%
B
:i4unc ! "imprime"%
:i4unc)"Hola"+% &&imprimir< Hola
:i4unc ! "imprime5egrilla"%
:i4unc)"Hola"+% &&imprimir< Hola
?>
4ecursin
PHP t>-ecursi(n
PHP tambi3n permite la recursi(n, es decir, una funci(n se puede llamar as/ misma. Para aclarar el concepto de
recursi(n, vamos a crear una funci(n que comprueba si un n0mero es entero o no.
Un n0mero que no sea entero )UX*+, tiene una parte entera y otra decimal )comprendida entre @ y H+, lo que vamos
a hacer para comprobar si un n0mero es entero o no, ser< restarle H al n0mero en cuesti(n hasta que nos que demos
sin parte entera, y entoces comprobaremos si tiene parte decimal )un poco lioso todo 3sto+.
<?php
function es#ntero)numero+ A
if )numero > H+ A
return )es#ntero)numero SH++%

B elseif )numero < @+ A
&Y como los n0m. son sim3tricos
chequeamos lo convertimos a positvo Y&
return )es#ntero))SH+ Y numero SH++%

B elseif ))numero > @+ ,5; )numero < H++ A
return )"5="+%
B else A
&Y el cero es entero por definici(n Y&
return )"79"+%
B

B &&fin function
10

echo "Q#s @ un n0mero entero? ".es#ntero)@+."$n"%
echo "Q#s K.I un n0mero entero? ".es#ntero)K.I+."$n"%
echo "Q#s SU un n0mero entero? ".es#ntero)SU+."$n"%
echo "Q#s SV.N un n0mero entero? ".es#ntero)V.N+."$n"%

?>
2(mo ahorranos l/neas de c(digo
2(mo ahorranos l/neas de c(digo
#n las lecciones anteriores hemos aprendido el uso b<sico de las funciones de PHP para traba>ar con :y7Z.. #n
esta lecci(n y sucesivas vamos a ver nuevas funciones que nos facilitan y potencian nuestras p<ginas 1eb.
Por lo general, todos nuestros script tienen partes de c(digo iguales, las funci(nes include)+ y re7'ire23 nos
van ahorrar muchas de estas lineas de c(digo. ,mbas funciones hacen una llamada a un determinado fichero pero
de dos maneras diferentes, con inc%'de23, insertamos lo que contenga el fichero que llamemos de manera literal
en nuestro script, mientras que con re7'ire23, le decimos que el script necesitar< parte de c(digo de se
encuentra en el fichero que llama re7'ire23.
2omo todo esto es un poco lioso, veamos unos e>emplos que nos lo aclar<.
<?php
include )"header.inc"+%
echo "Hola :undo"%
include )"footer.inc"+%
?>
7i tenemos encuenta que el fichero header.inc contiene?
<html>
<body>
y el fichero )ooter.inc contiene?
<&body>
<&html>
5uestro script ser/a equivalente a?
<html>
<body>
<?php
<?php
echo "Hola :undo"%
?>
<&body>
<&html>
,hora veamos el script de e>emplo para la funci(n re7'ire23?
<?php
require )"config.inc"+%
include )"header.inc"+%
echo cadena%
include )"footer.inc"+%
?>
;onde el fichero con)ig.inc tendr/a algo como 3sto?
<?php
cadena ! "Hola :undo"%
?>
6iempo y fecha
#n esta lecci(n vamos a ver como algunas funciones relacionadas con el tiempo y la fecha, as/ como algunos
e>emplos pr<cticos.
11

time
;evuelve el numero de segundos transcurridos desde el H de #nero de HVU@. , esta forma de e'presar fecha y hora
se le denomina tmestamp.

date-)ormato' timestamp0
.a funci( date devuelve una cte)formato, timestamp+
.a funci( date devuelve una cadena formateada seg0n los c(digo de formato. 7i no le pasamos la variable
timestamp nos devuelve la cadena formateada para la fecha y la hora actual.
.os c(digos de formato para la funci(n date son?
CODIGO DESCRIPCIN
a am o pm
A AM o PM
d Da del mes con ceros
D Abreviatura del da de la semana (ingls)
F Nombre del mes (ingls)
h Hora en formato !"
H Hora en formato #!"$
i Minutos
% Da del mes sin ceros
l Dia de la semana
m N&mero de mes (!")
M Abreviatura del mes (ingls)
s 'egundos
( A)o con " dgitos
* A)o con + dgitos
, Dia del a)o (!$-.)
Para ver algunos e>emplos supongamos que ahora es el U de abril de N@@
Para ver algunos e>emplos supongamos que ahora es el U de abril de N@@@ a las H* horas K@ minutos y NN segundos?
date)"dSmS["+ S> @US@*SN@@@
date)"H?i?s"+ S> H*?K@?NN
date)"["+ S> N@@@
date)"[mdHis"+ S> N@@@@*@UH*K@NN
date)"d&m&y H?i a"+ S> @U&@*&@@ H*?K@ pm
date)dSmS[ H?i, time)++ S> el momento actual

mFtime-hora' min' seg' mes' dia' aBo0
.a funcion mFtime devuelve una variable de tipo timestamp a partir de las coordenadas dadas. .a principal utilidad
de esta funcion es la de aRadir o quitar una determinada cantidad de fecha u horas a una dada.
<?PHP
function restar;ias)numdias, date+ A
if )isset)date++ A
date ! time)+%
B
list)hora, min, seg, dia, mes, anno+ ! e'plodest)hora, min, seg, dia, mes, anno+ ! e'plode) " ",
date) "H i s d m ["++%

d ! dia S numdias%
fecha ! date)"dSmS[", mFtime)hora, min, seg, mes, d, anno++%
return fecha%
B
echo restar;ias)I+."<D->"%
echo restar;ias)H@+."<D->"%
?>
12

cheFdate -mes' dia' aBo0
.a funci(n cheFdate comprueba si una fecha es v<lida, si es as/ devuelve 6-U# y si no lo es 4,.7#. Una fecha se
considera v<lida si el aRo est< entre HV@@ y KNUPU, el mes entre H y HN, y el dia es menor o igual que n0mero de
d/as total del mes en cuesti(n.
<?PHP
if )checFdate)KH, N, N@@@++ A
echo ".a fecha es correcta"%
B else A
echo ".a fecha es incorrecta"%
B
?>
Para el e>emplo anterior nos dar/a que la fecha es incorrecta, febrero nunca tiene un d/a KH.
.as clases
.as 2lases son m<'imo e'ponente de la Programaci(n =rientada a =b>etos )P==+. PHP no es un lengua>e orientad
a ob>eto, pero implementa las caracter/sticas que permiten definir las clases.
Pero, Qqu3 son las 2lases y para que sirven?, empecemos por los segundo, sirven hacer el c(digo m<s legible, y lo
que es m<s importante, reutilizable. #scribir una 2lase es sin duda m<s largo que escribir el c(digo directamente,
pero a la larga es m<s rentable por su portabilidad a otras , pero a la larga es m<s rentable por su portabilidad a
otras aplicaciones y su mantenimiento.
.as 2lases no son m<s que una serie de variables y funciones que describen y act0an sobre algo. Por e>emplo,
vamos a crear la clase a'tom8vi%, la cual tendr< diversas variables, $co%or, $mode%o, $marca,
$potencia, $matric'%a y habr< una serie de funciones que actuar<n sobre la clase a'tom8vi% como
9recio23, *ce%erar23, :renar23, ;irar23y /eparar23.
2omo e>emplo vamos a crear la clase mys7%, que nos servir< para realizar consultas a las bases de datos :y7Z..
<?php
class ;DWmysql A

&Y variables de cone'i(n Y&
var Dase;atos%
var 7ervidor%
var Usuario%
var 2lave%


&Y identificador de cone'i(n y consulta Y&
var 2one'ionW9; ! @%
var 2onsultaW9; ! @%

&Y n0mero de error y te'to error Y&
var #rrno ! @%
var #rror ! ""%


&Y :3todo 2onstructor? 2ada vez que creemos una variable
de esta clase, se e>ecutar< esta funci(n Y&
function ;DWmysql)bd ! "", host ! "localhost", user ! "nobody", pass ! ""+ A
thisS>Dase;atos ! bd%
thisS>7ervidor ! host%
thisS>Usuario ! user%
thisS>2lave ! pass%
13
B

&Y2one'i(n a la base de datosY&
function conectar)bd, host, user, pass+A

if )bd \! ""+ thisS>Dase;atos ! bd%
if )host \! ""+ thisS>7ervidor ! host%
if )user \! ""+ thisS>Usuario ! user%
if )pass \! ""+ thisS>2lave ! pass%

&& 2onectamos al servidor
thisS>2one'ionW9; ! mysqlWconnect)thisS>7ervidor, thisS>Usuario, thisS>2lave+%
if )\thisS>2one'ionW9;+ A
thisS>#rror ! "Ha fallado la cone'i(n."%
return @%
B

&&seleccionamos la base de datos
if )\]mysqlWselectWdb)thisS>Dase;atos, thisS>2one'ionW9;++ A
thisS>#rror ! "9mposible abrir ".thisS>Dase;atos %
return @%
B

&Y 7i hemos tenido 3'ito conectando devuelve
el identificador de la cone'i(n, sino devuelve @ Y&
return thisS>2one'ionW9;%
B

&Y #>ecuta un consulta Y&
function consulta)sql ! ""+A

if )sql !! ""+ A
thisS>#rror ! "5o ha especificado una consulta 7Z."%
return @%
B

&&e>ecutamos la consulta
thisS>2onsultaW9; ! ]mysqlWquery)sql, thisS>2one'ionW9;+%

if )\thisS>2onsultaW9;+ A
thisS>#rrno ! mysqlWerrno)+%
thisS>#rror ! mysqlWerror)+%
B
&Y 7i hemos tenido 3'ito en la consulta devuelve
el identificador de la cone'i(n, sino devuelve @ Y&
return thisS>2onsultaW9;%
B

&Y ;evuelve el n0mero de campos de una consulta Y&
function numcampos)+ A
return mysqlWnumWfields)thisS>2onsultaW9;+%
14
B

&Y ;evuelve el n0mero de registros de una consulta Y&
function numregistros)+A
return mysqlWnumWro1s)thisS>2onsultaW9;+%
B

&Y ;evuelve el nombre de un campo de una consulta Y&
function nombrecampo)numcampo+ A
return mysqlWfieldWname)thisS>2onsultaW9;, numcampo+%
B

&Y :uestra los datos de una consulta Y&
function verconsulta)+ A

echo "<table border!H>$n"%

&& mostramos los nombres de los campos
for )i ! @% i < thisS>numcampos)+% iJJ+A
echo "<td><b>".thisS>nombrecampo)i+."<&b><&td>$n"%
B
echo "<&tr>$n"%
&& mostrarmos los registros

1hile )ro1 ! mysqlWfetchWro1)thisS>2onsultaW9;++ A
echo "<tr> $n"%
for )i ! @% i < thisS>numcampos)+% iJJ+A
echo "<td>".ro1LiM."<&td>$n"%
B
echo "<&tr>$n"%
B

B


B &&fin de la 2lse ;DWmysql
?>
2omo habreis observado, para crear una clase utilizamos la sentencia c%ass, y adem<s hemos creado una funci(n
con el mismo nombre que la clase, a esa funci(n se le llama constructor y se e>ecutar< cada vez que definamos
una variable de esa clase. 5o es obligatorina variable de esa clase. 5o es obligatorio crear un constructor en una
definici(n de clase.
=tra cosa importante en las clases es el operador ->, con el que indicamos una variable o m3todo )parte derecha
del operador+ de una clase )parte izquierda del operador+. Para hacer referencia a la clase que estamos creando
dentro de su definici(n, debemos utilizar this.
[ ahora veamos un e>emplo de la clase que hemos creado, y supongamos que el c(digo anterior lo hemos guardado
en un fichero llamado clase3mys(l.inc.php.
<body>
<html>
<?php
require )"claseWmysql.inc.php"+%
micone'ion ! ne1 ;DWmysql %
15
micone'ionS>conectar)"mydb", "localhost", "nobody", ""+%
micone'ionS>consulta)"7#.#26 Y 4-=: agenda"+%
micone'ionS>verconsulta)+%
?>
<&body>
<&html>
Los )ormularios
.os 4ormularios no forman parte de PHP, sino del lengua>e est<nder de 9nternet, H6:., pero como 3stos van a
aperecer muchas veces durante el curso, vamos a dedicar esta algunas l/neas a ellos. .o que viene a continuaci(n
es H6:. y no PHP.
6odo formulario comienza con la etiqueta <:./M *<=>.+=%o_7'e_sea.php M?=$.,=post/6et>.
2on . 2on *<=>.+ indicamos el script que va procesar la informaci(n que recogemos en el formulario, mientras
que M?=$., nos indica si el usuario del formulario va ha enviar datos )post+ o recogerlos )6et+. .a etiqueta
<:./M> indica el final del formulario.
, partir de la etiqueta <:./M> vienen los campos de entrada de datos que pueden ser?
Cuadro de te"to#
<input type!"te't" name!"nombre" size!"N@" value!">ose">
Cuadro de te"to con !arras de despla%amiento#
<te'tarea ro1s!"I" name!"descripcion" cols!"N@">#s de color ro>o<&te'tarea>
Casilla de &eri)icacin#
<input type!"checFbo'" name!"cambiar" value!"=5">
Dotn de opcin#
<input type!"radio" value!"azul" checFed name!"color">
Men? desplega!le#
<select size!"HTqu class!"codigo"><select size!"H" name!"dia">
<option selected value!"lunes">lunes<&option>
<option>martes<&option>
<option value!"miercoles">miercoles<&option>
<&select>
Doton de comando#
<input type!"submit" value!"enviar" name!"enviar">
Campo oculto#
<input type!"hidden" name!"edad" value!"II">
#ste 0ltimo tipo de campo resulta especialmente 0til cuando que remos pasar datos ocultos en un formulario.
2omo habr<s observado todos lo tipos de campo tienen un modicador llamado name, que no es otro que el nombre
de la variable con la cual recogeremos los datos en el script indicado por el modificador *<=>.+ de la etiqueta
:./M:./M@ con va%'e esta"%ecemos 'n va%or por defecto.
A continuacin &eamos un ejemplo' para lo cual crearemos un )ormulario en H$ML como el (ue sigue y lo
llamaremos )ormulario.htm#
*H$ML+
*D.>G+
*8.4M ME$H.><"post" AC$5./<"mis3datos.php"+
*input type<"hidden" name<"edad" &alue<"HH"+
*p+$u nom!re *input type<"te"t" name<"nom!re" si%e<"I9" &alue<"jose"+*2p+
*p+$u sistema )a&orito
*select si%e<"7" name<"sistema"+
*option selected &alue<"Linu""+Linu"*2option+
*option &alue<"6ni""+6ni"*2option+
*option &alue<"Macintosh"+Macintosh*2option+
16
*option &alue<;(marginJle)t# KH"+*option &alue<"CindoLs"+CindoLs*2option+
*2select+*2p+
*p+M$e gusta el )ut!ol , *input type<"checF!o"" name<")ut!ol" &alue<"./"+*2p+
*p+MCual es tu se"o,*2p+
*!locF(uote+
*p+Hom!re*input type<"radio" &alue<"hom!re" checFed name<"se"o"+*2p+
*p+Mujer *input type<"radio" name<"se"o" &alue<"mujer"+*2p+
*2!locF(uote+
*p+A)iciones*2p+
*p+*te"tarea roLs<"H" name<"a)iciones" cols<"NO"+*2te"tarea+*2p+
*p+*input type<"su!mit" &alue<"En&iar datos" name<"en&iar"+
*input type<"resJle)t# H9"+ *input type<"reset" &alue<"4esta!lecer" name<"DN"+*2p+
*28.4M+
*2D.>G+
*H$ML+
G ahora creemos el script PHP llamado desde le )ormulario mis3datos.php#
*,PHP1
i) -=en&iar0 P
echo "Hola *!+" . =nom!re . "*2!+ (ue tal estAs*D4+Qn"1
echo "Eres " . =se"o . "*D4+Qn"1
echo "$ienes " . =edad . "*D4+Qn"1
echo "$u sistema )a&orito es " . =sistema . "*D4+Qn"1
i) -=)ut!ol0 P
echo "$e gusta el )ut!ol *D4+Qn"1
R else odigo" style<"marginJle)t# H9"+R else P
echo "/. te gusta el )ut!ol *D4+Qn"1
R
i) -=a)iciones S< ""0 P
echo "$us a)iciones son# *D4+Qn"1
echo nlN!r-=a)iciones01
R else P
echo "/. tienes a)iciones *D4+Qn"1
R
R
echo "*a hre)<T)ormulario.htmT+.LE4 AL 8.4M6LA45.*2a+"
,+
6na &e% rellenados los datos del )ormulario' pulsamos el !otn En&iar datos' con lo (ue le campo en&iar
toma lo (ue su eti(ueta va%'e indica' es decir en&iar<"En&iar datos". En nuestro script lo primero (ue
e&aluamos es (ue se haya en&iado el )ormulario' y para ello nada mejor (ue compro!ar (ue la &aria!le
$enviar no estA &acia. Le ponemos el signo dolar delante a en&iar' ponemos el signo dolar delante a en&iar'
ya (ue en PHP todas las &aria!les se les re)iere con este signo.
Pero y )usionaramos el cdigo de am!os )ichero' nos ahorrariamo uno. Si la &aria!le $enviar estA &acia'
en&iamos el )ormulario.
*,PHP1
i) -=en&iar0 P
echo "Hola *!+" . =nom!re . "*2!+ (ue tal estAs*D4+Qn"1
echo "Eres " . =se"o . "*D4+Qn"1
echo "$ienes " . =edad . "*D4+Qn"1
echo "$u sistema )a&orito es " . =sistema . "*D4+Qn"1
i) -=)ut!ol0 P
echo "$e gusta el )ut!ol *D4+Qn"1
17
R else P
echo "/. te gusta el )ut!ol *D4+Qn"1
R
i) -=a)iciones S< ""0 P
echo "$us a)iciones son# *D4+Qn"1
echo nlN!r-=a)iciones01
R else P
echo "/. tienes a)iciones *D4+Qn"1
R
echo "*a hre)<T=PHP3SEL8T+.LE4 AL 8.4M6LA45.*2a+"

R else P
*H$ML+
*D.>G+
*8.4M ME$H.><"post" AC$5./<"*,PHP echo =PHP3SEL8 ,+"+
*input type<"hidden" name<"edad" &alue<"HH"+
*p+$u nom!re *input type<"te"t" name<"nom!re" si%e<"I9" nom!re" si%e<"I9" &alue<"jose"+*2p+
*p+$u sistema )a&orito
*select si%e<"7" name<"sistema"+
*option selected &alue<"Linu""+Linu"*2option+
*option &alue<"6ni""+6ni"*2option+
*option &alue<"Macintosh"+Macintosh*2option+
*option &alue<"CindoLs"+CindoLs*2option+
*2select+*2p+
*p+M$e gusta el )ut!ol , *input type<"checF!o"" name<")ut!ol" &alue<"./"+*2p+
*p+MCual es tu se"o,*2p+
*!locF(uote+
*p+Hom!re*input type<"radio" &alue<"hom!re" checFed name<"se"o"+*2p+
*p+<"codigo" style<"marginJle)t# 799"+*p+Mujer *input type<"radio" name<"se"o"
&alue<"mujer"+*2p+
*2!locF(uote+
*p+A)iciones*2p+
*p+*te"tarea roLs<"H" name<"a)iciones" cols<"NO"+*2te"tarea+*2p+
*p+*input type<"su!mit" &alue<"En&iar datos" name<"en&iar"+
*input type<"reset" &alue<"4esta!lecer" name<"DN"+*2p+
*28.4M+
*2D.>G+
*2H$ML+

*,PHP
R 22)in 58
,+
La &aria!le de entorno $9$9_A?B:' es una &aria!le de entorno (ue nos de&uel&e el nom!re del script (ue
estamos ejecutando. G por ?ltimo' hacer notar el uso de la )uncin n%C"r23' n%C"r23' con la cuAl
sustituimos los retornos de carro del te"to' los cuAles no reconocen los na&egadores' por la eti(ueta <D/>.
>escarga de archi&os
8amos a ver un caso especial, como descargar un archivo desde un formulario. Para ello utilizaremos una etiqueta
>+9E= de tipo :>B?, soportada a partir de las versiones de los navegadores 5estcape 5avigato N.@ e 9nternet
#'plorer *.@.
18
#l formulario debe usar el m3todo post, y el atributo post@ y e% atri"'to enctype de"e tener
e% va%or m'%tipart/form-data. *demFs a% form'%ario de"emos aGadir%e 'n campo
oc'%to de nom"re M*0_:>B?_A>H?@ a% c'F% %e daremos e% va%or en "yte de%
tamaGo mF1imo de% archivo a descar6ar.
*8.4M E/C$GPE<"multipart2)ormJdata" AC$5./<"KJI.phpI" ME$H.><"post"+
*5/P6$ $GPE<"hidden" name<"MAU385LE3S5VE" &alue<"799999"+
*5/P6$ /AME<"archi&o" $GPE<")ile"+
*5/P6$ $GPE<"su!mit" AL6E<">escargar Archi&o"+
*28.4M+
Cuando el )ormulario es en&iado' PHP detectararA automaticamente (ue se estA descargando un archi&o y
lo colocarA en un directorio temporal en el ser&idor. >icho directorio serA (ue el (ue est: indicado en el
archi&o de con)iguracin phpI.ini' o en su de)ecto en el directorio temporal del sistema.
Cuando PHP dectecta (ue se estA descargando un archi&o crea &arias &aria!les con el pre)ijo del nom!re
del archi&o pero con distintas terminaciones. La &aria!le terminada en _name contiene
eligoenlinea"+3name contiene el nombre original del archivo, la terminad en _siIe el tamaRo en bytes de 3ste, y
la variable terminada en _type nos indicar< el tipo de archivo si 3ste es ofrecido por el navegador.
7i el proceso de descarga no ha sido correcto la variable archivo tomar< el valor none y _siIe ser< J, y si el
proceso ha sido correcto, pero la variable teminada en _siIe da J, quiere decir que el archivo a descarga supera
el tamaRo m<'imo indicado por M*0_:>B?_A>H?.
Una vez descargado el archivo, lo primero que debemos hacer es moverlo a otro lugar, pues sino se hace nada con
3l, cuando acabe la e>ecuci(n de la p<gina se borrar<.
8eamos un e>emplo de todo lo dicho.
<H6:.>
<D=;[>
<?PHP
if )enviar+ Aif )enviar+ A
if )archivo \! "none" ,5; archivoWsize \! @+A
echo "5ombre? archivoWname <D->$n"%
echo "6amaRo? archivoWsize <D->$n"%
echo "6ipo? archivoWtype <D->$n"%
&Y para Cindo1s
if )\ copy )archivo, "2?$$6#:P$$".archivoWname++ A
echo "<hN>5o se ha podido copiar el archivo<&hN>$n"%
B
Y&

&Y para .inu'&Uni' Y&
if )\ copy )archivo, "&tmp&".archivoWname++ A
echo "<hN>5o se ha podido copiar el archivo<&hN>$n"%
B

B elseif )archivo \! "none" ,5; archivoWsize !! @+ A
echo "<hN>6amaRo de arcft? UI">echo "<hN>6amaRo de archivo superado<&hN>$n"%
B else A
echo "<hN>5o ha escogido un archivo para descargar<&hN>$n"%

B
echo "<H->$n"%
B

?>
19

<4=-: #526[P#!"multipart&formSdata" ,269=5!"<?php echo PHPW7#.4 ?>" :#6H=;!"post">
<95PU6 type!"hidden" name!":,^W49.#W79_#" value!"H@@@@@">
<p><b>,rchivo a descargar<b><br>
<95PU6 type!"file" name!"archivo" size!"KI"><&p>
<p><95PU6 type!"submit" name!"enviar" value!",ceptar"><&p>
<&4=-:>
<&D=;[>
<&H6:.>
4unciones de acceso a ficheros
Posiblente durante nuestra tarea de programaci(n nos surga la necesidad de obtener datos de un fichero, o bien, de
crear uno. PHP nos provee de una e'tensa gama de funciones de acceso a ficheros.
#n esta lecci(n s(lo vamos a las funciones b<sicas, abrir )fopen+, cerrar )fclose+, leer )fgets+ y escribir )fputs+.
#stas cuatro nos solventaran la mayoria de problemas queibir )fputs+. #stas cuatro nos solventaran la mayoria de
problemas que nos surgan con respecto al acceso a ficheros.
)open -archi&o' modo0
2on esta funci(n abrimos un fichero, bien sea local o una direcci(n de internet )http?&& o ftp?&&+.
.a funci(n )open nos devuelve un valor num3rico )indicador de archivo+ de tipo integer que nos servirar< para
hacer referencia al archivo abierto.
2on fopen podemos abrir un archivo de los siguientes modos?
r solo lectura
r! lectura y escritura
4 solo escritura. 7ino e'iste el archivo lo crea, si ya e'iste lo machaca.
4! lectura y escritura. 7ino e'iste el archivo lo crea, si ya e'iste lo machaca.
a solo lectura. 7ino e'iste el archivo lo crea, si ya e'iste empieza a escribir al final del archivo.
a! lectura y escritura. 7ino e'iste el archivo lo crea, si ya e'iste empieza a escribir al final del archivo.
<?PHP
&&abreo"><?PHP
&&abre un archivo utilizando el protocolo H66P
if ) \ fopen)"http?&&111.ciberaula.com&", "r"++ A
echo "#l archivo no se puede abrir$n"%
e'it%
B
?>
.os modos r, r! , 4 , 4! colocan el puntero de lectura&escritura a principio del fichero, los modos a , a! lo
colocan al final.

)gets -indicador3archi&o' longitud0
.a funci(n )gets nos devuelve una cadena con la longitud especifica del fichero al que apunta el indicador de
archivo.
<?PHP
&&abre un archivo e imprime cada linea
archivo ! fopen)"dlass!"codigo">archivo ! fopen)"data.t't" , "r"+%
if )archivo+ A
1hile )\feof)archivo++ A
linea ! fgets)archivo, NII+%
echo linea%
B
B
fclose )archivo+%
20
?>
.a funci(n )eo) devuelve 6-U# si puntero de lectura&escritura se encuetra al final del fichero, y 4,.7# en caso
contrario.

)puts -indicador3archi&o' cadena0
.a funci(n )puts escribe una cadena en el fichero indicado. Para escribir en una archivo este debe haber sido
previamente abierto. .a funci(n )puts devuelve 6-U# si se ha escrito con 3'ito, en caso contrario devuelve
4,.7#.
<?PHP
&&abre un archivo y escribe en 3l
archivo ! fopen)"data.t't" , "1"+%
if )archivo+ A
fputs )archivo, "Hola :undo"+%
B
fclose )archivo+%
?>
/)0
?>

)close -indicador3archi&o0
2on esta funci(n cerramos el fichero que nos marca el indicador de archivo, devuelve 6-U# si el fichero se cierra
correctamente y 4,.7# sino se ha podido cerrar.

)ile3e"ists -)ichero0
#sta funci(n devuelve 6-U# si el archivo especificado e'iste, y 4,.7# en caso contrario.
<?PHP
if )fileWe'ists)"data.t't"++ A
echo "#l fichero e'iste"%
B else A
echo "#l fichero 5= e'iste"%
B
?>

copy -origen' destino0
.a funci(n copy copia un fichero de un lugar )origen+ a otro )destino+, devuelve 6-U# si la copia a tenido 3'ito y
4,.7# en caso contrario.
<?PHP
if )copy)"data.t't", "&tmp&data.t't"++ A
echo "#l fichero ha sido copiado con 3'ito"%
B else A
echo "#l fichero 5= se higo" style!"marginSleft? I@">echo "#l fichero 5= se ha podido copiar"%
B
?>
MySQL
#n esta lecci(n vamos a hacer un pequeRo recorrido por MySQL, por su estructura y forma de traba>ar. Para ello
suponemos que ya hemos conseguido )por fin...+ instalar :y7Z. en nuestra m<quina.
.o primiero que debemos hacer es arrancar :y7Z. )ver capitulo de instalaci(n+?
1inu23 ./mys7%d start
4indo5s3 mys7%d-share4are.e1e
4indo5s3 mys7%d-share4are.e1e
21
6odo el sistema de permisos de acceso al servidor, a las bases de datos y sus tablas, :y7Z. lo almacena en una
tabla llamada mys7%, que como todas estar< en el directorio 2data, a menos que hallamos especificado otro
directorio.
#n Cindo1s esta tabla se crea con la instalaci(n, pero en .inu'&Uni' debemos crearla con?
&usr&local&mysql&bin&mysqlWinstallWdb
#n la base de datos mys7% es donde se guadaran todos los permisos y restricciones a los datos de nuestras bases
de datos. .a principal herramienta de :y7Z. es mys7%admin, la cu<l como parece indicar su nombre es la
encargada de la administraci(n.
:y7Z. crea por defecto al usuario root con todos los perimsos posibles habilitados, podemos utilizar este usuario
como administrador o crear otro, por e>emplo mys(ladmi. 2omo el usuario root lo crea sin clave de acceso, lo
primero que debemos hacer es asignarle una?
mysqladmin Su root pass1ord "miclave"
, partir de ahora cualquier operaci(n que hagamos como root deberemos especifica la clave. Hay que destacar que
enter el modificador Sp y la clave no debe habeficador Sp y la clave no debe haber espacios.
mysqladmin Su root Spmiclave
Pues bien, ya estamos preparado para crear una base de datos
mysqladmin Su root Spmiclave create mibasededatos
Para borrarla
mysqladmin Su root Spmiclave drop mibasededatos
La estructura de MySQL
#n el directorio &benc encontraremos e>emplos de script y 7Z.. #n el directoio &share est<n los mensa>es de error
del servidor para los distinos idiomas. .os directorios &include y &lib contiene los fichero Y.h y las librerias
necesarias, en &bin estan los ficheros e>ecutables y en &data encontraremos como subdirectorio cada una de las
bases de datos que hayamos creado.
2omo hemos dicho, para cada base de datos que nostros creamos, :y7Z. crea un directorio con el nombre que le
hemos asignado a la bade de datos. ;entro de este directorio, por cada tabla que definamos :y7Z. va ha crear
tres archivos? mita!la.5S>' mita!la.5SM' mita!la.)rm
#l abla.frm
#l archivo con e'tensi(n 5S>, es el contine los datos de nuestra tabla, el 5SM contiene informaci(n acerca de las
claves y otro datos que :y7Z. utiliza para buscar datos en el fichero 5S>. [ el archivo )rm contine la estructura
de la propia tabla.
;ado que las bases de datos de :y7Z. son simples ficheros de un directorio, para realizar copias de seguridad,
podremos utilizar las herramientas de compresi(n que habitualmente usamos en nuestro sistema y luego copiarlo a
otro lugar, o simplemente esto 0ltimo.
Seguridad
2omo comentamos anteriormente, todo el sistema de permisos :y7Z. lo guarda en una base de datos llamada
mys7%, la cu<l se componen de cinco tablas? host' user' d!' ta!les3pri&' colums3pri&.
.a tabla user contiene informaci(n sobre los usuarios, desde que m<quinas pueden acceder a nuestro servidor
:y7Z., su clave y de sus diferentes permisos. .a tabla host nos informa sobre que m<quinas podran acceder a
nuestro sistema, as/ como a las bases de datos que tendr<n acesso y sus diferentes permisos. 4inalmente, las tablas
d!' ta!les3pri&' columns3pri& nos proveen de un control individual de las bases de datos, tablas y columnas
)campos+.
6abla user
CAMPO TIPO POR DEFECTO
Host char(-#)
6ser char(-)
Pass5ord char(-)
'elect7priv enum(8N898*8) N
:nsert7priv enum(8N898*8) N
6pdate7priv enum(8N898*8) N
22
Delete7priv enum(8N898*8) N
;reate7priv enum(8N898*8) N
Drop7priv enum(8N898*8) N
<eload7priv enum(8N898*8) N
'hutdo5n7priv enum(8N898*8) N
Process7priv enum(8N898*8) N
File7priv enum(8N898*8) N
=rant7priv enum(8N898*8) N
<eferences7priv enum(8N898*8) N
:nde27priv enum(8N898*8) N
Alter7priv enum(8N898*8) N


6abla host
CAMPO TIPO POR DEFECTO
Host char(-#)
Db char($")
'elect7priv enum(8N898*8) N
:nsert7priv enum(8N898*8) N
6pdate7priv enum(8N898*8) N
Delete7priv enum(8N898*8) N
;reate7priv enum(8N898*8) N
Drop7priv enum(8N898*8) N
=rant7priv enum(8N898*8) N
<eferences7priv enum(8N898*8) N
:nde27priv enum(8N898*8) N
Alter7priv enum(8N898*8) N

6abla d!
CAMPO TIPO POR DEFECTO
Host char(-#)
Db char($")
6ser char(-)
'elect7priv enum(8N898*8) N
:nsert7priv enum(8N898*8) N
6pdate7priv enum(8N898*8) N
Delete7priv enum(8N898*8) N
;reate7priv enum(8N898*8) N
Drop7priv enum(8N898*8) N
<eferences7priv enum(8N898*8) N
:nde27priv enum(8N898*8) N
Alter7priv enum(8N898*8) N

He aqu/ una breve descripci(n de los diferentes permisos?
Select_priv3 Permite utili,ar la sentencia '>1>;?
Insert_priv3 Permite utili,ar la sentencia :N'><?
Update_priv3 Permite utili,ar la sentencia 6PDA?>
Delete_priv3 Permite utili,ar la sentencia D>1>?>
Create_priv3 Permite utili,ar la sentencia ;<>A?> o crear bases de datos
Drop_priv3 Permite utili,ar la sentencia D<@P o eliminar bases de datos
23
Reload_priv3 Permite recargar el sistema mediante mysqladmin reload
S!tdo"n_priv3 Permite parar el servidor mediante mysqladminPermite parar el servidor mediante mysqladmin shutdown
Process_priv: Permite manejar procesos del servidor
File_priv: Permite leer y escribir ficheros usando comando como SELECT IT! !"T#ILE y L!$% %$T$ I#ILE
Grant_priv: Permite otor&ar permisos a otros usuarios
Index_priv: Permite crear o borrar 'ndices
Alter_priv: Permite utili(ar la sentencia $LTE) T$*LE
Si dejamos en blanco los campos user, host o db, haremos referencia a cualquier usario, servidor o base de datos.
Conseguiremos el mismo efecto poniendo el smbolo % en el campo.
4unciones PHP de acceso a :y7Z.
#n esta leccion vamos a ver todas la funciones que provee PHP para el mane>o de bases de datos :y7Z.. .os
e>emplos del mane>o de las funciones, los veremos a lo largo del curso.

mys(l3a))ected3roLs
int mysqlWaffectedWro1s)int LlinFWidentifierM +%
mysqlWaffectedWro1s devuelve el n0mero de filas afectado en el 0ltimo 7#.#26, UP;,6# o ;#.#6# pregunta
en el servidor asociado con el identificador de cone'i(n especificado. 7i no se e especifica un identificador de
cone'i(n, se asume le de la 0ltima cone'i(n abierta.
#ste orden no es eficaz para las instrucciones 7#.#26, s(lo en instrucciones que modifican archivos. Para
recuperar el n0mero de filas vuelto de un 7#.#26, usa mysqlWnumWro1s.
mys(l3close
int mysqlWclose)int LlinFWidentifierM +%
;evuelve? 6-U# si se ha cerrado correctamente, 4,.7# en caso de errror.
mysqlWclose closes la cone'i(n a la base de datos :y7Z. asociada al idenficador de cone'i(n especificado. 7i no
se e especifica un identificador de cone'i(n, se asume le de la 0ltima cone'i(n abierta.
5ote que esta funci(n no es normalmente necesaria en cone'iones noSpersistentes )abiertas con myslWconnect+ ya
que 3st se cerrar< autom<ticamente al final de la e>ecuci(n del script o p<gina. .a funci(n mysqlWclose no cierra
una coneci(n persistente )abierta con mysqlWpconnect)++.
8er tambien? mysqlWconnect y mysqlWpconnect.
mys(l3connect
int mysqlWconnect)string LhostnameM , string LusernameM , string Lpass1ordM +%
;evuelve? un identificador de cone'i(n, o 4,.7# en caso de error.
sqlWconnect establece una cone'i(n a un servidor de :y7Z.. 6odos los argumentos son optativos, y si no se
especifican, los valores por defecto son )X el localhostX, nombre del usuario del usuario que posee el proceso del
servidor, la contraseRa vac/a+. .a cadena hostname tambi3n puede incluir un n0mero del puerto, "hostname?port".
#n caso de realizar una segunda llamada a mysqlWconnect con los mismos argumentos, no se establecer< ninguna
nueva cone'i(n, sino se devolver< el identificador de cone'i(n de la ya e'istente.
.a cone'i(n al servidor se cerrar< en cuanto la e>ecuci(n del script acabe, a menos que la cerremos antes con la
funci(n mysqlWclose.
8er tambi3n? mysqlWpconnect y mysqlWclose.
mys(l3create3d!
int mysqlWcreateWdb)string database name, int LlinFWidentifierM +%
.a funci(n mysqlWcreateWdb intenta crear una nueva base de datos en el servidor asociado con el identificado de
cone'i(n especificado.
8er tambi3n? mysqlWdropWdb.
mys(l3data3seeF
int mysqlWdataWseeF)int resultWidentifier, int ro1Wnumber+%
;evuelve? 6-U# si toda ha ido bien, y 4,.7# en caso de error.
.a funci(n mysqlWdataWseeF mueve el puntero que indica la fila actual al n0mero de fila de la consulta que indica
el identificador. .a pr('ima llamada al mysqlWfetchWro1 o mysqlWfetchWarray devolver/a esa fila.
8er tambi3n? mysqlWdataWseeF.
mys(l3d!name
string mysqlWdbname)string result, int i+%
24
mysqlWdbname devuelve el nombre de la base de datos guardado en posici(n i de los resultados del indicador de
consulta devuelto por la funci(n del mysqlWlistWdbs. .a funci(n del mysqlWnumWro1s puede usarse para
determinar cu<ntos nombres de bases de datos est<n disponibles.
mys(l3d!3(uery
int mysqlWdbWquery)string database, string query, int linFWidentifier+%
;evuelve? un identificador de cone'i(n, o 4,.7# en caso de error.< caso en 4,.7# o cone'i(n,>
#>ecuta una consulta en una base de datos. 7i el identificador no se especifica, la funci(n intenta encontrar una
cone'i(n abierta con el servidor. 7i no encuentra una cone'i(n, intentar< crear una )similar a mysqlWconnect) + sin
argumentos+.
7ee also mysqlWconnect.
mys(l3drop3d!
int mysqlWdropWdb)string databaseWname, int LlinFWidentifierM +%
;evuelve? 6-U# si toda ha ido bien, y 4,.7# en caso de error.
#limina una base de datos del servidor asociado al identificador de cone'i(n.
8er tambi3n? mysqlWcreateWdb
mys(l3errno
int mysqlWerrno)+%
;evuelve el n0mero de error asociado a la 0ltima operaci(n realizada.
8er tambi3n? mysqlWerror
mys(l3error
string mysqlWerror)+%
;evuelve el te'to asociado al error producido en la 0ltima operaci(n realizada por la base de datos.
<?php
mysqlWconnect)"marliesle"+%
echo mysqlWerrno)+."? ".mysqlWerror)+."<D->"%
mysqlWselectWdb)"none'istentdb"+%
echo mysqlWerrWdb)"none'istentdb"+%
echo mysqlWerrno)+."? ".mysqlWerror)+."<D->"%
conn ! mysqlWquery)"7#.#26 Y 4-=: none'istenttable"+%
echo mysqlWerrno)+."? ".mysqlWerror)+."<D->"%
?>
8er tambi3n? mysqlWerrno
mys(l3)etch3array
array mysqlWfetchWarray)int result+%
;evuelve un array con la informaci(n correspondiente al resultado de una consulta especificado por su
identificador o XfalseX si ya no hay m<s filas.
#s una versi(n e'tendida de mysqlWfetchWro1 ) +. ,dem<s de almacenar los datos a trav3s de /ndices num3ricos
del array, tambi3n lo hace a trav3s de /ndices asociativos, utilizando los nombres de los campos como claves.
7i dos o m<s columnas del resultado tienen el mismo nombre de campo, la 0ltima es la que tiene preferencia. Para
acceder a las dem<s es necesario utilizar el /ndice num3rico o construir un alias para la columna?
select tH.fH as foo tN.fH as bar from tH, tN
as foo t"Af as bar from t9 t"
#sta funci(n no es m<s lenta que XmysqlWfetchWro1) +X.
#'ample H. mysql fetch array
<?php
mysqlWconnect)host,user,pass1ord+%
result ! mysqlWdbWquery)"database","select Y from table"+%
1hile)ro1 ! mysqlWfetchWarray)result++ A
echo ro1L"userWid"M%
echo ro1L"fullname"M%
B
25
mysqlWfreeWresult)result+%
?>
mys(l3)etch3)ield
ob>ect mysqlWfetchWfield)int result, int LfieldWoffsetM +%
;evuelve un ob>eto que contiene la informaci(n de los campos que componen un resultado de una consulta. 7i no
se especifica XoffsetX, devuelve informaci(n sobre el siguiente campo que todav/a no ha sido devuelto.
Propiedades del ob>eto devuelto?
name ! nombre del campo
table ! nombre de la tabla a la Bue pertenece el campo
ma27length ! longitud mC2ima Bue puede tomar el campo
not7null ! si el campo no puede tomar valores nulos
primar(7De( ! si el campo es una clave principal (primar( De()
uniBue7De( ! si el campo tiene restricciEn de unicidad
multiple7De( ! si el campo no tiene rest
multiple7De( ! si el campo no tiene restricciEn de unicidad
numeric ! si el campo es numrico
blob ! si el campo es F1@F
t(pe ! tipo de dato (del campo)
unsigned ! si el campo es 8unsigned8
,erofill ! si el campo es rellenado con ceros
7ee also mysqlWfieldWseeF
mys(l3)etch3lengths
int mysqlWfetchWlengths)int result+%
;evuelve? una tabla o 4,.7# si hay error.
mysqlWfetchWlengths almacena en una tabla la longitud de cada campo de una consulta realizada con
mysqlWfetchWro1 o mysqlWfetchWarray. #l /ndice de la tabla comienza en @.
8er tambi3n? mysqlWfetchWro1.
mys(l3)etch3o!ject
int mysqlWfetchWob>ect)int result+%
;evuelve? un ob>eto o 4,.7# en caso de error.
#sta funci(n es similar aXmysqlWfetchWarray, solo que los resultados de una consulta, en lugar de una tabla, los
devuelve como un ob>eto. #n este caso, s(lo se puede acceder a los datos a trav3s de los nombres de sus campos.
.a velocidad de e>ecuci(n es id3ntica a la de XmysqlWfetchWarray. Para referenciar el valor de un campo debemos
utilizar el operador t/picos de los ob>etos )S>+.< ob>etos t/picos>
8er tambi3n? mysqlWfetchWarray and mysqlWfetchWro1.
mys(l3)etch3roL
array mysqlWfetchWro1)int result+%
;evuelve? una tabla o 4,.7# si hay error.
;evuelve un tabla con los valores de los campos de la fila actual de la cosulta, la que especificar el indicador
)result+ , y mueve el puntero interno que marca la fila actual a la siguiente fila, si no hay mas filas devuelve
4,.7#. #l /ndice de la tabla comienza en @.
8er tambi3n? mysqlWfetchWarray, mysqlWfetchWob>ect, mysqlWdataWseeF, mysqlWfetchWlengths, and mysqlWresult.
mys(l3)ield3name
string mysqlWfieldWname)string result, int i+%
;evuelve el nombre del campo especificado por el /ndice.
mys(l3)ield3seeF
int mysqlWfieldWseeF)int result, int fieldWoffset+%
:ueve el puntero del campo actual hacia adelante las posiciones actual hacia adelante las posiciones indicadas por
XoffsetX.
8er tambi3n? mysqlWfetchWfield.
mys(l3)ield3ta!le
string mysqlWfieldWtable)int result, int fieldWoffset+%
;evuelve el nombre de la tabla que almacena el campo especificado por el /ndice ) XfieldWoffsetX +.
mys(l3)ield3type
26
string mysqlWfieldWtype)string result, int fieldWoffset+%
;evuelve el tipo del campo del indice especificado.
mys(l3)ield3)lags
string mysqlWfieldWflags)string result, int fieldWoffset+%
;evuelve los especificadores )flags+ del campo especificado como una cadena de te'to en la que cada
especificador se corresponde con una palabra, y 3stas van separadas mediante un espacio simple. 7e puede analizar
la cadena utilizando e'plode) +
.os especificadores son?
"notWnull", "primaryWFey", "uniqueWFey", "multipleWFey", "blob", "unsigned", "zerofill", "binary", "enum",
"autoWincrement", "timestamp".
mys(l3)ield3len
int mysqlWfieldWlen)string result, int fieldWoffset+%
;evuelve la longitud del campo especificado
mys(l3)ree3result
int mysqlWfreeWresult)int result+%
7(lo deber/a ser utilizada si la cantidad de memoria utilizada para almacenar el resultado de una consulta es muy
grande. 2uando se e>ecuta esta funci(n, toda la memoria asociada al resultado se libera.
mys(l3insert3id
int mysqlWinsertWid)void+%
#sta funci(n devuelve el 9; )identificador+ generado para los campos autonum3ricos ),U6=W952-#:#56#;+.
#l 9; devuelto es el correspondiente al de la 0ltima operaci(n 957#-6.
mys(l3list3)ields
int mysqlWlistWfields)string database, string tablename+%
;evuelve informaci(n sobre la tabla. #l valor resultante puede ser utilizado con mysqlWfieldWflags)+,
mysqlWfieldWlen)+, mysqlWfieldWname)+, and mysqlWfieldWtype)+.
#l identificador que devuelve es un entero positivo o XSHX en caso de error. #l te'to que describe el error se
encuentra en phperrmsg.
mys(l3list3d!s
int mysqlWlistdbs)void+%
;evuelve un puntero que contiene las bases de datos disponibles para el servidor actual )msql daemon+. #ste valor
se utiliza con la funci(n mysqlWdbname) +.
mys(l3list3ta!les
int mysqlWlistWtables)string database, , int LlinFWidentifierM+%
;evuelve un identificar, el cual pasaremos a la funci(n mysqlWtablename para e'traer el nombre de las tablas de la
base de datos especificada.
mys(l3num3)ields
int mysqlWnumWfields)int result+%
mysqlWnumWfields devuelve en n0mero de campos de una consulta.
8er tambi3n? mysqlWdbWquery, mysqlWquery, mysqlWfetchWfield, mysqlWnumWro1s.
mys(l3num3roLs
int mysqlWnumWro1s)string result+%
;evuelve el n0mero de filas del resultado de una consulta.
8er tambi3n? mysqlWdbWquery, mysqlWquery and, mysqlWfetchWro1.query, mysqlWquery and, mysqlWfetchWro1.
mys(l3pconnect
int mysqlWpconnect)string LhostnameM , string LusernameM , string Lpass1ordM +%
;evuelve? , positive :y7Z. persistent linF identifier on success, or false on error
;evuelve un identificador de cone'i(n persistente o XfalseX en caso de error. .as diferencias con respecto a
mysqlWconnect) + son?
Primero9 la funciEn intenta encontrar una cone2iEn persistente Bue (a est abierta con la misma mCBuina9 usuario ( pass5ordA 'i es
encontrada9 devuelve el identificador de la misma9 en lugar de crear una nueva cone2iEnA
27
'egundo9 la cone2iEn al servidor 'G1 no serC cerrada cuando finalice la e%ecuciEn del script9 sino Bue permanece abierta para un uso
posteriorA
.a funci(n mysqlWclose no cierra una conecci(n abierta con mysqlWpconnect. .as conecciones abierta con esta
funci(n se llaman "persistentes".
mys(l3(uery
int mysqlWquery)string query, int LlinFWidentifierM +%
#>ecuta una consulta a la base de datos activa en el servidor asociado al identificador de cone'i(n. 7i no se
especifica, se utiliza la 0ltima cone'i(n abierta.fica, se utiliza la 0ltima cone'i(n abierta. 7i no hay cone'iones
abiertas la funci(n intenta establecer una.
#sta funci(n devuelve 6-U# o 4,.7# para indicar si las operaciones UP;,6#, 957#-6 o ;#.#6# han tenido
3'ito. Para la operaci(n 7#.#26 devuelve un nuevo identificador de resultado.
8er tambi3n? mysqlWdbWquery, mysqlWselectWdb, and mysqlWconnect.
mys(l3result
int mysqlWresult)int result, int ro1, mi'ed field+%
;evuelve el contenido de la celda de un resultado. #l argumento XfieldX puede ser un /ndice o el nombre del campo
correspondiente o el nombre del campo de la forma? tabla.campo. 7i la columna tiene un alias )Xselect foo as bar
from...X+ se utiliza el alias en lugar del nombre de la columna.
#n lugar de esta funci(n es preferible usar mysqlWfetchWro1)+, mysqlWfetchWarray)+, and mysqlWfetchWob>ect)+, con
la que obtendremos me>or rendimiento.
mys(l3select3d!
int mysqlWselectWdb)string databaseWname, int LlinFWidentifierM +%
;evuelve? true on success, false on error
#stablece la base de datos activa en el servidor. 7i no se especifica identificador de cone'i(n se utiliza la 0ltima
cone'i(n abierta. 7i no hay cone'iones ane'i(n abierta. 7i no hay cone'iones activas, la funci(n intenta establecer
una. , partir de la llamada a mysqlWselectWdb las llamadas a mysqlWquery) + act0an sobre la nueva base de datos
activa.
8er tambi3n? mysqlWconnect, mysqlWpconnect, and mysqlWquery
mys(l3ta!lename
string mysqlWtablename)int result, int i+%
6oma como argumento un puntero devuelto por la funci(n mysqlWlistWtables) + y devuelve el nombre de la tabla
asociada al indice i. .a funci(n mysqlWnumWro1s) + puede ser utilizada para determinar el n0mero de tablas.
<?php
mysqlWconnect )"localhost?KK@P"+%
result ! mysqlWlisttables )"basededatos"+%
i ! @%
1hile )i < mysqlWnumWro1s )result++ A
tbWnamesLiM ! mysqlWtablename )result, i+%
echo tbWnamesLiM . "<D->"%
iJJ%
B
?>
2onectar a :y7Z. desde PHP
2onectar a :y7Z. desde PHP
[a tenemos datos en nuestra Dase de ;atos )D;+, as/ que con el siguiente script nos conectaremos a la D; del
servidor MySQL para obtener los datos de un registro.
2one'i(n a :y7Z.
<html>
<body>
<?php
linFp>
<?php
28
linF ! mysqlWconnect)"localhost", "nobody"+%
mysqlWselectWdb)"mydb", linF+%
result ! mysqlWquery)"7#.#26 Y 4-=: agenda", linF+%
echo "5ombre? ".mysqlWresult)result, @, "nombre"+."<br>"%
echo ";irecci(n? ".mysqlWresult)result, @, "direccion"+."<br>"%
echo "6el3fono ?".mysqlWresult)result, @, "telefono"+."<br>"%
echo "#S:ail ?".mysqlWresult)result, @, "email"+."<br>"%
?>
<&body>
<&html>
#n la primera l/nea del script nos encontramos con la funci(n mys7%_connect23, que abre una cone'i(n con el
servidor :y7Z. en el Host especificado )en este caso la misma m<quina en la que est< alo>ada el servidor
:y7Z., localhost+. 6ambi3n debemos especificar un usuario )nobody, root, etc. +, y si fuera necesario un
pass1ord para el usuario indicado 2mys7%_connect2%oca%host@ root@
c%ave_de%_root33. 7i la cone'i(n ha tenido 3'ito, la funci(n mys7%_connect23 devuelve un
identificar de dicha cone'i(n )un n0mero+ que es almacenado en la variable $%inK, sino ha tenido 3'ito,
devuelve 9 )4,.7#+.
2on mys7%_se%ect_d"23 PHP le dice al servidor que en la cone'i(n $%inK nos queremos conectar a la base
de datos myd". Podr/amos establecer distintas cone'iones a la D; en diferentes servidores, pero nos
conformaremos con una.
.a siguiente funci(n mys7%_7'ery23, es la que hace el traba>o duro, usando el identificador de la cone'i(n
)$%inK+, env/a una instrucci(n 7Z. al servidor :y7Z. para que 3ste la procese. #l resultado de 3sta operaci(n es
almacenado en la variable $res'%t.
4inalmente, mys7%_res'%t23 es usado para mostrar los valores de los campos devueltos por la consulta
)$res'%t+. #n este e>emplo mostramos los valores del registro @, que es el primer registro @, que es el primer
registro, y mostramos el valor de los campos especificados.
2reaci(n de una Dase de ;atos en :y7Z.
,ntes de seguir con PHP, vamos a preparar la base de datos )D;+ que vamos a utilizar como e>emplo. 2omo
servidor de D;, usaremos MySQL un pequeRo y compacto servidor de D;, ideal para pequeRas y medianas
aplicaciones. MySQL soporta el est<ndar SQL ),579+, y adem<s est< disponible para distintas plataformas,
incluido las "1indo1s"disponible para distintas plataformas, incluido las "1indo1s".
Una vez instalado MySQL, vamos a crear nuestra D; e>emplo. MySQL utiliza una tabla de permisos de usuarios,
por defecto, en la instalaci(n crea el usuario root sin pass1ord. ;ebes crear distintos usuarios con distintos
permisos. #ntre ellos, el usuario administrador de MySQL, con todos los permisos, y como recomendaci(n de
seguridad, el usuario no!ody s(lo con el permiso de consultar )A?B?<=+, que es el que utilizaremos para
conectarnos al servidor de D; en nuestros script.
8amos a ver dos formas de crear una base de datos y sus tablas. Para ello vamos a crear la base de datos que nos
servir< de e>emplo en capitulos siguientes?

7. Linea de comandos
Para crear nuestra base de datos en sistemas .inu'&Uni', debemos ser el administrador de MySQL o tener el
permiso pertinente para crear bases de datos, para ello haremos lo siguiente?
mysqladmin create mydb
[a hemos creado una D;, ahora le aRadiremos una tabla y algunos registros, para lo cual copia el siguiente te'to y
s<lvalo en un archivo, que podr/amos llamar myd!.dump.
Crear ta!la my!d
2-#,6# 6,D.# agenda )id 956 5=6 5U.. ,U6=W952-#:#56, nombre 2H,-)I@+,direccion 2H,-)H@@+,
telefono 2H,-)HI+, email 2H,-)I@+, E#[ )id+ +$g
957#-6 956= agenda 8,.U#7 )@, XGuan P3rezX, X2& .aguna, HI. 7evillaX, XVI.*II.II.IIX, X>uan]agenda.comX +$g
957#-6 956= agenda 8,.U#7 )H, X.uis `arc/aX, X2& Detis, NN. 2<dizX, XVI.PII.PP.KKX, Xluis]agenda.comX +$g
29
957#-6 956= agenda 8,.U#7 )N, X2arlos -odr/guezX, X2& 7evilla, P. HuelvaX, XVI.HHK.NN.UUX,
Xcarlos]agenda.comX +$g
;ebemos tener en cuenta que los comandos de arriba debe escribirse cada uno en una sola l/nea. 7e han separado
para aumentar la legibilidad del c(digo.
,hora desde la l/nea de comandos e>ecuta?
cat mydb.dump a mysql mydb
2abe destacar el campo id, que no puede estar vac/o, y adem<s es autoincrementable, lo cu<l deberemos tener en
cuenta a la hora de actualizar y aRadir registros. 7i no hemos cometido ning0n error, ya tenemos nuestra base de
datos de e>emplo en el servidor MySQL.
M#S$%A

N. Script
Una seguna forma de crear las bases de datos y tablas es utilizar las funciones que para ello nos da PHP. Para crear
una base de datos tenemos dos opciones, una utilizar la funci(n mys7%_create_d"23, o bien enviado una
consulta 7Z. con la intrucci(n "</?*=? ,*=*D*A? myd"". 2omo e>emplo vamos a crear un script
crear3my.php que crear< la anterio base de datos.
<html>
<body>
<?PHP
define )"2=576,56#", "Hola :undo"+%
printf )2=576,56#+%
?>
<&body>
<&html>
basedatos ! "mydb"%
&&conectamos con el servidor
linF ! ]mysqlWconnect)"localhost", "root", ""+%

&& comprobamos que hemos estabecido cone'i(n en el servidor
if )\ linF+A
echo "<hN align!XcenterX>#--=-? 9mposible establecer conecci(n con el servidor<&hN>"%
e'it%
B
&& obtenemos una lista de las bases de datos del servidor
db ! mysqlWlistWdbs)+%

&& vemos cuantas D; hay
numWbd ! mysqlWnumWro1s)db+%

&&comprobamos si la D; que quermos crear e'ite ya
e'iste ! "5=" %
for )i!@% i<numWbd% iJJ+ A
if )mysqlWdbname)db, i+ !! basedatos+ A
e'iste ! "79" %
breaF%
B
B

&& si no e'iste la creamos
if )e'iste !! "5="+ A
&Y manera H Y&
30
if )\ mysqlWcreateWdb)basedatos, linF++ A
echo "<hN align!XcenterX>#--=- H? 9mposible crear base de datos<&hN>"%
e'it%
B
&Y class!"codigo" style!"marginSleft? I@"> &Y manera N
if )\ mysqlWquery)"2-#,6# ;,6,D,7# basedatos", linF++A
echo "<hN align!XcenterX>#--=-N? 9mposible crear base de datos<&hN>"%
e'it%
B Y&
B

&& craamos la tabla
sql ! "2-#,6# 6,D.# agenda )"%
sql .! "id 956 5=6 5U.. ,U6=W952-#:#56, "%
sql .! "nombre 2H,-)I@+, "%
sql .! "direccion 2H,-)H@@+, "%
sql .! "telefono 2H,-)HI+, "%
sql .! "email 2H,-)I@+, "%
sql .! "E#[ )id+ + "%

if )]mysqlWdbWquery)basedatos, sql, linF++ A
echo "<hN align!XcenterX>.a tabla se ha creado con 3'ito<&hN>"%
B else A
echo "<hN align!XcenterX>5o se ha podido crear la tabla<&hN>"%
B

?>

<&body>
<&html>
:ostrar los datos de una consulta
,hora que ya sabemos conectar con el servidor de D;, veremos como mostrar los datos por pantalla.
2onsulta de la D;
<html>
<body>
<?php
linF ! mysqlWconnect)"localhost", "nobody"odigo">linF ! mysqlWconnect)"localhost", "nobody"+%
mysqlWselectWdb)"mydb", linF+%
result ! mysqlWquery)"7#.#26 nombre, email 4-=: agenda", linF+%
echo "<table border ! XHX> $n"%
echo "<tr> $n"%
echo "<td><b>5ombre<&b><&td> $n"%
echo "<td><b>#S:ail<&b><&td> $n"%
echo "<&tr> $n"%
1hile )ro1 ! mysqlWfetchWro1)result++A
echo "<tr> $n"%
echo "<td>ro1L@M<&td> $n"%
echo "<td>ro1LHM<&td> $n"%
echo "<&tr> $n"%
B
echo "<&table> $n"%
31
?>
<&body>
<&html>
#n este script hemos introducido dos novedades, la m<s obvia es la sentencia de control 4hi%e23@ 7'e tiene
'n f'ncionamiento simi%ar a% de otros %en6'aLes@ eLec'ta 'na cosa mientras %a
condici8n sea verdadera. ?n esta ocasi8n 4hi%e23 eva%Ma %a f'nci8n
mys7%_fetch_ro423@ 7'e dev'e%ve 'n array con e% contenido de% re6istro act'a%
27'e se a%macena en $ro43 y avanIa 'na posici8n en %a %ista de re6istros
dev'e%tos en %a cons'%ta ANB.
La )uncin mys7%_fetch_ro423 tiene un pe(ueBo pro!lema' es (ue el array (ue de&uel&e slo admite
re)erencias num:ricas a los campos o!tenidos de la consulta. El primer campo re)erenciado es el 9' el
segundo el 7 y as@ sucesi&amente. En el siguiente script solucionaremos este pe(ueBo incon&eniente.
Consulta modi)icada de D>
*html+
*!ody+
*,php
=linF < mys(l3connect-"localhost"' "no!ody;ost"' "no!ody"01
mys(l3select3d!-"myd!"' =linF01
=result < mys(l3(uery-"SELEC$ nom!re' email 84.M agenda"' =linF01
i) -=roL < mys(l3)etch3array-=result00P
echo "*ta!le !order < T7T+ Qn"1
echo "*tr+ Qn"1
echo "*td+*!+/om!re*2!+*2td+ Qn"1
echo "*td+*!+EJMail*2!+*2td+ Qn"1
echo "*2tr+ Qn"1
do P
echo "*tr+ Qn"1
echo "*td+".=roLW"nom!re"X."*2td+ Qn"1
echo "*td+".=roLW"email"X."*2td+Qn"1
echo "*2tr+ Qn"1
R Lhile -=roL < mys(l3)etch3array-=result001
echo "*2ta!le+ style<"marginJle)t# H9"+echo "*2ta!le+ Qn"1
R else P
echo "Y La !ase de datos estA &acia S"1
R
,+
*2!ody+
*2html+
Esencialmente' este script hace lo mismo (ue el anterior. Almacenamos en $ro4 el registro actual con la
)uncin mys7%_fetch_array23 (ue hace e"actamente lo mismo (ue mys7%_fetch_ro423' con la
e"cepcin (ue podemos re)erenciar a los campos por su nom!re -$ro4Oemai%P0' en &e% de por un
n?mero.
Con la sentencia if/e%se' asignamos a =roL el primer registro de la consulta' y en caso de no ha!er
ninguno -e%se0 mostramos un mensaje -"/o se ha encontrado..."0. Mientras (ue con la sentencia
do/4hi%e' nos aseguramos (ue se nos muestren todos los registros de&ueltos por la consulta en caso de
ha!er mAs de uno.
Hay (ue destacar la utili%acin del punto -.0' como operador para concatenar cadenas.
Un buscador para nuestra base de datos
8amos a ver una aplicaci(n, un e>emplo, de todo lo visto hasta ahora. #scribiremos un script que sirva para buscar
una determinada cadena )que recibiremos de un formulario, y la almacenamos en la variable $"'scar+, dentro de
nuestra base de datos, concretamente dentro del campo "nombre".
32
ca&po HnombreHA
#n primer lugar escribiremos el te'to H6:. de la p<gina 1eb que nos servir< como formulario de entrada, la
llamaremos formulario.htm.
4ormulario entrada
<html>
<body>
<form method ! "P=76" action ! "http?&&mysevidor&php&buscador.phpK">
<strong>Palabra clave?<&strong>
<input type!"te't" name!"buscar" size!"N@"><br><br>
<input type!"submit" value!"Duscar">
<&form>
<&body>
<&html>
#l siguiente script de busqueda lo llamaremos !uscador.phpI, y ser< el encargado de hacer la b0squeda en la D;,
y devolver por pantalla los registros encontrados.
7cript b0squeda
<html>
<body>
<?php
if )\isset)buscar++A
echo ";ebe especificar una cadena a buscar"%
echo Tquo
echo "<p>;ebe especificar una cadena a buscar<&p> $n"%
echo "<p><a href!buscadorWbd.htm>8olver<&p> $n"%
echo "<&html><&body> $n"%
e'it%
B
linF ! mysqlWconnect)"localhost", "nobody"+%
mysqlWselectWdb)"mydb", linF+%
sql ! "7#.#26 Y 4-=: agenda CH#-# nombre .9E# XbbuscarbX =-;#- D[ nombre"%
result ! mysqlWquery)sql, linF+%
if )ro1 ! mysqlWfetchWarray)result++A
echo "<table border ! XHX> $n"%
&&:ostramos los nombres de las tablas
echo "<tr> $ndigo" style!"marginSleft? I@">echo "<tr> $n"%
mysqlWfieldWseeF)result,@+%
1hile )field ! mysqlWfetchWfield)result++A
echo "<td><b>fieldS>name<&b><&td> $n"%
B
echo "<&tr> $n"%
do A
echo "<tr> $n"%
echo "<td>".ro1L"id"M."<&td> $n"%
echo "<td>".ro1L"nombre"M."<&td> $n"%
echo "<td>".ro1L"direccion"M."<&td> $n"%
echo "<td>".ro1L"telefono"M."<&td> $n"%
echo "<td><a
href!Xmailto?"
href!Xmailto?".ro1L"email"M."X>".
ro1L"email"M."<&a><&td> $n"%
echo "<&tr> $n"%
B 1hile )ro1 ! mysqlWfetchWarray)result++%
33
echo "<p><a href!buscadorWbd.htm>8olver<&p> $n"%
echo "<&table> $n"%
B else A
echo "<p>c5o se ha encontrado ning0n registro\<&p>$n"%
echo "<p><a href!buscadorWbd.htm>8olver<&p> $n"%
B
?>
<&body>
<&html>
.o primero que comprobamos es que el contenido de la variable $"'scar que recibimos del la p<gina 1eb
)ormulario.htm no es una cadena vacia, y esto lo hacemos con la funci(n isset23 que devuelve X)alsoX si la
variable que recibe est< vacia. , la funci(n le anteponemos el signo admiracin ))+ que es equivalente a un +.=,
para convertirlo en X&erdaderoX en caso de que la variable est3 vacia, y en es caso terminamos la e>ecuci(n del
script con e1it.
.o m<s importante de este script, es sin duda la sentencia 7Z. que le enviamos al servidor :y7Z., y m<s
concretamente la condici(n que le imponemos, Q$?/? nom"re B>R? (#$"'scar#(. 2on la sentencia
B>R? buscamos cualquier ocurrencia de la cadena contenida en $"'scar, mientras que con los signos de
porcenta>e )#+ indicamos el lugar de la coincidencia, por e>emplo, si hubiesemos puesto nom"re B>R? (#
$"'scar(, buscariamos cualquier ocurrencia al final del campo"nombre", mientras que si hubiesemos puesto
nom"re B>R? ($"'scar#(, buscariamos cualquier ocurrencia al principio del campo "nombre".
.as 0ltimas novedade que hemos incorporado, son las funci(nes mys7%_fetch_fie%d23, con el que
obtenemos informaci(n acerca de las caracter/ticas de cada campo, como su nombre, tipo, longitud, nombre de la
tabla que los contiene, etc. Pero para e>ecutar la funci(n anterior debemos colocar el puntero en el primer campo, y
eso lo logramos con la funci(n mys7%_fie%d_seeK23, la c<l mueve el puntero interno a la posici(n indicada.
,Radir registros
#n esta lecci(n vamos ver como podemos aRadir nuevos registros a nuesta D;. .a recogida de datos la vamos a
hacer a traves de un interfaz de 1eb. #n primer lugar vamos a crear una p<gina 1eb con un simple formulario, con
los campos que deseamos.
4ormulario inicial aRadir D;
<html>
<body>
<form method!"poodigo"><body>
<form method!"post" action!"addWreg.phpK">
5ombre ?<input type!"6e't" name!"nombre"><br>
;irecci(n?<input type!"6e't" name!"direccion"><br>
6el3fono ?<input type!"6e't" name!"telefono"><br>
#Smail ?<input type!"6e't" name!"email"><br>
<input type!"7ubmit" name!"enviar" value!",ceptar informaci(n">
<&form>
<&body>
<&html>
Hemos creado un formulario donde recoger los datos, y una vez introducidos e>ecutamos un script llamado
add3reg.phpI, pues veamos como es este script.
aRadir registros
<html>
<body>
<?php
&& process form
linF ! mysqlWconnect)"localhost", "root"+%
mysqlWselectWdb)"mydb",db+%
34
sql ! "957#-6 956= agenda )nombre, direccion, telefono, em6 956= agenda )nombre, direccion, telefono,
email+ "%
sql .! "8,.U#7 )XnombreX, XdireccionX, XtelefonoX, XemailX+"%
result ! mysqlWquery)sql+%
echo "c`racias\ Hemos recibido sus datos.$n"%
<&body>
<&html>
2omo se puede ver, para introducir un nuevo registro, utilizamos la ya conocida funci(n mys7%_7'ery23, la
c0al tambi3n usamos para las consultas, y usaremos para las actualizaciones, es decir una seRora funci(n. c,aah\,
una cosa muy importante, para poder aRadir o modificar registros debemos tener permiso para ello en el servidor
:y7Z., por eso en este caso me conecto como root, pero podr/a ser cualquier otro usuario.
Para terminar esta lecci(n, una pequeRa frivolidad, vamos a combinar la p<gina 1eb de formulario y el fichero de
script phpK, en un solo fichero que llamaremos add3reg.phpI )este script no lo comentar3, \algo tendran que hacer
ustedesco tendran que hacer ustedesc+.
2ombinacion de formulario y script
<html>
<body>
<?php
if )enviar+ A
&& process form
linF ! mysqlWconnect)"localhost", "root"+%
mysqlWselectWdb)"mydb",db+%
sql ! "957#-6 956= agenda )nombre, direccion, telefono, email+ "%
sql .! "8,.U#7 )XnombreX, XdireccionX, XtelefonoX, XemailX+"%
result ! mysqlWquery)sql+%
echo "c`racias\ Hemos recibido sus datos.$n"%
BelseA
?>
<form method!"post" action!"addWreg.phpK">
5ombre ?<input type!"6e't" name!"nombre"><br>
;irecci(n?<input type!"6e'tTquo>;irecci(n?<input type!"6e't" name!"direccion"><br>
6el3fono ?<input type!"6e't" name!"telefono"><br>
#Smail ?<input type!"6e't" name!"email"><br>
<input type!"7ubmit" name!"enviar" value!",ceptar informaci(n">
<&form>
<?php
B &&end if
?>
<&body>
<&html>
:odificar registros en :y7Z.
Primero, para modificar hay que tener permiso para ello en el servidor de D;, el resto nos viene de corrido.
Primero seleccionamos el registro que deseamos modificar, y luego, mandamos una consulta con la
modificaciones, o ambas cosas a la vez. 7uponemos que las modificaciones las recogemos de un formulario como
el de la lecci(n anterior .
:odificar registros opcion A
<html>
<body>
<?php
if )isset)id++A
&& process form
35
linF ! mysqlWconnect)"localhost", "root"+%
mysqlWselectWdb)"mydb",db+%
sql ! "7#.#26 Y 4-=: agenda CH#-# id ! id"
result ! mysqlWquery)sql+%
sql ! "UP;,6# agenda 7#6 nombre!XnombreX,
direccion!XdireccionX, telefono!XtelefonoX, email!XemailX"%
result ! mysqlWquery)sql+%
BelseA
echo ";ebe especificar un XidX.$n"%
B
<&body>
<&html>
= bien, :odificar registros opcion D
<html>
<body>
<?php
if )icodigo"><?php
if )isset)id++A
&& process form
linF ! mysqlWconnect)"localhost", "root"+%
mysqlWselectWdb)"mydb",db+%
sql ! "UP;,6# agenda 7#6 nombre!XnombreX, direccion!XdireccionX, "%
sql .! "telefono!XtelefonoX, email!XemailX CH#-# id!id"%
result ! mysqlWquery)sql+%
BelseA
echo ";ebe especificar un XidX.$n"%
B
?>
<&body>
<&html>
Dorrar registros
#l proceso de borrar un registro es identico al de modificar, solo que en vez de utilizar E9,*=? utilizamos
,?B?=? en la sentenica SQL. Por tanto el script quedar/a como sigue.
Dorrado registros de D;
<html>
<body>
<?php
<body>
<?php
if )isset)id++A
&& process form
linF ! mysqlWconnect)"localhost", "root"+%
mysqlWselectWdb)"mydb",db+%
sql ! ";#.#6# 4-=: agenda CH#-# id!id"+
result ! mysqlWquery)sql+%
BelseA
echo ";ebe especificar un XidX.$n"%
B
?>
<&body>
<&html>
36
6odo a la vez
2omo resuemen de todo lo visto hasta ahora, vamos a hacer un script donde se mezcla todo, y algo nuevo. 2omo
e>ercico, os de>o que la incorporaci(n del buscador de la lecci(n I.
<html>
<body>
<?php
linF ! mysqlWconnect)"localhost", "root"+%
mysqlWselectWdb)"mydb",linF+% &&2omprobamos si hemos recibido datos del formulario )enviar+
if )enviar+ A
&& 7i recibimos un id, modificamos, sino aRadimos un registro
if )id+ A
sql ! "UP;,6# agenda 7#6 nombre!XnombreX, direccion!XdireccionX"%
sql.! "telefono!XtelefonoX, email!XemailX CH#-# id!id"%
echo "-egistro ,ctualizado<p>"%
B else A
sql ! "957#-6 956= agenda )nombre, direccion, telefono, email+ "%
sql .! "8,.U#7 )XnombreX, XdireccionX, XtelefonoX, XemailX+"%
echo "-egistro ,Radido<p>"%
B
&& #nviamos la sentencia 7Z. al servidor ;D
result ! mysqlWquery)sql+%
B elseif )delete+ A
&& Dorramos un registro
sql ! ";#.#6# 4-=: agenda CH#-# id!id"%
result ! mysqlWquery)sql+%
echo "-egistro Dorrado<p>"%
B else A
&Y #sta parte se e>ecuta si no hemos
presionado el boton enviar, es decir no venimos
de un formulario Y&
if )\id+ A
&& :ostramos todos los registros de nuestra D;
result ! mysqlWquery)"7#.#26 Y 4-=: agenda",linF+ot%7#.#26 Y 4-=: agenda",linF+%
1hile )myro1 ! mysqlWfetchWarray)result++ A
echo myro1L"nombre"M." S ".myro1L"direccion"M." S ".myro1L"6elefono"M." S ".myro1L"email"M%
echo "<a href!$PHPW7#.4?id!".myro1L"id"M."Tdelete!yes">Dorrar<&a>"%
echo " S "%
echo "<a href!$PHPW7#.4?id!".myro1L"id"M.">:odificar<&a><br>"%
B
B
?>
<p><a href!"<?php echo PHPW7#.4?>">,Radir un registro<&a><&p>
<p><form method!"post" action!"<?php echo PHPW7#.4?>"><&p>
<?php
if )id+ A
&& editamos el registro seleccionado
sql ! "7#.#26 Y 4-=: agenda CH#-# id!id"%
result ! mysqlWquery)sql+%
myro1 ! mysqlWfetchWarray)result+%
id ! myro1L"id"M%
nombre ! myro1L"nombre"M%
37
direccion ! myro1L"direccion"M%
telefono ! myro1L"telefono"M%
email ! myro1L"email"M%
&& enviamos el id para poder editar el registro
echo "<input type!hidden name!"id" value!id>"%
B
?>
5ombre?<input type!"6e't" name!"nombre" value!"<?php echo nombre ?>"><br>
;irecci(n?<input type!"6e't" name!"direccion" value!"<?php echo direccion ?>"><br>
6elefono?<input type!"6e't" name!"telefono" value!"<?php echo telefono ?>"><br>
#mail?<input type!"6e't" name!"email" value!"<?php echo email ?>"><br>
<input type!"7ubmit" name!"enivar" value!"#nviar 9nformaci(n">
<&form>
<?php
B && #nd 9f if )enviar+
?><&body><&html>
2abe destacar el uso de $9$9_A?B:, esta es una funcion interna de PHP que nos devuelve la direcci(n del script
en el que se e>ecuta.
38

You might also like