Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Los secretas de
PHP y MYSQ./.;
------r-----
r,-=--'":.- - "F
.......
Bases de datos
SQL, MySQL
I_ Gestin de bases .de datos con phpMyAdrnin
Prctica
Crea un lburn de fotos y
un rnini CMS
-----
Nmero 30--,-tos secretos de PHP y MYSQL 5,00 EUR
2 PC Cuadernos
n
Secretos t
s
de impressions
a
PHP y intercomarcals,
S.A. San! Fruits
MySQL de Bages,
Barcelona
Johann-Christian Distribucin
Hanke quioscos:
C
Copyright: o
KnowWare EURL e
d
Traduccin: Victria
i
Mengual PC s
Cuadernos - Bsicos
S
www.pc- .
cuadernos.com
L
Sociedad .
editora: Avda. de
KnowWare Barcelon
a, 225
E.U.R.L.
M
70, rue
o
Georges Villette l
F-77250 i
n
Ecuelles s
Francia
Director: Mikkel d
e
Franck
Direccin R
e
electrnica: i
info@pc-
B
cuadernos.com
a
Depsito legal: B- r
22770-2006 c
ISBN: 2- e
915605-46-7 l
o
Im n
pr a
en
ta: Vent
a
l por
m nm
p eros
ri :
Despus de su aparicin, los nmeros Con "Secretos de PHP y MySQL",
de esta coleccin pueden pedirse por Johann- Christian Hanke nos trae la
correo. continuacin del cuaderno "PHP 5"
(Consulta la pgina 77) publicado anteriormente. En este
nuevo ttulo, el autor va ms all en
sus explicaciones y explora el
verdadero po- tencial del lenguaje
PHP cuando se utiliza
en combinacin con bases de datos.
Bienvenido al mundo
de los sitios web dinmicos
En este cuaderno seguiremos profundizando en Aprenders SQL, el lenguaje para crear, mante
PHP. Por fin est aqu la esperada segunda parte ner y consultar tablas de bases de datos. Con
de mi cuaderno titulado "PHP 5". A todos y to ayuda de una libreta de direcciones, te mostrar
das, bienvenidos, y me alegro de que este tema cmo:
siga despertando vuestra curiosidad e inters.
Crear tablas de una base de datos
Introducir datos
De qu trata el cuaderno? Presentar las filas deseadas
Incluir comandos SQL en PHP
Como no poda ser de otra forma, este cuaderno Y la prctica? En este caso he pensado que te
trata sobre PHP y MySQL. Te sonar a mucha gustara un libro de visitas realmente cmodo:
prctica, y de eso se trata precisamente. Pero con campo para incluir una fotografa, bloqueo
como siempre, antes de la prctica dte ofrecer contra reload y presentacin de los datos por
una racin de teora.
pginas. Tambin se puede utilizar como siste
ma de gestin de contenidos, weblog o fotoblog.
Tcnicas avanzadas de PHP
En la primera parte del cuaderno, hablaremos de Como calentamiento te presentar un pequeo
determinadas tcnicas de programacin avan "script de cumpleaos" que enviar automti
zadas. Entre otras cosas, veremos: camente a todos tus contactos una felicitacin
electrnica por su cumpleaos.
Nueva sintaxis desde PHP 4.2
Cmo escribir tus propias funciones Los lmites del cuaderno
Separacin de mdulos medante include() ... se encuentran en el diseo de bases de datos
Mtodos para que el cdigo sea ms legible relacionales, es decir, la vinculacin de varias ta
blas para hacer que el almacenamiento de datos
Naturalmente, probaremos tambin todas es sea ms efectivo. Hablaremos de ello por encima
tas novedades en la prctica: cargaremos ar de forma muy didctica y comprensible.
chivos desde un formulario y los guardare
mos en una pgina web. Adems, tambin Despus te remitir a otra autora, Petra Bilke. El
aprenders las distintas funciones partiendo motivo es que Petra ofrece en su cuaderno sobre
de ejemplos sencillos. "PHP y MySQL", publicado anteriormente, una
introduccin detallada a esta materia, y repetir
lo mismo sera como llevar lea al monte.
Despus de ocuparnos de esto, iremos al grano.
Nos pondremos con el tan esperado ...
Sobre el autor
Curso sobre MySQL y SQL No soy ningn programador genial, sino auto
didacta. Sin embargo, la programacin es mi afi-
Hablaremos de cmo configurar y utilizar
cin, a la que he dedicado muchas, muchas no
MySQL en tu proveedor de hosting, y cmo ma
ches y fines de semana. Puedes encontrar un
nejar bases de datos (o base de datos, ya que al
gunos proveedores solamente permiten usar
ejemplo en la pgina alemana www.phpkid.de. la
primera que logr crear controlada exclusiva
una).
mente con bases de datos.
Aprenders a utilizar la interfaz grfica de En la "concepcin" de este portal aprend mu
phpMyAdmin. chsimo, y estoy orgulloso de poder transmitir
los conocimientos adquiridos.
Y le seguirn los ejemplos. Pero antes de poner Te deseo todo el xito del mundo con "Secretos
nos con el primer ejemplo prctico de base de de PHP y MySQL".
datos, tambin es necesario un poco de teora.
4 Bienvenido al mundo de los sitios web dinmicos
JohannChristian Hanke
dePHP
La nueva sintaxis de PHP 5
/.
6 La nueva sintaxis de PHP
globales. No importa si utilizas la versin PHP No importaba si el formulario se enviaba por
4.x o PHP 5.x. method= "post" o met.hode "get Incluso era po
11
if ( $login) {
echo "<p>Aqui empieza el rea secreta.</p>11;
La nueva sintaxis de PHP 7
?>
</body>
</html>
'TZ" I . f;
if ($pass == "abc_xyz_12311)
, r 11,;.
$login= true;
1:... r
Desafortunadamente, no he inicializado la va l. En primer lugar, comprueba dnde se en
riable con false desde el principio. Por causa de cuentra php.ini, XAMPP no utiliza la ruta
esta pequeo descuido en el cdigo es posible
que cualquiera que no conozca la contrasea vea C:\ Windows, sino una ruta de acceso propia.
lo que no debera ver. Cmo?
Slo tendra que agregar ?login=true o ?login=1 a
la URL. Porque 1 significa true. En ese caso, la
php.ini
variable $login pasara a ser true y se abrira la
"puerta" al rea secreta. 2. XAMPP suede utilizar, por ejemplo,
C:\xampp(lite)\apache\bin\php.ini. Detn el
----
Prubalo: abre el archivo inseguro.php escribien servicio XAMPP y abre el archivo php.ini.
do: inseguro.php?loginml!
.. . . .
E ii:J c>;a ..-- -?
3. Busca la lnea register_globals = On (no tiene
que tener un punto y coma delante, ya que
punto y coma equivale a comentar el cdi
login=11 go).
Agujero de seguridad en register_globals = On 4. Sustituye On por Off y guarda el archivo ini.
5. Inicia otra vez XAMPP y comprueba la con
figuracin.
-
Podemos entrar sin saber la contrasea.
Prueba nuevamente el truco de login. Ya no fun-
ciona, de modo que hemos cerrado el agujero de
seguridad.
-
Con estas nuevas variables, desaparecen las
antiguas denominaciones de arrays previas a
la versin PHP 4.1:
>Al;<1j.eii,11 de t:"l.d.ad <!la ,:.eql.u-i,_qlc)bals - 0&</11.2>
<rcl'JJ "'QtLOJI,'""'/_.Php2/1cGUrCl2 .pllp MtM<l"'"'pollt."'>
$HTIP_POST_VARS Ci:nti,:c.,..l1 <1apai: -Pworo .--HJr"'>
<t.ispoi:: r:vP,$-t v.Al.G6-?n.v1ar">
$HTIP_GET_VARS ,,.....,.
<Ita no
,C:/htlll>
$HTTP_COOI<IE_VARS
Acostmbrate a usar $_POST, $_GET y El servidor web siempre enva un archivo HTML al
$_COOI<IE! navegador; en vano buscars los comandos de PHP.
Qu diferencia puedes observar?
Tambin son nuevas las variables de arrays
$_SERVER, $_ENV y $_SESSION. $_ENV es res Ejercicio 3: inicializar variables
ponsable de las variables de entorno y Arregla mis chapuzas del ejemplo "inseguro".
$_SESSION se encarga de la gestin de sesiones. Asegrate de que no quede ninguna puerta
Hablaremos de las sesiones en un futuro tercer abierta a los mirones, incluso aunque regis
cuaderno dedicado a PHP. ter_globals est activado. Encontrars la solucin
en el archivo inseguro3.php.
La variable $_SERVER
Sin duda, la ms interesante es la variable
$_SERVER, ya que contiene todas las variables
de servidor, es decir, todas las variables que
transmite el servidor web. El servidor transmite
Trucos de notacin 9
As es como aparece en muchos libros y como lo El truco para hacerlo ms fcil es:
encontrars en la mayora de scripts. Cmo es
posible que tantos autores (incluido un tal Sr. En lugar de comillas dobles, utiliza siempre
Hanke en el cuaderno "Introduccin a PHP") se comillas simples.
hayan complicado tanto la vida ...
Este sera el mismo cdigo fuente modificado:
echo <<<FORMULARIO
<form action="mail.php11 method="post">
<input t ypeevh .dden" narne e vNa i.L'' value:::11{$_POST[1Mail1]}">
1
<input t ypeevhd.dden" name="mensaje" value= 11 {$_POST ['mensaje ]} u>
FORMULARIO;
FORMULARIO;
Observa que la palabra termina con un punto y En lugar de utilizar la instruccin echo, po
coma; en este caso es necesario escribirlo sin es
demos almacenar la string de la instruccin
pacio en blanco para cerrar correctamente el rea
heredoc en una variable. En ese caso, en lugar
heredoc.
de:
Naturalmente, podras utilizar cualquier otra
echo <<<FORMULARIO
denominacin ms corta o sencilla para FOR
MULARIO. Sin embargo, no debers utilizar es escribiramos
pacios en blanco ni caracteres especiales, ni
$variable= <<<FORMULARIO
acentos ni nmeros al principio. Asegrate de
que esta palabra clave especial no aparezca en
ningn otro punto del cdigo fuente.
Identificar todos los errores
Con la palabara heredoc se abrevia el pasaje
"here document", que en espaol sera: aqu Es bueno saber que PHP nos avisa cuando hay
empieza el documento. Dentro del par here un error en el cdigo. Pero sabas que de forma
doc se puede escribir cdigo H1ML conven predeterminada PHP slo muestra determina
cional, sin ms complicacin. dos errores? Siempre se muestran las adverten
cias y errores fatales, pero los avisos sencillos
(notice) no se ven. He aqu un ejemplo de un
aviso sobre una variable no definida:
Notice: Undeflned variable: db In
C:\xampplite\htdocs\inde,c.php en llne 120
Warning mysql_close(): supplled argument ls nota va.lid MySQL-
Llnk resource In C:\,campplite\htdocs\lnde,c.php on llne 120 j
Un aviso (notice) tambin proporciona informacin
interesante.
12 Trucos de notacin
$login = true;
if ($login) {
echo 11<p>Aqui empieza el rea secreta</p>";
?,
Sin embargo, este ejemplo todava presenta dos En la mayora de proveedores de alojamiento
"agujeros de seguridad": existe una de estas carpetas no accesibles al
La contrasea se puede leer directamente en pblico, y se llama cgibin. Comprueba si tu
el cdigo del archivo PHP. proveedor de alojamiento ofrece una carpeta
El rea secreta tambin se encuentra en el cgbn y cul es su ubicacin exacta. Si no ex
propio archi YO PHP. iste, slo tienes que crearla directamente utl"
zando un programa FTP.
Y cul es el problema? Al fin y al cabo, el servi
dor web nunca muestra el cdigo PHP tal cual.
El usuario siempre recibe una pgina HTML Comprueba con un archivo HTML si los archi
"montada", en la que se ocultan todos los pasa vos almacenados en dicha carpeta estn real
jes secretos. mente protegidos:
<?php
$pw "abc_xyz_l23";
?>
Aqu no ocurre nada ms que la declaracin de En tu proveedor online puedes utilizar rutas que
la contrasea, en forma de variable $pw. partan de la carpeta raz:
Guarda este archivo en la carpeta cgibin. de tu /cgi-bin/password.inc.php
servidor. Normalmente, dicha carpeta (si existe) En mi prueba offline con XAMPP, no ha funcio
se encuentra directamente debajo de la raz. Para nado con este segundo mtodo.
probarlo offline, tambin tendrs que crear una
carpeta cgibin directamente dentro de la raz de En caso de dudas, lo mejor es volverlo a in
XAMPP (htdocs). tentar. Ajusta la ruta de acceso. Te dars cuen
ta enseguida cuando aparezcan mensajes de
Ruta al archivo include error.
Cul es la ruta de acceso al archivo include?
En mi ejemplo, el archivo inseguro se encuentra El siguiente paso es modificar el cdigo del ar
dentro de/_php2. Por tanto, primero debo subir chivo "inseguro". Vincula el archivo de la con
un nivel( .. ) y despus entrar en la carpeta cgi trasea y sustituye la contrasea por la variable
bin. La ruta de acceso completa es: $pw: funciona? Encontrars mi solucin en el
archivo inseguro4.php:
.. /cgi-bin/password.inc.php
<?php
$login= false;
include(11 /cgi-bin/password.inc.php11 );
if {isset($_POST[1pass1]) && $_POST[1pass] $pw) {
$login= true;
if {$login) {
echo 11<p>Aqu empieza el rea secreta</p>11;
Separar cdigo con include() 15
En Espaa, la mayora de productos que se El valor neto se calcula mediante una funcin
compran estn gravados con un impuesto so
Tambin es interesante la llamada a la funcin.
bre el valor aadido del 16%. Es decir, paga Ocurre en la lnea:
mos un 16% ms de lo que el producto cuesta
echo brutoANeto($_POST['numero']);
realmente.
Como argumento, transmito el valor del campo
Sin embargo, desde entonces ya no he cometido de entrada del formulario numero. La funcin
ms fallos en este tema. Es la oportunidad per torna el valor, calcula el resultado y lo devuelve
fecta para escribir una funcin que se encargue con echo.
de esta imporante conversin.
Validez de las variables en funciones
La funcin partir del valor bruto y calcular el Atencin: las variables que se declaran en una
valor neto, redondendolo dos decimales. (De funcin solamente son vlidas dentro de dicha
ello se encargar la funcin sprintf(), de la que funcin. As, la variable $zw es invisible para el
ya hablamos largo y tendido en el cuaderno an resto del script. Y lo mismo a la inversa: la fun
terior sobre PHP). Para terminar, la funcin de cin solamente puede acceder a los valores que
vuelve el valor modificado (convertido). se le transmiten como argumento.
function brutoANeto{$zw)
{ La funcin es una especie de contenedor ce
$zw = $zw / 1.16; rrado.
$zw = sprintf("%01.2f'', $zw);
return $zw; Las variables que utilizarnos fuera de la funcin
normalmente no sern visibles dentro de la fun
En el script, puedes guardar el resultado de la cin. Con una excepcin: con la palabra clave
funcin en una variable, o mostrarlo directamen global se convierte una variable en "variable glo
te con echo. Y eso mismo es precisamente lo que bal". Encontrars ms informacin en el manual
he hecho yo en el archivo del suplemento bruto oficial de PHP.
neto.php:
<h2>Convertir bruto a neto</h2>
<form action="<?php echo &
Ejercicios sobre funciones
$_SERVER("PHP_SELF"]; ?>" tJ
method="post"> A continuacin, te presento dos ejercicios sobre
<input t.ypeev t ext " nameevnume ro" funciones. En el ltimo ejemplo del cuaderno
<input type="submit" value=& aparecer una nueva funcin.
"Calcular">
</form> De neto a bruto
<?php Escribe una funcin propia que convierta el va
function brutoANeto($zw) lor neto en bruto. Llmala netoABruto. Inclyela
{ dentro de un documento de forma similar al
$zw = $zw / 1.16; ejemplo que hemos visto. Guarda el documento
$zw = sprintf("%01.2f'', $zw); como netobruto.php. Encontrars la solucin en el
return $zw;
archivo neiobruio.php,
echo brutoANeto($_POST['numero]);
Guardar una funcin de forma externa
?,
Guarda la funcin en un archivo externo y ll
malo function.inc.php. Vinclalo desde netobru
to.php. En este caso, no te dar la solucin.
18 lbum de fotos: carga de archivos
El usuario hace clic en Examinar y selecciona En la pgina siguiente presento el cdigo fuen
el archivo deseado desde su sistema Windows, te de carga.php, aunque por motivos de espacio
slo he copiado el rea comprendida entre
Linux o Mac. Al hacer clic en el botn Cargar
<body></body>.
archivo, el navegador carga el archivo en el
servidor web, y lo hace a travs de HTIP. No tengas miedo, analizaremos el cdigo paso
a paso. Por el camino aprenders varias fun
El proceso puede durar ms o menos en ciones nuevas que yo habr buscado y probado
funcin del tamao de archivo. Observa el previamente.
progreso en la barra de estado del navega Y hablando de funciones y bsquedas, ya has
dor. descargado la ltima versin del manual ofi
cial dePHP?
Una vez cargado el archivo, PHP se vuelve a
activar y comprobar que el archivo sea correc
to, pero esto se debe a la naturaleza del proce
so. PHP funciona sobre el servidor, no sobre el
cliente (cliente= tu PC).
lbum de fotos: carga de archivos 19
Consultar funciones en el manual de PHP Para la comprensin del cdigo fuente es muy
importante respetar la fantstica sintaxis
El manual de PHP constituye una fantstica PEAR, de la que tambin hablarnos en el cua
obra de consulta, sobre todo en lo que res derno anterior.
pecta a las funciones de PHP. Yo suelo traba Admira la belleza del cdigo siguiente, perfec
jar con este archivo de ayuda siempre abier tamente sangrado.
to. Si necesito una determinada funcin, me
dedico a hojear el manual hasta encontrar la
funcin adecuada o un script de muestra
que me pueda servir. Para ms informacin,
consulta el prrafo dedicado al manual en el
cuaderno anterior "PHP 5", o accede a
www.php.net/downls>ISl:d9GI php.
4 enctype=nmultipart/form-data">
5 <input type=ttfile" name=11archivo">
6 <input type="submit" name='submit' value="Cargar archivo">
7 </form>
8 <?php
9 $ruta = "img/"; / / Indicar ruta
10
11 if (isset($_FILES['archivo']) && $_FILES['archivo') ['size'] > O) {
12 $tamanyomax = 200000; // Indicar tamao en bytes
13 $nombretemp = $ FILES l arch .vo t l [ 'tmp_name'];
t
.. _ ........
_
e'""
:...-::=---- ..
j I <.. ...tf') "'
.
1
110... llll:=;
11!Jf l
.... *'"'"- -
-,l."""9Ql.<lffl'4U."""-
, ,-.. _.,
-9 _i jJ
111 ...... .
-- -
.
l ...._ ...... _ iil
. . .... .._
i m
-.-t.z:.io-,
- "'9QI. . ................
tJ fe'W\11 ,i.-.1
.,.._
.. .
. . _ . . . . ., .............. .. . _ .-
_ ., . . . . . . " "9 Ql.. . .
..
_ _
. _.... . . . , -
"" '5 'Q I .
........._..
phpMyAdmin, la interfaz grfica para MySQL
26 Interfaz grfica phpMyAdmin
Una vez creada la base de datos, slo necesita
phpMyAdmin en los distintos remos el nombre del host (hostname) y el nom
bre de usuario y la contrasea que hayamos de
proveedores finido.
Wfllbmt --..
OonMlnlollo,t:
PHP v-io..: 1 i.1.2 0 4.4,2
iJ
0.u.lM M-c'i--=--,, &tr
-r
tfMIIWHIIII: mytql dQlollllt(Ofl1 ,, "!MM, lf 4oW, ,,Mo 0M
O FutOOI Suol>o<1:?
1.nt,,""'" Cr ..,
'Mw W-.1
fin! UMr:
jPnl'l!'Ol'd
do Alle lM - lti .,_, Ull?
Oitt.Jb.Jn Comment. Both tmp//www.domMl.com/ and ht:/ldoma1tt.oom/ wOf\c.
0Add -" !f 50IMbody DON to http:J/flotNfl,CMI/
O www. lf .-.oocty gou to http lt-w.dotrYA-,V
f1.F..l.l.ly..""91 ....d, ...,. .. ....._,,..,
Otras opciones
Repito que todas estas explicaciones pueden va
riar de un proveedor a otro. Hay proveedores
que permiten utilizar el mismo nombre de usua
rio y contrasea para los servicios de FTP,
mySQL y phpMyAdmin, mientras que otros
obligan a usar distintas claves de acceso.
Adems, cada proveedor tiene su propio panel
de control, organizado de distinta forma, y todos
tienen sus particularidades de funcionamiento.
Par salir de dudas, lo mejor es que consultes a tu
proveedor (seguramente ofrecer algn tipo de
pgina de ayuda).
o / X 2 Amigos
o / X 3 Pantl!cll
o / X 4 Compa d tnibaj(I
Espero que todo haya funcionado a la perfec en modo\ horti:,:uital [ y rer los ene.
cin. A pesar de haber creado la tabla, sta si VI.U de 1mJXU1n 'l. Prevk&ua1fz.8c:il'I
gue estando vaca, pero pronto le pondremos
remedio. Introduce un par de datos, esta vez, t!'lil'(.(tardar e.is;ta ,;:onsutta en favaritos---------
Introduccin de datos
Tu siguiente tarea es sencilla: rellenar la base de
datos de direcciones. Escribe los datos de algu
nos de tus amigos, conocidos y parientes. Para
empezar puedes utilizar phpMyAdmn, de la
parte difcil nos encargaremos ms tarde.
32 Tipos de datos de MySQL
'
y minsculas
mximo de 65.535 caracteres (64 portante para ordenar y comparar) - adecuado 2 Bytes
KB) tambin
t para datos binarios
mximo de 16.777.215 caracteres (importante para ordenar y comparar) 3 Bytes
(16 MB)
MEOIUMBLOB Cadena de caracteres con un Sl tiene en cuenta maysculas y minsculas (im- Longitud del valor ms
mximo de 16.777.215 caracteres <>rtante para ordenar y comparar) - adecuado 3 Bytes
L (16 MB) f..mbin para datos binarios
!1NT o tambin Nmero entero entre 2147 millo- El atributo adicional UNSIGNED lo limita avalo- 4 Bytes (32 Bits)
INT(M) lnes y 2147 millones, (M) es cpclo- res positivos. INT UNSIGNED acepta valores en-
I SMALLINT o
f-------+--
nal
--- ---,
tre O y 4300 millones
TINYlNT o tam- Nmero entero muy pequeo entre Si se utiliza el atributo adicional UNSIGNED, 1 Byte
itnYINT(M) =127. (M) es opcional lacep un rango de valores de entre o y 255
1
FLOAT Nmero de coma flotante con En otras palabras: un nmero con coma con una 4 Bytes (32 Bits)
rango de valores de entre gran precisin detrs de la coma (recuerda que,
+/-1, 175494351 E-38 y al introducirlo en la base de datos, en lugar de
+/-3,402823466E+38 coma debers utilizar el punto decimal)
t-- -- --
DOUBLE Nmero de coma flotante con un Un nmero decimal con una gran precisin de- 8 Bytes (64 Bits)
rango de valores de entre tras de la coma (Double Precision)
+/- 2.2250738585072014E-308 y
+/- 1.7976931348623157E+308 1
DATE -Campo para almacenar la fecha en Comprueba si se han utilizado menos de 32 dias 3 Bytes (24 Bits)
formato 31') L31.12.ssss
YYYY-
MM-DD
('2004-
12- y 13
meses,
rango de
valores
entre
01.01.100
0y I
Tipos de datos de MySQL 33
DATETIME
0
TIMESTAMP o
Campo para almacenar la fecha y
la hora en formato YYYY-MM-DD
hh:mm:ss ('20041231 23:58:58')
Fecha y hora actuales en formato
YYYYMMDDhhmmss, sirve desde
Tambin determina la hora, rango de valores en-
tre 01.01.1000 y 31.12.9999
a Bytes (64 Bits)
Se puede controlar mediante M, M puede aceptar.a Bytes (32 Bits)
por ejemplo los valores 14, 12, 8 o 6, en
l
TIMESTAMP(M)
19700101000000 hasta el ao T1ME- STAMP(12} la fecha slo tiene dos
2037 cifras YYMMDDhhmmss, en TIMESTAMP 8 la
fecha tiene cuatro cifras, pero se pierde la
hora ...
34 Introduccin, actualizacin y eliminacin de datos
Introduccin, actualizacin y
eliminacin de datos
Volvamos a nuestra tabla de direcciones. Ya has Encontrars el cdigo fuente ms abajo en esta
introducido algunas direcciones con ayuda de misma pgina. Prubalo. Selecciona el rea SQL
phpMyAdmin? Se acabaron las comodidades, y escribe el comando a mano:
ha llegado la hora de dedicarse a SQL. o.10 ..
h,.,..,..,_ IOln"'
t -
-'t.,,..,._ - !MaS-..,
Introduccin de datos:
INSERT INTO ' -
? . .
Para introducir datos, utilizaremos el comando
INSERT INTO. La sintaxis es la siguiente:
-= -.----.a .......,_
" ""
(J._..,. ..,.o1,. ..,,_.,_
o-- ..------
- ,-.., ., --
Eliminacin de datos:
DELETE
En la instruccin para eliminar datos de la tabla
tambin es necesario utilizar la clusula WHE
RE. El siguiente comando eliminara la cadena
de caracteres nmero 3:
DELETE FROM direcciones WHERE id=3
PliA.a.t T
o c.11o1c1.i.pe,.,r2
CJ ........... l!
C/,.....,.. .,
Mostrar slo determinados campos
No siempre querremos mostrar a la vez todos Es importante recordar que las maysculas y
los campos de una base de datos de direcciones. minsculas no tienen ninguna importancia en
Quizs slo nos interese el apellido. O el apelli estas consultas. Si por error hemos introduci
do y el nombre. En cualquier caso, no hay pro do en la base de datos barcetona, aparecera
blema. igualmente en los resultados de la bsqueda.
Si slo queremos mostrar el apellido, bastar con Sin embargo, no se reconoceran otros agre
escribir: dados a la palabra Barcelona: no se reconoce
SELECT Apellido FROM direcciones ran los contactos de BarcelonaPedralbes o
BarcelonaEixample. El signo igual significa que
Prubalo: solamente se mostrar la columna con
solamente se permite esa cadena de carac teres,
los apellidos, mientras que las dems columnas
sin importar si est en maysculas o
quedarn ocultas.
minsculas.
BJ s.ni1dor1 loc:lhost dgb B d dtoa.r .ql_prof1
... Est:ruc:t JI 5lQl '&usca, Dejemos de buscar a los arrogantes barceloneses
y busquemos a nuestros amigos del campo o,
mejor an, de Campolandia. Supongamos que
Campolandia estuviera dividida en Campolan
dia N orle, Campolandia Sur y Campolandia Es
Introduce los comandos SQL directamente en el cam te.
po SQL.
Mostrar, filtrar, ordenar y vincular datos 37
Con Localidad=' Campolandia solamente se
I
El operador LIMIT
mostraran aquellos contactos que vivan en
Campolanda, mientras que con Locali Seguro que ya te habrs dado cuenta de que
dade ' Campolandia Este' solamente encontra
phpMyAdrnin agrega a todas las consultas la
ramos a los habitantes de la zona este. palabra clave LIMITO, 30. Esta clave se utiliza
para mostrar nicamente los prmeros 30 da
Sin embargo, seguimos sin resolver el enigma: tos de la tabla. El prmer valor corresponde a
cmo podemos "agrupar bajo un solo para la cadena de caracteres inicial. El contador se
guas" a todos habitantes de Campolandia? inicia en O, igual que ocurre con las arrays in
dexadas.
El operador LIKE Por el contrario, el segundo valor define cun
tas cadenas de caracteres se desean ver a la
Para estos casos, utilizaremos el operador LIKE, vez. Si queremos ver los siguientes 30 datos,
que significa COMO. En conjuncin con el co escribiramos el mismo comando SQL y le
modn %, este operador brilla en todo su es aadiramos sencillamente LIMIT 30, 30.
plendor.
!- .......,1
-
M. - -----------l
o.,
n ..... k,r(li,nt"el
c.,,,.n\nr111n I
"'-
31
JiiiW ')O 111" .......
,r .,..i llln111f'
T- P"(..il.t
Y
w
e . ._. Ol8'N -
t3'
_/)( . ,.
phpMyAdmin muestra la ordenacin de forma grfi
ca
phpMyAdmin volver a introducir automtica
mente el comando LIMIT.
Consultas con JOIN 39
. -u.
P,1t.
c. d '- 08001 S.tulone 9386!1889'1 fftS63671t P."Dbc>t.jJe,com 2 & un Mfflbre
Nbida, 13
' " , m"'
, .... T o.afiet ct .1a11, 08036 beraiJon
93<l,t::1908 63&678549 g,..:bk,
flllo ollcl .u
" cumi,l.."""Jt
41
....
Tef WiMI
nocidas claves ajenas que se pueden encontrar
en otros programas de base de datos. En la 1.EFT' ........ ONC....., .. ili
'
prctica, significa que es posible introducir "' 1
cualquier nmero en el campo Categora.
MySQL no comprobar si la categora intro 1
ducida se corresponde realmente con la cate
gora de la tabla categoras. Tendrs que poner
mucha atencin al introducir datos, o bien,
.
LEFT JOIN lee la tabla de la izquierda por completo
y muestra todos los datos, incluso los que no tienen
una categora
cuando ms tarde programes una interfaz pa Es decir, se mostrarn todos los datos de la tabla
ra la introduccin de datos, escribir un script izquierda, aunque no se encuentre ninguna co
que slo permita valores correctos. No te pre incidencia. En ese caso, en el campo categora
ocupes, nos ocuparemos de ello. simplemente aparecer un O; as de sencillo.
Ejercicio 5
Introduce un campo de aniversario en la lista de
direcciones, utilizando phpMyAdmin. Utiliza el
tipo de dato para fechas (DATE). Ten en cuenta
que la fecha se debe introducir siguiendo el es
quema 20061203.
SELECT direcciones.id, Tratamiento, Nombre, Apellido, Calle, CP, Localidad, Tel, Mvil,
fJ
Mail, Website, categorias.Categora, Notas
FROM direcciones LEFT JOIN categoras
ON direcciones.Categora= categoras.id
PHPy MySQL 43
p
rs que todos estos pasos previos con SQL tenan
su razn de ser. A continuacin, mostraremos la Mostrar nombres
libreta de direcciones dinmicamente como p Clara Martion:
gina HTML.
Feeese Palafef
:
Empezaremos con una vista de los datos estruc
LeoM"""'
turados en filas, y lo iremos complicando hasta Pedro Jimeor:z
una tabla.
Cmo se puede leer con PHP los datos de una
tabla MySQL? Cmo se accede a los datos? En En el primer ejemplo juntamos los nombres y los ape
seguida resolveremos el misterio. llidos
Abajo te muestro el cdigo fuente que he utili
Nombres y apellidos zado para esta consulta. Nuevamente, slo he
copiado la parte del cdigo contenida entre las
Para nuestro primer ejemplo, mostraremos los etiquetas cbodyec/body.
nombres y apellidos de los contactos de la libre Adems, en el suplemento encontrars el docu
ta. Los datos aparecern uno tras otro, separados mento, llamado direccionesl.php.
por un salto de lnea. El resultado tiene este as
pecto:
<h3>Mostrar nombres</h3>
<P>
<?php
$dp = mysql_connect{nlocalhost", erooc v "");
mysql _select _db { "sql _prof i 11 , $dp) ;
$sql = SELECT * FROM direcciones";
11
$resultado= mysql_query($sql);
while ($row = mysql_fetch_assoc($resultado))
echo 11$row[Nombre] $row(Apellido]<br>\n";
mysql_clase ( $dp) ;
?>
</P>
44 PHPy MySQL
El nombre de usuario de nuestros ejemplos offline maria as). El efecto final es que se crea una lista
con XAMPP siempre es root, y no se ha asignado de resultados.
ninguna contrasea:
mysql_connect(nlocalhost", "root", ""); Cuestin de resultados
Si deseas probar el script en tu proveedor de Cmo tenemos que imaginarnos ese resulta
hosting, naturalmente tendrs que ajustar estos do? Como una lista. En este sentido, tambin
datos. se suele hablar de result set, es decir, de la lista
de resultados. Una vez ejecutado el comando
Variable como identificador de conexin
SQL, el resultado est a nuestra disposicin
Y qu significa la variable $dp que aparece al
principio de todo? Es una especie de identifica en forma de lista, en forma de "tabla virtual"
dor de conexin para la conexin con la base de en la que todas las filas estn ordenadas una
datos. Es importante si nos conectamos a varios detrs de otra. Lo que haremos es leer esa lis
servidores de bases de datos. En ese caso, se ta, fila a fila.
asigna un identificador propio a cada conexin.
Estoy seguro de que no habrs tenido ningn
Seleccin de la base de datos correcta problema para seguir mis explicaciones hasta es
Despus de la conexin, es necesario selecccio te punto.
nar la base de datos deseada. Por eso, la siguien
te funcin que aparece realiza una seleccin. Bucle para leer los datos
A partir de aqu, las cosas se complican un poco.
El nico argumento realmente necesario es el
Lo siguiente que aparece en el cdigo es un bu
nombre de la base de da tos. Como segundo ar
cle, vinculado con una funcin. De qu se en
gumento se puede utilizar el identificador de la
carga exactamente?
conexin que acabamos de ver, por ejemplo:
mysql_select_db("sql_profi", $dp); El bucle while se ejecutar mientras se cumpla
Ya estamos conectados a la base de datos, y el una determinada condicin.
siguiente paso es proporcionar las instrucciones
SQL deseadas. Como recordatorio, te escribo la sintaxis bsica
de while:
ComandoSQL while (condicion)
A continuacin, guardaremos el comando SQL instruccion;
en una variable. Siendo derrochador como soy,
para este ejemplo opto por seleccionar todos los Al principio del bucle se comprueba si se cum
datos de la tabla: ple la condicin. Por tanto, se comprueba lo si
$sql "SELECT '* FROM direcciones"; guiente:
No es obligatorio llamar a la variable $sql. Lo $row myeql_fetcb_aseoe($resultado)
importante es que recordemos cmo la hemos Qu hace esta nueva funcin?
llamado.
Funcin mysql_fetch_assoc
Ejecutar una consulta La funcin mysqlJetch_assoc() toma nuestra lista
de resultados s decir, nuestra "tabla virtual"-
como argumento.
A continuacin, realizaremos la consulta, llama
da "query" en ingls. Extrae la primera fila de la tabla virtual y la
transforma en una arra y asociativa. En nuestro
$resultado mysql_query($sql);
caso, la array se llama $row, porque ese es el
Transmitimos a la funcin el cdigo SQL que nombre que he decidido asignar a la variable co
hemos almacenado en la variable $sql, y que es rrespondiente:
taba esperando el momento de su salida a esce $row mysql_fetch_assoc($resultado)
na.
Recordatorio: las arrays asociativas se com
El resultado de la consulta se guardar en la va
ponen de un nombre (aqu $row) y las claves o
riable $resultado; (he usado resultado para que
fuese ms explicativo, pero no es obligatorio lla keys. Las keys no son numricas (O, 1, 2, etc.),
sino que permiten asociarles algo.
PHPy MySQL 45
,... 'We.;ie
,-.fwww.bQkla.eom
C:11ori:1
11111
!"{otu
bombu muy
Cllllidad de li.s: 5
...
I
u S..
s...
IT= .......
=.a. CI de la bebida. 13 loSOOI
"'"""""
9J86jg&97 66186:36711
l CJ A,i>au, 8) knOJ6
""'"""
934SIS908 63667SS49 cr=@w.doo.es l No oMdar su anplea&>s!I
' S.. u CJ Lep,do, 46 escu 9).5308976 1896785 "--- htlpllwww .leoleo OOlll 1
'
Daremos forma de tabla a los datos. La primera fila de la tabla queda resaltada en negrita.
He guardado el archivo del suplemento como direcciones2.php. Como siempre, solamente copio aqu la
parte del cdigo contenida entre las etiquetas <body></body>.
1 <h3>Mostrar nombres</h3>
2 <?php
3 $dp;;. mysql_connect(11localhost11, "zootv , "");
4 mysql_select_db("sql profi", $dp);
5 $sql = "SELECT * PROM direcciones 11;
6 $resultado = mysql_query($sql);
7 $campos = mysql_num_fields($resultado);
8 $filas = mysql_num_rows ($resultado);
9 echo "<pcCant .dad de filas: <b>$filas</h></p>\n11;
10 echo 11 <table boxde re ' 1' cellspacing=' O'> \n"; / / Empezar tabla
11 echo 11<tr>"; // Crear fila
12 for ($i "" O; $i < $campos; $i++) {
13 $nombrecampo = mysql_field_name($resultado, $i);
14 echo "<th>$nombrecampo</th> 11;
15
16 echo "</tr> \n"; / / Cerrar fila
17
18 while ($row = mysql_fetch_assoc($reultado))
19 echo "e t r " // Crear fila
20 foreach ($row as $key => $value) {
21 echo "<td>$value </td>";
22
23 echo "</tr>\n"; // Cerrar fila
24
25 echo 11</table>\n"; // Cerrar tabla
26 mysql close ( $dp) ;
27 ?>
par de problemillas.
);
Wa,..'-a .t,Q:....-.,.i;.O<!CY!OldMySQt.Looi<<.........,.k
Desactivar todos los mensajes de error no tiene
c,1.apo<hfli.tN1\Ja-ii,1ltd0<al,lr,plWlr11,tcl<>ll d,p "".., L ningn sentido, necesitamos controlar exacta
\\'oro.Ita ...,.,..._"'"'1() limooe,mra<f:IMO't Ac:C<'U d(lliod for,.... 'QOBC"@ Q'5lo& mente lo que ocurre cuando se interrumpe la
Jl'lfW'll"l NO) lo C;\lparlofmhl.uPl'\l.!docpl\dlrtlo-..2.fd,p ,- ... ll
ejecucin del cdigo.
La conexin no funciona: mensajes de error.
Sin embargo, estos mensajes no son de mucha Control de errores con or die()
ayuda, ni para uno mismo ni para los usuarios.
Lo que haremos es desactivarlos. Para detener un script, podemos utilizar las pa
labras clave exit y die(). A diferencia de exit, die()
Coloca el signo de la arroba @ delante del permite mostrar en pantalla un mensaje perso
nombre de las funciones. nalizado.
La arroba permite evitar que se muestren los die() queda especialmente elegante si se com
mensajes de error de la mayora de funciones. bina con el operador or.
En nuestro ejemplo, las "lneas de acceso" ten-
dran este aspecto; observa la parte superior de Es decir, escribe lo siguiente:
$dp = @mysql_connect(11localhost11, "zoot", "11 ) or die("<p>No se ha podido establecer;
la conexin con MySQL.</p>");
@mysql_select_db ( "sql_profi" , $dp) or die ( "<p>No se ha podido establecer&'
la conexin con la base de datos.</P>");
Si no se logra ejecutar mysql_connect(), se mos Si, por el contrario, la base de datos tiene algn
trar el mensaje No se ha podido establecer la co problema, PHP mostrar el mensaje personali
nexin con MySQL y se detendr el script. zado correspondiente. Prubalo, funciona muy
bien. Sin embargo, no me doy por satisfecho con
i\lostrar nombres
esto. Por algo hemos hablado en la pgina 13 so
No se ha podido establecer la. cQl'.IWO coa MySQL. bre la forma de almacenar los datos del usuario
de forma externa ...
. =..=..fiiiOi
CP
=.....=
=::J
en la variable $campocat. Seguro que recordars
el signo _; del cuaderno anterior, es una abrevia
tura para la autoconcatenacin. Como value se
L
1 , ocW.
:= -
gora.
iaj
:
este modo nos aseguramos de que el usua
f ::. M ..
j,J t -
. i:'3
1 <h3>Introducir direcciones</h3>
2 <?php
3 include (" .. /cgi-bin/acceso. inc .php") ;
4 if (isset($_POST['submit])) {
5 if (empty($_POST['NombreJ)) {
6 echo "cp s Irrt r oduaca el cbonornbre e Zb s . </p>11;
7 ) else if (strlen($_POST['Apellido'])<3)
8 echo <p>El apellido debe tener como mnimo <b>3</b>
11
tJ
caracteres. </P> '' ;
9 } else {
10 $sql = INSERT INTO direcciones (Tratamiento, Nombre, Apellido,
11
Calle,
11 CP, Localidad, Tel, Mvil, Mail, Website, Categora, Notas )
12 VALUES ('$_POST{Tratamiento) ', '$_POST[Nombre] 1
,
1
$_POST[Apellido] ',
13 '$_POST[Calle] ', '$_POST[CP] ', '$_POST[Localidad] ', '$_POST[Tel] ',
14 '$_POST[M6vil] ', '$_POST[Mail] ', '$_POST[Website] ', '$_POST[Categora]'
15 '$_POST [NotasJ ') 11
;
16 $resultado mysql_query{$sql);
17 if {$resultado) {
18 echo "<P>Datos agregados con xito. </p>";
19 else (
20 echo "<p>Datos <b>nO</b> agregados. </p>";
21
22
23 echo 11
<a href:1javascript:history.back() '>Volver</a> l -
[
27 $resultado2 mysql_query{$sql2);
28 $campocat == "11;
29 while ($row = mysql_fetch_assoc($resultado2))
30 $campocat . "' "e opt.Lon value= 1 $row [id] '>$row [Categorial </option>\n";
31
32 echo <<<FORMULARIO
Introduccin de datos mediante formularios 53
Tlpo d n.dto. , 1 UN [QUE j f!l
C..m ... ,
Nombnl. [vr(2:5)]
"I1[4-1;..*:a m l CJ:
AIM!l!idQ (v...:;hr(:U}I
Alladit I ndic. []
2
coh,m,..{) 1
Cantln....,.
1
Copia de seguridad de tablas 55
[ ' - .. .. .- - .
Qu ocurre en el caso de los proveedores de
hosting? Por lo general, no tendremos acceso di NU ..,.,. , d" d l 1nlclo la
recto a la carpeta MySQL. @SQI.
. .. . . . . . - - -
d a ,- g ! . b ' otl
y - ,
(co,;lu) a u luor t1
2. Selecciona una a una las bases de da tos que
En situaciones corno esta, lo que se suele desees exportar o bien haz clic en Seleccionar
hacer es transferir los datos con un "SQL todo.
Dwnp". Crea una especie de fotocopia de la
base de datos, un esquema.
Ejercicio 2:
1d1""'- -.,,,..., f-..... -Po-=-... - ,.._
Edita el archivo de presentacin de los datos pa
.............
............
,......... ........ ra que las direcciones se ordenen por el apellido .
-... -..-.
l
o - ..... _, _
11dt-
L _ _ i
para validar el formulario de introduccin de di
e
o
0--- recciones.
.... _
0- ...
Ejercicio 4:
-
. . .. .....
o '""
-
,o
-
oa--
a,.;::-;., ;;;;... Crea una tabla para reunir tu coleccin de dis
cos. Utiliza tambin otra tabla distinta para las
categoras. Utiliza un LEFf JOIN y el campo de
c- ... -
c-...-...* .. consulta en el formulario de introduccin de da
_.......... tos.
"'-_-..."
- Ejercicio 5:
" ' ' " .. -.. - -
... - - r - , , Crea una copia de seguridad de todas las tablas
-...
- que hayas creado. Llmala backupDDMMAAAA,
donde DD es la fecha actual, MM el mes y
AAAAelao.
Si la tabla es MySQL 5, selecciona la opcin
MYSQL40 por motivos de compatibilidad, para que
la importacin a sistemas ms antiguos funcione
sin problemas.
Si te olvidas de hacerlo, fallar la importacin en
el sistema MySQL 4, ya que las tablas de bases
de datos MySQL 5 tambin exportan la codifica
cin de los datos, que se puede reconocer por
algo as como collnte latin1_general_ci.
Felicitacin de cumpleaos con cronjob 57
.
;;;.
por. p,.._.,_w
= pleaos debe introducirse siguiendo el esque
ma AAAAMMDD, es decir 19670312.
81.Mde tol;MllProfl, 9 Tllbll: OhcdOnN
c...,. -
8
c...........,
jlllfamr
.........
Crear una neuva columna en
Cl 111 ,...111 Ho
'0 ........... *1
ti .,......, IN\il.Jilll'IIR'l9 SI
:Q: ...... .., ..........u, $f
a e... lldn1...Dl"Pl_d
QOP lilllf.....-t;.111
o LOlltld.d nalizar el mensaje de felicitacin de cumplea os
...
.,.........P
Edita tu tabla con phpMyAdmin: desde aqu La tabla de la que estamos hablando puede
puedes introducir (Insertar) nuevos contactos ser perfectamente una pequea libreta de
direcciones, como la que acabamos de crear
en los captulos precedentes. Sin embargo,
Requisitos para el script tambin puedes usar tu directorio de clien
tes o una lista de empleados que contenga
Antes de poder disfrutar de la comoclidad del miles de registros.
script, es necesario realizar una serie de traba-
jos previos. Para que funcione el envo de e-
mails mediante PHP es necesario que lo
permita tu proveedor de hosting (pero tranqui
lo, suele ser as en la mayora de empresas que
ofrecen PHP). Adems, necesitaremos una ta
bla que contenga como mnimo la direccin de
correo electrnico y el cumpleaos de tus con
tactos.
Si la tabla tambin contiene los campos Nombre
y Apellido, mejor. De esta forma podrs perso
tie- ne que llamarse Cumpleaos, y como
la tabla formato de los datos seleccionaremos el
formato de fe
Ya tienes una tabla de direcciones, pero te
cha DATE. Gracias al formato DATE podremos
fal ta la columna para el cumpleaos? Quizs
ordenar ms tarde la lista de direcciones por
se deba a que no has terminado el ejercicio 5
fecha. Adems, este tipo de datos permite al
... macenar fechas ms fcilmente que si se utiliza
No pasa nada, podemos aadirla posterior un formato de texto como puede ser VAR
mente sin mayor complicacin. Cmo se CHAR.
agre ga una nueva columna a la tabla?
Utilizando la siguiente sintaxis: Vamos all, directos a la tabla. Abre la tabla de
ALTER TABLE nombretabla ADD COLUMN
clirecciones con phpMyAdmin y ejecuta el si
nombrecampo guiente comando SQL en el campo SQL:
Con esta instruccin se aadir una nueva co- ALTER TABLE direcciones ADD COLUMN
Cumpleaos DATE
lumna automticamente al final de la tabla ya
existente. En nuestro caso, el nuevo campo Si todo ha ido bien, el nuevo campo aparecer
en la estructura de la tabla.
58 Felicitacin de cumpleaos con cronjob
preocuparte por los problemas del efecto 2000,
ya que este tipo de datos acepta fechas entre
IMYll or.- 01.01.1000 y 31.12.9999 .
...... d-.141l..Jlfolh. Tloblt.:dlr'llcdonff
- _, .. ..
-- "'
2
9
3
10
11
16 17 18
;
Q 61 . 1111
Con ADD COLUMN puedes agregar una nueva Las nuevas versiones de phpMyAdmin proporcio
columna en la tabla direcciones. Usaremos el campo 23 24 25
cumpleaos para almacenar la fecha.
Repito: presupongo que tu libreta de direccio
nes tiene un campo llamado Cumpleaos. Escri
be la fecha del cumpleaos de tus contactos, y nan un campo de seleccin para la fecha que
no te olvides de utilizar el formato AAAA permite introducir la fecha con total comodidad;
MMDD; es decir, empieza por el ao con cua pero no te olvides de seleccionar el ao correcto.
tro cifras, seguido del mes y el da con dos ci
fras. No te olvides de los guiones que separan
los nmeros de la fecha. Tampoco tienes que
fclose($fp);
// Ejecutar solo el script de mail si lafecha es nueva
if ($writemail) {
include(" .. /cgi-bin/acceso.inc.php");
$mes= date("m'');
$anyo ,,. date ("Y");
$remitente= "tunombre@tuemail.com";
// Asunto del contacto
$asuntol = "Felicidades por tu cumpleaos";
// Asunto para uno mismo
$asunto2 = 11Atenci6n! Se ha enviado mensaje de cumpleaos a:";
// Slo consultar los campos importantes
$sql = "SELECT Nombre, Apellido, Mail, Cumpleaos
FROM direcciones ORDER BY Cumpleaos";
$resultado= mysql_query($sql);
// repasar todas las filas de la tabla:
Felicitacin de cumpleaos con cronjob 59
Hoy es $dia.$mes.$anyo!
Sinceramente : -) ";
// Final del texto del email
// Enviar mails, incluido mail de control
if {mai1("$row[Mail]", $asuntol, $mailtext, "From: $remitente''))
mail ("$remitente", "$asunto2 $row [Nombre] $row (Apellido] 11,
$mailtext, "From: $row [Mail] 11);
JI cerrar if Mail
JI cerrar if !empty()
// cerrar while
mysql_close(};
// cerrar if writemail
,,
Podemos especificar cundo y con qu fre-
Funcionamiento del script cuencia se ejecutar la tarea, del mismo mo
do que puedes programar libremente el apa
Cmo funciona exactamente este script? Una rato de vdeo para grabar.
vez al da comprobar las fechas de cumplea
os de la base de datos de direcciones. En caso Consulta a tu proveedor de hosting si per
de que coincidan el da y el mes, se enviarn mite la ejecucin de cronjobs. Desgraciada
dos mensajes de email: uno a la persona que mente no siempre es as, aunque el provee
cumple aos, y otro mensaje de recordatorio al dor ofrezca PHP y MySQL. Adems, tu pro
remitente. La idea es que no te sorprendas si veedor podr decirte cmo configurar el
alguien te llama para darte las gracias por feli cronjob. Por lo general, se hace a travs del
citarle por su cumpleaos. men de configuracin del cliente. Si tu
proveedor no soporta cronjobs, una posible
Cmo le decimos al script que compruebe una solucin son los servicios cron gratuitos:
vez al da la base de datos? Los programas de
PHP no suelen ejecutarse automticamente por
www.webcron.or;/jndex.ph;,?&!ang=es o
www.cronjobs.ar. por ejemplo. Sin embar
su cuenta. Para llamar el script, utilizaremos lo go, debers registrarse en todos estos pro
que se conoce como cronjob. veedores con nombre y direccin para poder
evitar eventuales abusos. Por desgracia, en
Cronos es una palabra griega que significa
la prctica muchos de estos servicios gratui
tiempo. Un cronjob no es otra cosa que un tos pueden desaparecer de la noche a la ma
script controlado por tiempo, que p.ej. abre ana.
una vez al da tu pgina PHP. Imagina que
es como la funcin "timer" de la grabadora Si tu proveedor de hosting no permite cronjobs
de vdeo. y no tienes ganas de registrarte en un provee
dor de cronjobs gratuito, tambin puedes usar
lo sin, con nuestro "pseudo cronjob". La nica
60 Felicitacin de cumpleaos con cronjob
condicin es que como mnimo un visitante al Presupongo que el script de PHP (no es obliga
da se deje caer en la pgina en la que se en torio llamarlo cumpleanyos.php), el archivo que
cuentra el script. Para lograrlo, basta con que contiene los datos de acceso a MySQL acce
incluyas el script en la pgina de tu web que so.inc.php y el archivo numerodia.txt ya se en
reciba ms visitas. cuentran en tu servidor.
Coloca el siguiente prrafo PHP en cualquier Sobre todo, asegrate de haber introducido los
punto de tu pgina PHP ms visitada. Tambin datos de acceso correctos en el archivo acce
puedes vincularla con include, por ejemplo: so.inc.php. Y ya puedes probar si el script fun
include ( "cumpleanyos. php") ciona.
El script de felicitacin funcionar de forma
invisible en segundo plano; slo necesita ser Variable $writemail
ejecutado.
Si quieres saber cmo funciona el script para
poder adaptarlo mejor a tus necesidades, lee lo
Una vez al da con pseudo- que sigue: en la primera parte, determinamos
el nmero actual del da de la semana, siempre
cronjob con dos cifras. Para ello utilizo la funcin da
te () en la siguiente lnea:
Parto de la premisa de que tu sitio web tiene
$dia"' date("d");
cierto xito. As, es seguro que tu pgina con el
script de PHP vinculado ser llamada varias A continuacin, abrimos el archivo numero
veces al da. dia.txt y guardamos el valor de dicho archivo
en la variable $aw. Mediante una consulta if
Pero no nos interesa que cada vez que se llame comparamos el da de la semana actual de
a la pgina se enven mensajes de felicitacin. $dia con el valor de numerodia.txi, Si no coinci
Cincuenta mensajes de felicitacin iguales en den, la variable $writemail pasa a ser true. A
un solo da ca usaran en tus amigos una im- continuacin, escribimos el nmero del da de
presin sin duda duradera, pero no muy bue hoy en el archivo numerodia.txi. Si ambos n
meros coinciden, el valor de $wri temail ser
na. Tenemos que asegurarnos de que los men
false y eso ocurrir precisamente cuando se
sajes slo se enven una vez al da, aunque se vuelva a ejecutar el script por segunda vez en
ejecute el script varias veces. Para ello, recurri un mismo da. Es decir, el script ya habr sido
remos a un pequeo truco. El script "se dar ejecutado ese da y no tiene que volver a ejecu
cuenta" del da que es y lo guardar en un ar tarse.
chivo. Para ello sirve precisamente el archivo Las lneas de cdigo siguientes no son nada
numerodio.txt que aparece en el cdigo. complicadas. La parte principal del cdigo so
Para empezar, en este archivo tiene que figurar lamente se ejecutar si el script no se ha ejecu
un nmero distinto al de la fecha de hoy. Por tado hoy. Lo comprobamos con:
ejemplo, si hoy es el 12 de octubre, escribe un if ($writemail) {
11 en el archivo. Guarda el archivo y crgalo en Despus definimos otras variables con las que
el servidor, en la misma carpeta en la que car determinamos el mes y el ao. Y no hay que
gues el script. Ten en cuenta que, en funcin olvidarse de la direccin del remitente y el
del proveedor que utilices, es posible que de asunto. En este caso, distinguiremos entre el
bas cambiar el bloqueo contra escritura para asunto para la persona que recibe la felicita
poder escribir datos en el archivo. Para ello, cin y el asunto del "recordatorio" para ti, el
puedes usar el comando CHMOD 766 o remitente y creador del script. Al fin y al cabo,
se enviarn dos emails.
CHMOD777.
// Asunto del contacto
La primera vez que se llame al script de $asuntol = "Felicidades por tu
cumpleaos";
PHP, ste guardar el nmero correspon // Asunto para uno mismo
diente al da actual en el archivo; en nuestro $asunto2"" "Atencin! Se ha enviado
caso, sustituira el 11 por un 12. mensaje de cumpleaos a:";
Felicitacin de cumpleaos con cronjob 61
... H "11
-
lnea a lnea. El bucle empieza con: En ese caso se enva el mensaje de felicitacin
while ($row = de cumpleaos al destinatario, con una copia a
mysql_fetch_assoc($resultado)) ti mismo (el remitente).
Para acceder a los distintos campos utilizamos
el nombre de cada campo como key de la arra
y. Es decir, recuperaremos la direccin de email
con $row I "Mail"], y la fecha de cumpleaos
con $row ["Cumpleaos"].
Envo de e-mails
A continuacin entra en escena la funcin ex
plodei), ya que tenemos que extraer como m-
nimo el mes y el da de la fecha del cumplea
os en formato AAAAMMDD:
$cumple= explode("-", $row["'
Cumpleaos"]);
Esta funcin divide la fecha del campo Cum
pleaos con ayuda del signo de guin () en
ao, mes y da. El resultado se guarda como
array con una key numrica. As, podremos
acceder al da de la semana con $cumple [ "2 J, 11
pr--
saje se almacena en la variable $mailtext mrtJieoiios
y le deseamos toclO Jo me;ortanto en .. llida
Los saltos de lnea se convierten en saltos de
lnea en el email, por lo que dividir el texto en
prrafos es la mar de sencillo.
-
S1rta!rameflle -
p
eJ 516,JJN:t: rlaipcwbJGN E ,_
INl'C fflVlceQ!chark,d@
Dlltr.: 18::3) Un par de lneas de cdigo ms abajo, se env
T' an los mensajes de correo electrnico con la
" funcin mail(), en conjuncin con una consulta
if. La primera consulta comprueba si se ha en
viado el mensaje de felicitacin. De ser as, se
62 Felicitacin de cumpleaos con cronjob
enviar el mensaje de confirmacin al remiten De esta forma, vers enseguida su telfono y
te. podrs llamarle. Con tantas atenciones, seguro
que tus amigos estarn encantados.
Naturalmente, tambin puedes utilizar este
Atencin! ... el mensaje de recordatorio te script para enviar mensajes de advertencia.
evitar posibles situaciones embarazosas. O puedes usarlo para distribuir boletines de
noticias. Basta con eliminar la consulta sobre
la fecha de cumpleaos. Lee el texto del bo
Ejercicios sobre el script de letn de forma dinmica desde un campo de
formulario e insrtalo en lugar del texto de
cumpleaos felicitacin.
Naturalmente, puedes seguir ampliando el
proyecto y adaptndolo a tus necesidades. En Ejercicio 3: ajustar el formulario
este sentido, te he preparado un par de ejerci Ajusta los documentos para introducir y mos
cios: trar los datos de forma que tengan en cuenta el
campo de cumpleaos y el nuevo campo adi
Ejercicio 1: completar un campo cional que has creado en el ejercicio l.
adicional Aviso: para estos tres ejercicios no ofrezco los
Crea un campo en la base de datos con infor archivos con la solucin, porque estoy conven
macin adicional, muy personal. Si existe, este cido de que no son nada complicados.
texto se leer de la base de datos y se agregar
al texto del email. De este modo, tus emails
sern ms autnticos, porque los destinatarios
recibirn informacin muy personal.
i1
mente abriendo los archlvos del suplemento. En
el archlvo CSS determino los tipos y tamaos de
fuente, los efectos de los vnculos y establezco
unas determinadas dimensiones para el conte
nido. Incluso las lneas verticales del margen iz-
. _, quierdo se crean mediante CSS .
_,,,u,J,--....._
1lKWl 1 l!IK'l!
Consejo: en el cuaderno Crea tu sitio web:
!
aprende HTML y CSS el autor David Bosman
te presenta todas las opciones de diseo y
formato que ofrece este fascinante lenguaje.
<?php
$dbname "sql_profi"; // Nombre de la base de datos
$dbhost "localhost"; // Host de la base de datos, casi siempre localhost (excepto l&l)
$dbuser "root"; // Nombre de usuario para MySQL
$dbpassword .. ""; // Contrasea para MySQL
44 <div>$Entrada</div>" . 11
<p>introducido por ebs s rov [Nombre} </b> el
45 <strong>$row [Fecha] </strong>";
46 if ( !empty($row[ 'Mail'])) {
47 $output .= "<div><strong>E-Mail</strong>: $row[Mail]</div>11;
48
49 if (!empty($row[1Homepage'])l {
50 $output . "" 11 <div><Strong>Home</strong>: $row [Homepage] </div>";
51
52 if (isset($_COOKIE[1conectar']}) {
53 $output . ""' "ed .v [ <a href=' $_SERVER [PHP_SELF] ?eliminar:&
true&id=$row[id]&step=$step&start=$start'>Eliminar fila</a>} -
54 [ <a href='$ SERVER[PHP SELF]?desconectar=true&step=&
$step&start=$start >Desconectar</a> J </div>";
SS
56 $output '"' "<P class='linea'> </p>\n";
57 // fin de while
58 $output . = "<P> [ <a href= 1 #top' >arriba</a> ] </p>";
59 echo navi_page($start, $step, $filas);
60 echo $output;
61
62 mysql_close();
63
64 echo "<form action='$_SERVER[PHP_SELF]?step:::$step&start=$start' method:::'post'>";
65
66 ?>
67 <input t.ypeev eubm.t;" va Lueen eqt; r " c Las aevm.n i "
68 <input type="text" name="logname" c Laaeevm. n ." >
69 <input type=password" name="logpw" c Las s e vrn.n ,">
70 </form>
71 </div>
72 </div>
73 </body>
74 </html>
I
@mysql_connect ( "$dbhost", "$dbuser",
"$dbpassword")
or die ( "Conexin con el servidor & Adems, utilizo tambin UMIT.
no establecida."};
@mysql_select_db("$dbname") or & Limito la cantidad de datos que se muestran, un
die ("Acceso a la base de datos & detalle importante para nuestra funcin para
fallido.") ; "pasar pginas". He inicializado la variable
$start en la lnea 2 con O, por lo que inicialmente
De momento, no es necesario que te fijes en las la cantidad de entradas es O. De la variable $step
siguientes lneas. me he ocupado en el archivo edit.inc.php. Si la
has establecido como yo en 2, se mostrarn dos
Proyecto: libro de visitas con fotos 67
entradas seguidas. Prubalo, cambia el valor de Las lineas 5255 estn reservadas al rea de ad
$step en el archivo edit.inc.php. ministracin. Solamente se mostrarn si el pro
pietario del libro de visitas se conecta con el
nombre de usuario y la contrasea correctas, y
Mostrar los datos se crea una cookie. Despus volveremos sobre
ello.
La forma de mostrar y presentar los datos no
debera suponer ningn misterio. De ello me he $output y navi_page()
ocupado entre las lineas 38 y 52.
Te has fijado en que almaceno toda la string de
Mediante la funcin mysql_fetch_assoc() recu los registros en la variable $output?
pero las entradas de la tabla y las presento con
HTML. He inicializado la variable en la linea 3. Sin em
bargo, no guardo datos en ella hasta la linea 42.
La entrada del libro de visitas propiamente Y es en la lnea 60 cuando muestro su contenido
dicha se somete en la linea. 40 a un tratamien utilizando echo. De este modo puedoe mostrar
to especial con nl2br(). Esta funcin, que ya los vnculos para "hojear" el contenido encima
presentamos en el cuaderno anterior, trans de las entradas propiamente dichas, ya que apa
recen en la linea 59.
forma los saltos de linea en la etiqueta cbr />.
<?php
function navi_page($start, $step, $filas)
{
$startl $start + $step;
$start2 $start - $step;
$output "11;
if {$startl e $filas) {//Inicio if
$output .= " [ ca href=\11$_SERVER[PHP_SELF] ?start=$startl\"><< cP
Entradas anterioresc/a> ] ";
}
if
($start2 > O) {
$output .= 11 [ ca href=\"$_SERVER[PHP_SELF] ?start=$start2\11>Entradas <!)
ms recientes >></a> ] \n";
} // if-Ende '
$output = "<p>$output</p>";
return $output;
,,
La funcin recibe tres parmetros: el valor ini Cantidad de ent:Jradas: S
cial, la cantidad de registros a mostrar y el total
[ << Entradas anterior-es ] [ Entradas ms reoen>>]
de registros. La funcin analiza estos tres datos
y, en funcin del resultado, devuelve el texto En
tradas anteriores, Entradas ms recientes o ambas Si hay varias entradas, podemos "hojear" hacia ade
cosas juntas. lante y hacia atrs.
68 Proyecto: libro de visitas con fotos
Para ello se utilizan clculos y comparaciones.
La funcin no es complicada, estoy seguro de Introducir una entrada
que podrs aclararte con la programacin de la
misma. Hasta aqu todo suena bien, pero ... cmo se
puede introducir una entrada al libro de visitas?
Lo importante es que los valores iniciales Utilizando un principio muy parecido. Observa
(start=) se transmiten al vnculo en forma de la lnea 30 de index.php. Tambin he agregado un
parmetro. parmetro a la URL del vnculo, en este caso:
?entrada=true
Si hojeamos una pgina hacia atrs, la funcin
puede agregar, por ejemplo, start=4 al vnculo. Est establecida la variable $_GET['entrada'J?
[ Entradas De ser as, se visualiza el formulario y se pueden
recibir los datos.
Y eso ocurre precisamente en introduc
cion.inc.php, Ya he vinculado este archivo en la
lnea 26, debajo de la lnea del diu:
El agregado a la URL se aprecia en la lnea de estado
echo "<div class=='marco'>n;
La direccin completa sera: include("introduccion.inc.php11);
index.php?start4
Por qu? De este modo, logro que todo el for
mulario quede dentro del diseo especificado
La variable $_GET['start'] para dio clnsse'marco', ya que el contenedor
Aqu entran en juego las lneas 4-6 de index.php, div asegura una anchura exacta de 700 pxeles.
donde el script comprueba si el parmetro de la Empieza en la lnea 25.
URL llamado start existe. Existe la variable
$_GET['start']? Tiene el valor 4? Fantstico! Se A continuacin, veamos el cdigo fuente com
guardar el valor en $start y en lugar de O pleto del archivo introduccion.inc.php:
habremos cambiado dinmicamente el valor de
start a 4.
22 Paciencia al cargar!
23 </form>
24 <p>( <a href=index.php11>Cancelar entrada</a> J</p>
25 FORMULARIO;
26 }
27 if ( !empty($_POST ['Nombre']) && !empty($_POST ['Entrada']))
28 // Cargar foto, despus introducir datos
29 $upload = false;
30 if (isset($_FILES['archivo']) && $_FILES['archivo] ['size') > O) {
31 $nombretemp = $_FILES['archivo'] ['tmp_name');
32 $nombrearchivo = $_FILES['archivo'] ['name'];
33 $tamanyoarchivo = $_FILES('archivo'] ['size'];
34 $tipoarchivo = GetimageSize($nombretemp);
35 if 1$tipoarchivo[2] == 1 11 $tipoarchivo[2] == 2) { // GIF o JPG?
36 $extension = {$tipoarchivo[2] == 1 ? "gif" : "jpg");
37 $nuevonombre = time () . '". $extension 11;
38 $anchoimagen = $tipoarchivo(O];
39 if ($anchoimagen <= $ancho) { // Imagen demasiado ancha?
40 if (move_uploaded_file($nombretemp, "img/11 $nuevonombre))
41 chmod("img/11 $nuevonombre, 0666);
42 echo "<h2>Mensaje de aviso para la carga:</h2>
43 <p>El archivo se ha cargado <b>con xito</b>.<br>
44 Tamao de archivo: <b>$tamanyoarchivo</b> bytes;<br>
45 Antiguo nombre de imagen: <b>$nombrearchivo</b><br>
46 Nuevo nombre de imagen: <b>$nuevonombre</b><br>";
47 $upload = true;
48 else {
49 echo "<h2>No ha funcionado.</h2>
50 <p>No se ha podido cargar el archivo.</p>";
51
52 else
53 echo "<h2>Atencin:</h2>
54 <p>El archivo tiene una anchura superior a <b>$ancho pxeles</b> y
55 es demasiado ancho.</P><form><input type=1button value='Volver'
56 onclick=' javascript: history .back () ></form> 11;
57
58 else
59 echo 11<h2>Atencin:</h2>
60 <P><b>No</b> es un archivo GIF
61 o JPG vlido.</P><form><input type='button' value='Volver1
62 onclick=' javascript :history .back () '></form>";
63
64 else
65 echo "<h2>Falta algo.</h2>
66 <p>Indica un archivo <b>de imagen</b>.</P>
67 <form><input type='button' value='Volver'
68 onclick=' javascript: history. back () ></form> 11
;
69
70 if ($upload) {
71 $fecha= dat.e Lvd m.Y, H:i") . "horas";
i
72 $Nombre= strip_tags($_POST('Nombre']);
73 $Mail = strip_tags($_POST[1Mail']);
74 $Homepage = strip_tags($_POST['Homepage']);
75 $Entrada= strip_tags{$_POST['Entrada']); $Mail 1
,
Te parece complicado? Qu va. Ya conoces la campos Nombre y Entrada. De ser as, se ejecuta
mayora de cosas que aparecen de ejemplos an el script para cargar la imagen, y despus el
teriores. script para introducir los datos en la base de da
Lo primero que se hace es crear el formulario. tos.
En la lnea 27 compruebo mediante una com Todo este bloque se alarga hasta la lnea 90.
probacin rudimentaria si se han rellenado los
Nombre y apell.do:
1
Direccin de e-mail:
Homepage:
Imagen: Examinar..
Escribir texto:
73
[
l
I
Cdigo fuente de
l!!!m
admin.inc.php
, ..Y.lm,n
:6
Este es el cdigo fuente que crea la cookie; se tra
El formulario para el administrador est ta del cdigo del archivo admin.inc.php:
bastante camuflado
Tras introducir el nombre del administrador y la
contrasea (ambos se han determinado en el ar
chivo edit.inc.php) se abre el archivo ad
mininc.php, Lo he vinculado al principio de
<?php
if (!empty($_POST['lognameJ) && !empty($_POST['logpw'])) {
if ($_POST['logname1J == $user && $_POST['logpw'] == $password)
setcookie ( conect.arv, 11
true") ;
echo 11
<script language=1javascript' type='text/javascript'>
self.location=\11$_SERVER[PHP_SELF]?start=$start&step=$step\11
</script>";
if (isset($_GET['desconectar']))
setcookie ( conect arv , 1111, 3600);
echo "<script language='javascript' type='text/javascript1>
self.location=\11$_SERVER[PHP_SELF]?start=$start&step=$step\11
</script>11;
?>
<?php
)) {
if (isset($_GET['eliminar']) && isset($_COOKIE[1conectar1 }
1 11
$sql3 = SELECT Imagen FROM gb_tabla WHERE id= 1 $_GET [id]
11
;
$result3 = mysql_query($sql3);
$row = mysql_fetch_assoc($result3);
$sql4 = "DELETE FROM gb_tabla WHERE id='$_GET[id] '";
if (mysql_query($sql4)) {
echo 11
<h3>Actualizacin c:strong>satisfactoria</strong>,
fila $_GET[id] eliminada.</h3>11 ;
if ( !empty($row l t Jmaqen t L) ) {
if (unlink ( 11 img/$row [Imagen] 11)
)
else
echo 11<h3>Actualizaci6n <b>no</b> satisfactoria.</h3>11 ;
echo 11{ <a href=1$_SERVER(PHP_SELF]?step=$step&start=$start1>Todo correcto.</a>
] 11 ;
Puedes deducir por ti mismo cmo funciona A continuacin, selecciono la fila de datos de
este script? En primer lugar comprobamos por seada valindome del id de la base de datos, y
seguridad si todava existe una cookie de co determino el nombre de la imagen.
nexin.
En otra consulta SQL elimino toda la fila de da
Sera fatal si la propia existencia del parme tos. Si se logra eliminar correctamente, se
tro eliminar permitiese que se eliminasen da muestra un mensaje de confirmacin. Mi script
tos. intenta tambin eliminar el archivo de imagen
en caso de que exista.
rea de administracin 75
INTRODUCCIN, ACTUALIZACIN
Y ELIMINACIN DE DATOS ................... 34
MOSTRAR, FILTRAR, ORDENAR
Y VINCULAR DATOS .......................... 36
CONSULTAR DOS TABLAS
SIMULTNEAMENTE CON JOIN .................. 39 ISBN 2-915605-46-7
QUE NO TE PASE NADA POR ALTO:
uso DE LEFT JOIN ................................. 41
PHP Y MYSQL: MOSTRAR LOS DATOS 111111111111
COMO PGINA HTML ......................... 43
9 782915 605464