Beruflich Dokumente
Kultur Dokumente
UNIDADES DIDÁCTICAS:
6. Utilización de MySQL
8. Utilidades prácticas
MÓDULO 3
Utilización de MySQL
Unidad 6
Índice de la unidad:
3. Servidor MySQL
4. Sentencias MySQL
5. Resumen
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Introducción
En esta Unidad vamos conocer a la arquitectura de una aplicación web que
utiliza bases de datos.
- 279 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
En este gráfico aparecen sólo dos de las tres capas (tiers) que integran el
proceso completo de interpretación de una página web.
Pero ahora, llegado el momento, debemos añadir una tercera capa o nivel, que
está integrada por la base o bases de datos con las que conecta el servidor y
de las que extrae la información solicitada por el cliente. Es decir, el servidor,
cuando encuentra en el programa órdenes y funciones de creación,
modificación y consulta de una base de datos, acceda a ella y extrae, elimina o
actualiza esa información, según las operaciones que deban ejecutarse en el
script.
Este tipo de enlace es más rápido y eficaz cuando se trabaja sólo con un
tipo de base de datos, pero exige cambiar el código si se utiliza otro tipo
de base de datos (los nombres de cada función son diferentes, el orden
de los argumentos distinto, las funcionalidades disponibles son distintas,
etcétera). Por ejemplo, Oracle y MySQL tienen APIs (bibliotecas de
funciones que en PHP se denominan extensiones) completamente
diferentes.
- 280 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 281 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 282 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Columnas
Título Autor Editorial
Antonio Muñoz
El invierno en Lisboa Seix Barral
Molina
Fondo de Cultura
¿Tener o ser? Erich Fromm
Económica
Filas
Crónica de una muerte Gabriel García
Bruguera
anunciada Márquez
El lobo estepario Hermann Hesse Anaya Editores
La vida está en otra
Milan Kundera Seix Barral
parte
- 283 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
El tipo o extensión de estos ficheros de base de datos puede ser muy variado,
según el tipo de base de datos utilizado: en dBase es dbf (Data Base File,
Fichero de Base de Datos), en Access mdb, en Interbase db o dbf, en MySQL
myd, etcétera.
Así pues, un fichero de base de datos está integrado por registros, que son
cada uno de sus elementos o componentes (flor, río, libro, coche, amigo,
artículo, cliente, venta o factura). Todos los registros contienen un conjunto de
campos en los que se almacena su información; este conjunto define la
estructura del fichero que integra una base de datos.
Campos
- 284 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
10
11
En las filas aparecen hasta once registros cada uno de los cuales, en este
caso, contiene los cinco campos siguientes: Nombre, Sueldo, Fecha_nac,
Observacion y Foto.
En el ejemplo anterior sólo se han incluido once registros y cinco campos, pero
de hecho en las bases de datos que vamos a usar el número de registros es
ilimitado (depende de la capacidad del soporte) y el de campos es muy amplio,
según el tipo de base de datos usada. Todos los registros tienen los mismos
campos.
NOTA: este apartado no pretende ser una descripción exhaustiva del uso de la
base de datos MySQL y del lenguaje SQL. Tiene como objetivo recordar los
conceptos básicos de la programación con Bases de datos.
El nombre de cada campo puede ser muy largo, si bien recomendamos que en
el orden práctico sea lo más breve posible y tenga algún significado. Debe
atenerse a las reglas de todos los identificadores ya comentadas
anteriormente.
- 285 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
5. Campo de tipo serie. Es un campo donde se puede poner uno de los valores
incluidos en una lista o serie de valores. MySQL admite aquí los valores
siguientes: ENUM y SET.
Hemos dicho que los archivadores de una biblioteca o de una agenda pueden
considerarse, en cierta forma, bases de datos, pues en ellos se almacena
información en un determinado orden y es posible buscar esta información,
consultarla, modificarla o eliminarla con facilidad.
Supongamos ahora que necesitamos seleccionar todas las fichas en las que
aparece la misma editorial. De nuevo la tarea puede parecernos pesada y
- 286 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Hemos puesto este ejemplo para explicar los graves problemas que se derivan
de la gestión manual de la información. Las dificultades aumentan a medida
que crece el volumen de información que debe manejarse y según sean los
criterios de ordenación y selección.
En segundo lugar, el espacio que ocupa una base de datos es mucho menor
que el de cualquier otra forma de archivo manual. En un disco flexible de 3,5
pulgadas puede almacenarse casi un millón y medio de caracteres. En los
discos duros de los actuales servidores el volumen de información puede ser
prácticamente ilimitado.
- 287 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Por ejemplo, en el gráfico siguiente puede observarse una tabla que contiene
diversos datos de personas:
|___________|________|___|_____|
Columnas (Campos)
Generalmente, una base de datos no consta de una sola tabla, sino de varias.
- 288 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Estas tablas no son independientes unas de otras, sino que tienen al menos un
campo común con las otras a través del cual se puede acceder a la información
que contienen todas en conjunto.
Por ejemplo, la base de datos de una biblioteca puede estar integrada por una
tabla de libros, otra de lectores, otra de préstamos y otra de editoriales. El
fichero de libros puede contener la información completa de cada volumen:
título, autor, editorial, año de edición, precio, número de páginas, código de
materia, número de registro, etcétera.
Como puede verse, la información no debe repetirse en todos los ficheros, pero
sí debe poder relacionarse. Por ejemplo, los ficheros de libros y editoriales,
tienen en común el campo EDITORIAL. Los ficheros de libros y préstamos
tienen en común, al menos, el NÚMERO DE REGISTRO del libro prestado,
gracias a lo cual desde uno se puede acceder a los datos del otro. Los ficheros
de lectores y préstamos tienen en común el campo CARNÉ, etcétera.
Hay otro tipo de base de datos que está orientado a los objetos (ODBMS,
Object Oriented DBMS) en las que cada dato es tratado como si fuera un
- 289 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
objeto con sus atributos y métodos. Son de este tipo ObjectStore, Versand,
GemStore, etcétera.
También hay otro tipo que reúne características propias de los dos tipos
anteriores, como PostgreSQL, que son conocidas como ERDBMS (Extended
Relacional DBMS) y como ORDBMS (Object Relational DBMS). PHP puede
tratar prácticamente todas las bases de datos mencionadas.
Diseñar una base de datos consiste en determinar los datos que van a
introducirse en ella, la forma como se van a organizar y el tipo de esos datos.
Además, se debe precisar la forma como se van a solicitar y las clases de
operaciones que hay que realizar con los mismos: aritméticas, lógicas, de
fechas, de carácter, etcétera. También conviene conocer los resultados
concretos que se espera obtener: consultas, informes, actualizaciones,
documentos, etcétera.
- 290 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 291 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
parecido, etcétera.
- 292 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Con el fin de asimilar bien los contenidos sobre las bases de datos, en esta
Unidad sólo se van a explicar de forma sencilla y práctica dos asuntos
importantes:
Con los conocimientos anteriores bien asimilados, será más fácil comprender
con detalle y aplicar correctamente las funciones de PHP que permiten
conectarse a una base de datos, realizar consultas, acceder a los resultados de
las consultas y realizar otras operaciones auxiliares e informativas sobre
cualquiera de las bases de datos que usamos en el curso. También será
posible utilizar el lenguaje de consulta SQL para obtener informes. Esto es
precisamente lo que abordaremos en la Unidad siguiente.
Para tener acceso a las bases de datos, en primer lugar, hay que arrancar el
servidor de datos MySQL.
- 293 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 294 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
se muestra a continuación:
mysql> Si escribimos
mysql> \h
aparece la
- 295 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
MySQL Workbench
http://www.mysql.com/products/workbench/
- 296 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 297 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 298 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 299 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Haciendo clic sobre la nueva conexión “curso PHP 5” conectamos el gestor con
el servidor MySQL local:
- 300 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 301 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 302 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 303 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Así pues, para estudiar este tema, hay que activar el Servidor MySQL de
XAMPP y el Cliente MySQL Workbench para observar lo que pasa.
Para trabajar con una base de datos, en primer lugar hay que crearla. Se hace
con la orden create database seguida del nombre que queremos darle. Para
crear la base de datos “almacen”, escribimos
- 304 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Como puede ocurrir que ya exista un base de datos con el mismo nombre que
la se pretende crear, en cuyo caso aparecería un error de creación de la base
de datos, lo mejor es usar la sintaxis condicional create database if not
exists almacen;. De esta forma, si la base de datos existe, no se crea una
nueva destruyendo la anterior.
La sentencia show databases; se usa para mostrar todas las bases de datos
que haya en el servidor MySQL. Podemos observarlo en la ventana siguiente:
Para poder usar una base de datos, por ejemplo para acceder a sus tablas, es
preciso abrirla antes, operación que se realiza con la sentencia use <nombre de
la base de datos>. Por ejemplo, si queremos abrir la base de datos “almacen”,
escribiremos use almacen y, si se ha podido abrir, el sistema muestra el
mensaje de confirmación Database changed . A partir de aquí, ya podemos
crear tablas en su interior o acceder a los registros y campos de las mismas. Si
usamos la aplicación Cliente MySQL Workbench basta con hacer doble clic
- 305 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
sobre el nombre de la base de datos que queremos usar; veremos que su texto
cambia a negrita indicándonos que está activa.
Una vez que hemos abierto la base de datos “almacen”, vamos a crear tres
tablas sencillas dentro de la misma: “productos”, “compras” y “clientes”. Para
crear la tabla “productos”, damos la orden siguiente:
Con esta orden hemos creado, dentro de la base de datos “almacen”, la tabla
“productos”, que tiene esta estructura:
- 306 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 307 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Por eso, lo más cómodo y productivo es crear ficheros de texto, es decir, script
MySQL, que se guardan donde nos convenga con la extensión sql. En ellos se
escriben las sentencias MySQL que deseamos se ejecuten cuando sea
necesario.
Una vez escrito y guardado el fichero con la extensión sql, se puede ejecutar
de dos formas:
Si las sentencias del fichero sql son muchas y se ejecutan seguidas de forma
que el resultado ocupa más de una pantalla, puede utilizarse el comando More
de la ventana de comandos para detener la ejecución en cada pantalla.
Escribir, entonces,
- 308 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Puede verse el fichero script MySQL con el que hemos creado la base de datos
“almacen” y sus tres tablas “productos”, “compras” y “clientes”. Como no es un
fichero de PHP, no puede interpretarse ni generar una página web, sino sólo
sirve para crear esta base de datos. En la Unidad siguiente aprenderemos a
hacerlo con funciones de PHP.
Con los ejemplos de esta Unidad, referidos todos a MySQL, sólo pretendemos
que el alumno asimile bien los principales contenidos sobre las bases de datos
y sus tablas.
- 309 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
concreto, dentro del propio Cliente MySQL Workbench puede obtenerse ayuda
en inglés sobre los diferentes comandos que admite MySQL. Siempre que lo
necesite, el alumno puede consultarlo si no dispone de otro material que le
resulte más asequible:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
- 310 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 311 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
5. Otras funciones, como max() para hallar el valor máximo numérico y min()
para buscar el mínimo.
La cláusula from (desde) indica el origen de las tablas en las que está archivada
la información. Detrás de ella debe escribirse el nombre de la tabla o tablas,
separadas por comas, de las que se quiere obtener la información. Dentro de
ésta puede asignarse un alias o nombre más sencillo, breve y manejable con el
que deseamos referirnos en adelante a cada tabla. Por ejemplo, en las tablas
“productos” y “clientes” hay un campo denominado “nombre”. Para poder
identificar cada uno dentro de una misma cláusula select, debemos escribir:
select productos.nombre,clientes.nombre
from productos,clientes;
De una forma más breve, podíamos haber usado un alias para cada tabla así:
La cláusula where (donde) se usa para seleccionar sólo los registros de una
tabla que cumplan una determinada condición. Por ejemplo, la instrucción
mostrará todos los campos de la tabla “productos” que lleven como contenido
“Pala” en el campo nombre.
select nombre,tipo
from clientes where year(alta)>2013;
- 312 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
select descuento,count(*)
from productos group by descuento;
La cláusula having (si hay) permite limitar el número de grupos poniendo una
condición a la integración de los grupos. Debe usarse sólo detrás de group by
para insertar la condición. Por ejemplo, la instrucción
select descuento,count(*)
from productos group by descuento
having count(*)>1;
Desde la versión 4.0 del servidor MySQL es posible también utilizar las
Subqueries (subconsultas). Es decir, utilizar el resultado de una consulta dentro
de otra. Por ejemplo, la instrucción
- 313 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
obtiene todos los registros de la tabla “clientes” que tengan dado de alta algún
registro en la tabla “compras”.
Además, desde la versión 4.0 del servidor MySQL también es posible también
utilizar las JOINS (uniones). Las joins son básicamente la combinación de dos
o más registros de diferentes tablas usando alguna sentencia de comparación.
Por ejemplo, la instrucción siguiente muestra el mismo resultado que la anterior
Como suele ser muy común confundirse con las distintas combinaciones que
se pueden realizar en las consultas entre varias tablas, vamos a aclarar las
diferencias entre cada una.
Por ejemplo, seleccionamos todos los registros de la tabla clientes que tengan
algún registro dado de alta en la tabla compras:
- 314 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 315 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Para modificar el contenido de los registros de una tabla, hay que utilizar la
sentencia update , que tiene esta sintaxis:
Por ejemplo, si queremos que en la tabla “productos” dentro del campo stock
se ponga el valor 120 en aquellos registros que contengan el valor 100,
podemos usar la instrucción
Error Code: 1175. You are using safe update mode and you tried to
update a table without a WHERE that uses a KEY column To disable safe
mode, toggle the option in Preferences -> SQL Queries and reconnect.
- 316 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Nota: este error aparecerá también para algunas consultas siguientes que no
usan un campo clave para filtrar los registros mostrados.
modifica el actual valor NULL del campo baja con la fecha y hora actuales, e
incrementa el campo deudas_euros en el 10 %, en todos los registros
- 317 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Borrar registros
deja la tabla sin registros, pero no la elimina. No es frecuente eliminar todos los
registros de golpe. Por eso, casi siempre se utiliza la cláusula where para
seleccionar los registros que se desea eliminar. Por ejemplo, la instrucción
Por ejemplo, para eliminar los registros cuyo código de cliente es 1 tanto en la
tabla clientes como en compras escribimos:
- 318 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Los índices están asociados al fichero de los datos y sirven para mantener en
orden los registros de una tabla.
Para cada tabla sólo puede haber un índice primario, que ordena los registros
por uno o más campos al ir introduciendo los registros en una tabla. Un índice
primario identifica los registros de una tabla de forma única. Si se observa las
tres tablas creadas por nosotros, “productos”, “compras” y “clientes”, puede
verse que hemos generado en todos los casos un índice primario por el campo
“codigo”, de forma que éste será el orden natural al ir introduciendo los
registros. Este campo se autoincrementa de forma que, según se van
añadiendo registros, cada uno va tomando un número consecutivo.
La opción unique debe usarse cuando queremos que sólo haya un registro con
la misma clave, de forma que, al introducir otro con la misma, no se permita
hacerlo. La opción fulltext sólo puede usarse con campos de tipo varchar y
text, e indica que se tome su texto completo como clave de ordenación. Si se
usan como claves campos de tipo char y varchar, se puede indicar una
longitud de la clave de ordenación, sin que sea necesario usar el campo
completo. Si se usan como claves campos de tipo blob y text, es
imprescindible indicar una longitud de la clave de ordenación.
- 319 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Para eliminar una tabla hay que usar la sentencia drop table, que tiene esta
sintaxis:
Para eliminar una base de datos hay que usar la sentencia drop database, que
tiene esta sintaxis:
Por ejemplo, si queremos eliminar la base de datos “almacen”, hay que usar la
instrucción
- 320 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Notas importantes
1. Los siete ejemplos de este apartado no son código php, por lo cual no
pueden interpretarse ni generar páginas web como hemos hecho hasta ahora.
3. Por otra parte, la utilidad Cliente MySQL Workbench puede ayudarnos a ver
los datos y a comprender más intuitivamente lo que pasa en cada proceso.
Para ejecutar scripts complejos con varios comandos SQL seguidos de ";"
debes usar la opción del Menú File/Open SQL Script.
- 321 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
Resumen
- 322 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 323 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -
- 324 -
MÓDULO 3
Unidad 7
Índice de la unidad:
6. Resumen
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Introducción
En esta Unidad vamos a aprender a conectarse al servidor que contiene el
gestor de bases de datos MySQL. Además, crearemos una base de datos,
nos conectaremos a ella y borraremos sus tablas e información, sabiendo
utilizar, además, las funciones que controlan los posibles errores.
Veremos cómo consultar una base de datos utilizando queries en las que
intervengan las principales funciones de PHP para acceder a bases de
datos de tipo MySQL y tratar su información.
Si los alumnos y alumnas del curso han comprendido y asimilado bien los
conceptos fundamentales sobre las bases de datos relacionales, explicados en
- 327 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Para realizar una conexión con una base de datos hay que crear una instancia
de la clase PDO, que se utilizará en todas las consultas posteriores. En todas las
páginas PHP en las que usen consultas a bases de datos es necesario
conectar primero con dicha base de datos.
Para poder acceder a MySQL mediante PDO, debe estar activada la extensión
php_pdo_mysql en el archivo de configuración php.ini. El servidor XAMPP ya
trae por defecto activada esta extensión.
Como hemos visto, para establecer una conexión con el servidor MySQL,
pueden utilizarse hasta cinco datos:
3. Usuario: nombre del usuario que accede a la base de datos. Por defecto es
el que tenga el propietario del servidor. En el servidor XAMPP es “root”.
- 328 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
try {
$db = new PDO("mysql:host=mihost;dbname=
mi_base_de_datos;charset=utf8", joseja, garcia);
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$db->setAttribute(PDO::NULL_TO_STRING, true);
} catch (PDOException $e) {
die ("<p><H3>No se ha podido establecer la conexión.
<P>Compruebe si está activado el servidor de bases de
datos MySQL.</H3></p>\n <p>Error: " . $e->getMessage() .
"</p>\n");
}
Hay que tener en cuenta que, para que estos datos sean aceptados como
válidos, es necesario que el servidor se denomine así. Además, el nombre del
usuario, la clave y la base de datos deben haber sido dados de alta en el
servidor MySQL antes de pretender usarlos, ya que el servidor procede a
autentificar estos datos antes de permitir la conexión.
Entre los más importantes podemos encontrar los atributos que controlan el
formato del nombre de los campos de la base de datos (PDO::ATTR_CASE) y el
tipo de errores que mostrarán las consultas a la base de datos
(PDO::ATTR_ERRMODE).
- 329 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Ahora bien, como esta instrucción, si se consigue, devuelve un objeto que sirve
de conexión a la base de datos que después hemos de utilizar, lo mejor es
asignar a una variable el nombre de este identificador, de esta forma:
Por otra parte, puede ser que no se logre conectar, en cuyo caso se produciría
una excepción del tipo PDOException que contiene un mensaje en inglés. Para
optimizar un poco la salida en este caso, lo mejor es utilizar un bloque
try…catch y la función die(), para prescindir del mensaje del sistema, y
mostrar un mensaje personalizado, de esta forma:
try {
$db = new PDO("mysql:host=mihost;dbname=
mi_base_de_datos;charset=utf8", joseja, garcia);
...
} catch (PDOException $e) {
die ("<p><H3>No se ha podido establecer la conexión.
<P>Compruebe si está activado el servidor de bases de
datos MySQL.</H3></p>\n <p>Error: " . $e->getMessage() .
"</p>\n");
}
<?php
- 330 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
define("SERVIDOR", "localhost");
define("USUARIO", "root");
define("CLAVE", "");
<?php
require("uni7_utilidades.php");
$db = conectaBD();
?>
Aunque en este curso sólo se usa el gestor de base de datos MySQL, ponemos
a continuación ejemplos para mostrar cómo que se conectaría a otros tipos de
bases de datos de las que pudiera disponer particularmente el alumno. En todo
- 331 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 332 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Es importante saber que si se borra una base de datos, ésta no sólo pierde el
contenido, sino que, después, no se pueden recuperar sus datos.
Para crear una base de datos de tipo MySQL asociada a una conexión PDO,
hay que utilizar directamente una query, es decir, es necesario ejecutar una
consulta SQL.
- 333 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Array
(
[0] => HY000
[1] => 1007
[2] => Can't create database 'pruebas'; database exists
)
Para eliminar una base de datos de tipo MySQL asociada a una conexión, de
nuevo, hay que usar usando una query, es decir, ejecutar una consulta SQL.
Recordamos que para asimilar bien el método query(), hay que estudiarla
detenidamente en el apartado siguiente, donde se aborda.
Creación de tablas
Como hemos dicho, PHP no dispone de funciones para crear tablas dentro de
las bases de datos. Ésta es más bien una operación del administrador del
servidor que contiene la información. Por ello, quien necesite crear tablas
- 334 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
dentro de una base de datos ha de recurrir a scripts de tipo sql que puede
ejecutar mediante la utilidad MySQL Workbench. De todo ello hemos hablado y
realizado suficientes prácticas en la Unidad 6.
$db->query($consulta);
- 335 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
En este apartado vamos estudiar las funciones que permiten realizar consultas
y elaborar informes a partir de la información contenida en las tablas de una
base de datos. Concretamente, nos vamos a conectar a la base de datos
“biblioteca”, y a servirnos de su información para elaborar los informes y
realizar las queries (consultas) de este apartado.
Ahora necesitamos conocer y recordar las sentencias SQL que vamos a poner
como argumentos de las funciones de PHP. En la Unidad 6 se explicaron las
más importantes. Si el alumno tiene alguna duda sobre la interpretación de las
mismas, puede recurrir a los contenidos de la Unidad anterior o bien consultar
algún manual propio sobre SQL o buscar información en las direcciones de
Internet, indicadas en la Presentación del curso, que hacen referencia a este
lenguaje.
El método query() de la clase PDO envía una sentencia SQL al servidor para
que éste la interprete. Su sintaxis es ésta:
query(consulta)
$resultado = $db->query($consulta);
if (!$resultado) {
- 336 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
$error=$db->errorInfo();
print "<p>Error en la consulta. Error ". $error[2] ."</p>\n";
} else {
echo "<P>Resultado Consulta de la tabla 'libros':<P>
<TABLE border=1><TR><TD>Título</TD><TD>Autor</TD></TR>";
foreach ($resultado as $valor) {
print "<TR><TD>$valor[titulo]</TD>
<TD>$valor[autor]</TD></TR>\n";
}
echo "</TABLE>";
}
$datos_resultado = $resultado->fetchAll();
echo $datos_resultado[0][0].' de '. $datos_resultado[0][1];
echo $datos_resultado[1][0].' de '. $datos_resultado[1][1];
- 337 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
fetch()([tipo_resultado, [sentido_movimiento_puntero
[,cantidad_avance_puntero]]])
Si dos o más campos del resultado tienen el mismo nombre, el último tiene
prioridad. Para acceder a los otros campos con el mismo nombre, hay que
especificar el índice numérico o definir un alias para esos campos. Por ejemplo,
en nuestra base de datos “biblioteca” las tres tablas tiene el campo homónimo
“registro”. Para que en la matriz resultante de la consulta se distingan los tres,
deberíamos escribir así la sentencia SQL:
- 338 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 339 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Array
(
[titulo] => El túnel
[0] => El túnel
[editorial] => Alfaguara
[1] => Alfaguara
[anno_publica] => 2000
[2] => 2000
[paginas] => 128
[3] => 128
[precio_euros] => 5.650
[4] => 5.650
)
Array
(
[titulo] => Instinto de Inez
[0] => Instinto de Inez
[editorial] => Alfaguara
[1] => Alfaguara
[anno_publica] => 2001
[2] => 2001
[paginas] => 189
[3] => 189
[precio_euros] => 20.550
[4] => 20.550
)
...
$consulta="select titulo,editorial,anno_publica,paginas,
precio_euros from libros where editorial='Alfaguara'
order by titulo";
$resultado = $db->query($consulta);
if (!$resultado) {
print "<p>Error en la consulta.</p>\n";
} else {
echo "<P>Resultado Consulta de la tabla 'libros':<P>
<TABLE border=1><TR><TD>Título</TD>
<TD>Editorial</TD><TD>Año publicación</TD>
<TD>Páginas</TD><TD>Precio</TD></TR>";
foreach ($resultado as $valor) {
print "<TR><TD>$valor[titulo]</TD>
<TD>$valor[editorial]</TD>
<TD>$valor[anno_publica]</TD>
<TD>$valor[paginas]</TD>
<TD>$valor[precio_euros]</TD></TR>\n";
}
echo "</TABLE></P>";
echo "<CENTER><H4>En la consulta anterior se han visto
- 340 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Array
(
[native_type] => VAR_STRING
[pdo_type] => 2
[flags] => Array
(
[0] => not_null
)
[table] => usuarios
[name] => Nombre
[len] => 15
[precision] => 0
)
- 341 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
El método exec() de la clase PDO envía una sentencia SQL al servidor para
que éste la interprete y devuelva el número de filas que ha afectado la consulta.
Su sintaxis es ésta:
exec(consulta)
<?php
// Dibuja un botón sencillo mediante una tabla HTML
function boton_ficticio($caption,$url)
{
return "<TABLE border=1 CELLSPACING=0 CELLPADDING=3 bgcolor=black>
- 342 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
<TR><TD bgcolor=\"white\">
<FONT size =\"‐1\">
<a href = \"$url\">$caption</A>
</FONT>
</TD></TR></TABLE>";
}
/* Fijamos las constantes de la conexión al servidor MySQL.
El nombre del servidor es el que admite por defecto el servidor
local.*/
define("SERVIDOR", "localhost");
define("USUARIO", "root");
define("CLAVE", "");
class agenda {
protected $db;
function __construct($BD="") //Esto es el constructor
{
/* Intentamos establecer una conexión con el servidor.*/
try {
if ($BD!='')
$this‐>db = new PDO("mysql:host=" . SERVIDOR .
";dbname=" . $BD .";charset=utf8", USUARIO,
CLAVE, array(PDO::MYSQL_ATTR_INIT_COMMAND
=> "SET NAMES 'utf8'"));
else
$this‐>db = new PDO("mysql:host=" . SERVIDOR.
";charset=utf8", USUARIO, CLAVE,
array(PDO::MYSQL_ATTR_INIT_COMMAND
=> "SET NAMES 'utf8'"));
$this‐>db‐>setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,
true);
// Indicamos como atributo que se debe devolver una cadena
// vacía para los valores nulos
$this‐>db‐>setAttribute(PDO::NULL_TO_STRING, true);
// Si no indicamos la BD es que hay que crearla de nuevo
if ($BD=='') {
// Ejecutamos la SQL de Creación de BD directamente
// en el servidor MySQL.
/* Intentamos crear la base de datos "ejercicios".
* Si se consigue hacerlo, se informa de ello.
* Si no, también se informa y se indica cuál es el
* motivo del fallo con el mensaje de error.*/
$sql = file_get_contents('ejercicios.sql');
$this‐>ejecuta_SQL($sql);
}
} catch (PDOException $e) {
die ("<p><H3>No se ha podido establecer la conexión.
<P>Compruebe si está activado el servidor de
bases de datos MySQL.</H3></p>\n <p>Error: " .
$e‐>getMessage() . "</p>\n");
} // end try
}//end function constructor
function __destruct() //Esto es el destructor
- 343 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
{
if (isset($db)) // Desconectamos de la BD
$db=null;
}//end destructor agenda
// Añadir un contacto a la lista
function add_contacto ($registro, $Nombre, $Apellidos,
$Telefono_oficina, $Telefono_movil,$email,
$direccion, $localidad, $provincia, $codigo_postal,
$telefono, $notas)
{
if ($registro>0)
$sql_script = "UPDATE agenda SET
Nombre='$Nombre', Apellidos='$Apellidos',
Telefono_oficina='$Telefono_oficina',
Telefono_movil='$Telefono_movil',email='$email',
direccion='$direccion', localidad='$localidad',
provincia='$provincia',
codigo_postal='$codigo_postal',
telefono='$telefono', notas='$notas'
WHERE registro=$registro";
else
$sql_script = "INSERT INTO agenda (Nombre, Apellidos,
Telefono_oficina, Telefono_movil, email, direccion,
localidad, provincia, codigo_postal, telefono,
notas)
VALUES('$Nombre', '$Apellidos', '$Telefono_oficina',
'$Telefono_movil','$email', '$direccion',
'$localidad', '$provincia',
'$codigo_postal','$telefono', '$notas')";
$this‐>ejecuta_SQL($sql_script);
}//end add_contacto
// Nº total de contactos
function nume_contacto () {
$sql_script = "SELECT * FROM agenda";
$resultado=$this‐>ejecuta_SQL($sql_script);
// Devolvemos el nº de filas que devuelve la consulta
return $resultado‐>rowCount();
}
// Borrar contactos
function del_contacto($id_to_del) {
$sql_script = "delete FROM agenda where registro=$id_to_del";
$this‐>ejecuta_SQL($sql_script);
}
// Vaciar tabla contactos
function del_all_contacto() {
$sql_script = "delete FROM agenda";
$this‐>ejecuta_SQL($sql_script);
}
// Añadir o modificar contactos
function introduce($id_to_edit, $ver) {
- 344 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
$campos=array(
0=>array(0=>"Nombre",1=>"Nombre",2=>15, 3=>30, 4=>""),
1=>array(0=>"Apellidos",1=>"Apellidos",2=>30, 3=>100, 4=>""),
2=>array(0=>"Telefono_oficina",
1=>"Teléfono oficina",2=>15, 3=>30, 4=>""),
3=>array(0=>"Telefono_movil",
1=>"Teléfono móvil",2=>15, 3=>30, 4=>""),
4=>array(0=>"email",1=>"e‐Mail",2=>40, 3=>200, 4=>""),
5=>array(0=>"direccion",1=>"Dirección",2=>30, 3=>150, 4=>""),
6=>array(0=>"localidad",1=>"Localidad",2=>30, 3=>100, 4=>""),
7=>array(0=>"provincia",1=>"Provincia",2=>30, 3=>60, 4=>""),
8=>array(0=>"codigo_postal",1=>"Cód. Postal",2=>5, 3=>5, 4=>""),
9=>array(0=>"telefono",
1=>"Teléfono personal",2=>30, 3=>100, 4=>""),
10=>array(0=>"notas",1=>"Notas",2=>65, 3=>254, 4=>""));
if ($id_to_edit>0) {
$sql_script = "SELECT Nombre, Apellidos, Telefono_oficina,
Telefono_movil, email, direccion, localidad,
provincia, codigo_postal, telefono, notas
FROM agenda where registro='$id_to_edit'";
$resultado=$this‐>ejecuta_SQL($sql_script);
$filas = $resultado‐>rowCount();
if ($filas==0) { //resultado query vacío
echo "<CENTER>
<TABLE BORDER=1 WIDTH=600 bordercolorlight='#FFFFFF'
bordercolor='#FFFFFF' bgcolor='#C0C0C0'>
<TR><TD ALIGN=CENTER VALIGN=CENTER>
<H2>No se encuentra ningún registro</H2>
</TD></TR></TABLE></CENTER>";
}
else //la búsqueda no es vacía
{
$myrow = $resultado‐>fetchAll();;
for ($i=0; $i < count($campos); $i++)
$campos[$i][4]=$myrow[0][$i];
}
}//end if $id_to_edit>0
if ($ver==0)
echo "<FORM name='form9' method='post'
action=\"index_agenda.php?operacion=exec_alta\">";
echo "<TABLE BORDER='0' cellspacing='10' cellpadding='0'
align='center' width='600'>";
for ($i=0; $i < count($campos); $i++){
echo "<TR><TD bgcolor='teal' align=center width=140>
<FONT size=‐1 color='white'>".$campos[$i][1]."</FONT>
</TD><TD>";
if ($ver==1)
echo "<FONT size=‐1><B>". $campos[$i][4]."</B></FONT>";
else echo "<input type='text' name='".$campos[$i][0].
"' size='".$campos[$i][2]."' value =
\"".$campos[$i][4]. "\"
maxlength='".$campos[$i][3]."'>";
echo "</TD>
</TR>";
- 345 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
}//for
echo "</TABLE><CENTER>";
if ($ver==0) {
echo "<INPUT type='hidden' NAME='registro' value =
'$id_to_edit'>";
if ($id_to_edit>0) //estamos modificando
echo "<INPUT TYPE='SUBMIT' NAME='pulsa'
VALUE=\"Modificar contacto\">";
else echo "<INPUT TYPE='SUBMIT' NAME='pulsa'
VALUE=\"Alta contacto\">";
}
echo "</CENTER>";
if ($ver==0) echo "</FORM>";
}//end Añadir o modificar contactos
// Buscar contactos
function buscar($lo_q_busco) {
if ($lo_q_busco!="")
$sql_script="SELECT * FROM agenda
WHERE apellidos like '%".$lo_q_busco."%'
ORDER BY apellidos";
else $sql_script = "SELECT * FROM agenda order by apellidos";
$resultado=$this‐>ejecuta_SQL($sql_script);
$filas = $resultado‐>rowCount();
if ($filas==0) { //resultado query vacío
echo "<CENTER>
<TABLE BORDER=1 WIDTH=650 bordercolorlight='#FFFFFF'
bordercolor='#FFFFFF' bgcolor='#C0C0C0'>
<TR><TD ALIGN=CENTER VALIGN=CENTER>
<H2>No se encuentra ningún registro</H2>
</TD></TR></TABLE></CENTER>";
}else //la búsqueda no es vacía
echo "<TABLE BORDER='0' cellspacing='1' cellpadding='1'
align='center' width='650'>
<TR>
<TH bgcolor='teal'>
<FONT color='white'>Nombre</FONT>
</TH>
<TH bgcolor='teal'>
<FONT color='white'>Apellidos</FONT>
</TH>
<TH bgcolor='teal'>
<FONT color='white'>Teléfono</FONT>
</TH>
<TH bgcolor='teal' colspan='3'>
<FONT color='white'>Operaciones</FONT>
</TH>
</TR>";
foreach ($resultado as $valor)
{
echo "<TR>
<TD><FONT size='‐1'><B>$valor[Nombre]</B></FONT></TD>
<TD><FONT size='‐1'><B>$valor[Apellidos]</B></FONT></TD>
- 346 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
<TD><FONT size='‐1'>
<B>$valor[Telefono_oficina]</B></FONT></TD>
<TD>".boton_ficticio("Consulta","
index_agenda.php?operacion=
introduce&ver=1&nume=$valor[registro]#ancla")."</TD>
<TD>".boton_ficticio("Editar","index_agenda.php?operacion=
introduce&ver=0&nume=$valor[registro]#ancla")."</TD>
<TD>".boton_ficticio("Borrar","index_agenda.php?operacion=
borrar&nume=$valor[registro]")."</TD>
</TR>";
} // end bucle
echo "</TABLE>";
}//END function Buscar contactos
// Función que ejecuta una SQL
function ejecuta_SQL($sql) {
$resultado=$this‐>db‐>query($sql);
if (!$resultado)
{
echo"<H3>No se ha podido ejecutar la consulta:
<PRE>$sql</PRE><P><U> Errores</U>: </H3><PRE>";
print_r($this‐>db‐>errorInfo());
die ("</PRE>");
}
return $resultado;
} // end ejecuta_SQL
}//END clase agenda
?>
$sql = file_get_contents('ejercicios.sql');
$this->ejecuta_SQL($sql);
Si ejecutas este programa puedes ver una página que, mediante una clase
PDO se gestiona el contenido de una agenda almacenado en la base de datos
MySQL de XAMPP:
- 347 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 348 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Consultas preparadas
- 349 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Las consultas preparadas son tan útiles que la biblioteca PDO de PHP las
puede emular para los tipos de bases de datos que no las admitan. Así, el
código fuente es compatible en todas los tipos de base datos soportadas por
PDO.
<?php
// Insertar un usuario
$nombre = 'Nombre 1';
$apellidos = 'Apellidos 1';
$resultado->execute();
- 350 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
?>
$resultado = $db->prepare($consulta);
// Esta parte del código se puede ejecutar de forma separada
if ($resultado->execute(array(":nombre" => $_POST["nombre"],
":apellidos" => $_POST["apellidos"],
":dni"=>$_POST["dni"],
":fecha"=>"1962-09-10",
":domicilio"=>$_POST["domicilio"],
":localidad"=>$_POST["localidad"],
":provincia"=>$_POST["provincia"],
":sueldo"=>"2000",
":telefono"=>$_POST["telefono"])))
{
print "<p>Registro creado correctamente.</p>\n";
} else {
print "<p>Error al crear el registro.</p>\n";
}
- 351 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 352 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 353 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 354 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Una vez instalado el driver ODBC para MySQL, debemos ejecutar la utilidad
Configurar orígenes de Datos (ODBC) que se encuentra en el Panel de Control
de Windows:
- 355 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 356 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 357 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Veamos cómo podemos conectarnos a una base de datos MySQL que está en
un servidor remoto usando un cliente Windows a través de MS Access. Para
poder hacerlo, es preciso tener instalado en nuestro cliente Windows el driver
MyODBC, así como haber arrancado el servidor MySQL.
- 358 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 359 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Así, Microsoft Access creará una tabla que mantendrá un vínculo a los datos de
origen. Los cambios realizados en los datos en Microsoft Access se reflejarán
en el origen y viceversa.
- 360 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 361 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
6. Una vez vinculadas las tablas de MySQL Server, podremos usarlas como si
de tablas MS Access se tratara. Por ejemplo, si hacemos clic sobre la tabla
"libros", en la parte derecha aparecerán sus registros. Cualquier modificación
que hagamos en la tabla quedará reflejado en el servidor:
Queremos recordar que para poder modificar las tablas desde MS Access
hay que tener los permisos pertinentes como usuarios de MySQL.
Una vez hemos vinculado las tablas con MS Access, pulsamos en la pestaña
"Crear" y seleccionaremos "Asistente para informes". En esta ventana
seleccionamos los campos que deseamos incluir en el nuevo informe:
- 362 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Una vez creada la relación entre los campos de las diferentes tabla volvemos a
crear el informe y pulsamos el botón Finalizar:
- 363 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 364 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
Resumen
Objetivos
- 365 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -
- 366 -
MÓDULO 3
Utilidades prácticas
Unidad 8
Índice de la unidad:
1. Funciones matemáticas
2. Tratamiento de errores
3. Compresión de ficheros
5. Resumen
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Introducción
En esta Unidad vamos a saber aplicar las principales funciones
matemáticas de PHP a las diferentes situaciones en que deban emplearse:
trigonométricas, para hallar redondeos, máximos y mínimos, para calcular
exponentes y logaritmos, así como para generar números aleatorios.
Funciones matemáticas
A lo largo del curso hemos estudiado muchas funciones, si bien no ha sido
nuestra intención abarcar exhaustivamente todas las funciones de PHP. En
este apartado vamos a estudiar las funciones matemáticas de que dispone
PHP, al menos de una forma breve, para que así se conozca que existen y se
puedan utilizar cuando sea necesario.
Funciones trigonométricas
Ejemplo de su
Función Devuelve
sintaxis
El arcocoseno del
acos(float) acos(120.678);
argumento en radianes
El arcoseno del
asin(float) asin(120.678);
argumento en radianes
El arcotangente del
atan(float) atan(120.678);
argumento en radianes
El coseno del argumento
cos(float) cos(120.678);
en radianes
El seno del argumento en
sin(float) sin(120.678);
radianes
- 369 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
El tangente del
tan(float) tan(120.678);
argumento en radianes
Ejemplo de su
Función Devuelve
sintaxis
El valor absoluto (sin
abs(número) abs(-120);
signo) de un número
El valor entero
ceil(float) superior de un número ceil(120.678);
decimal
El valor entero
floor(float) inferior de un número floor(120.678);
decimal
max(120,240); Para
El valor mayor de los
max(números) tipos y argumentos
números dados
ver Manual.
min(120,240); Para
El valor menor de los
min(números) tipos y argumentos
números dados
ver Manual.
El valor de un decimal
round(120.678);
redondeado en la parte
round(float)
entera según lo
round(120.478);
habitual
Exponentes y logaritmos
Ejemplo de su
Función Devuelve
sintaxis
El valor de elevar e
(base del logaritmo
exp(número) natural= exp(3);
2.71828182845904) al
argumento número
El logaritmo del
log(número) log(120.678);
argumento número
El logaritmo en base 10
log10(número) Log10(120.678);
del argumento número
El valor de elevar num1
pow(num1,num2) pow(5,3);
a num2
El valor de la raíz
sqrt(número) sqrt(25);
cuadrada de número
- 370 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Ejemplo de su
Función Devuelve
sintaxis
El mayor valor
getrandmax() getrandmax();
aleatorio generable
mt_rand();
Un valor aleatorio
mt_rand()
mejorado
mt_rand(100,500);
Introduce la
semilla del mt_srand((double)
mt_srand() generador de microtime()
números aleatorios *100000);
mejorado
El mayor valor
mt_getrandmax() aleatorio generable mt_getrandmax();
mejorado
rand();
rand() Un valor aleatorio
rand(500,1000);
Introduce la
srand((double)
semilla del
srand() microtime()
generador de
*1000000);
números aleatorios
Formatear números
- 371 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
- 372 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Tratamiento de errores
Al escribir el código de los programas es fácil cometer bastantes errores, sobre
todo cuando se está aprendiendo y no se conoce con exactitud la sintaxis de
los comandos. En este apartado vamos a enumerar los errores más frecuentes
para aprender a solucionar los problemas que se producen al ejecutar el código
de los scripts PHP. Además, estudiaremos algunas funciones de PHP que nos
ayudarán a detectar y a tratar los posibles errores de nuestros programas.
- 373 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
A continuación, citamos los errores que se repiten con mayor frecuencia, según
nuestra experiencia:
2. Comillas no protegidas.
- 374 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
se interpreta como Le llamó . Hay que proteger las comillas interiores así:
Este fallo es muy frecuente al incluir etiquetas HTML entre comillas dentro de
un literal PHP que va también entre comillas. No es correcto escribir
- 375 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Además de las comillas, hay otros componentes del lenguaje PHP que deben
abrirse y cerrarse, como las llaves {}, los paréntesis () y los corchetes []. Para
detectar esta posible omisión de uno de los dos elementos, generalmente el
segundo (cerrar), lo mejor es tabular (indentar) bien el código, de forma que
resulte fácil e intuitivo encontrar dónde se produce esta ausencia. El colorido
del texto en el Eclipse PDT también puede ayudarnos a detectar este error.
Este problema puede deberse a que Apache está mal configurado, que no es
nuestro caso, o a que la extensión del fichero en el que está archivado el
código no es php.
Si tenemos la instrucción
sólo aparece en el resultado la palabra nombre. Para que se vea nombre dado
es preciso escribir:
- 376 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Se produce este error cuando en la dirección que pasa a la URL aparece algún
espacio en blanco o una variable que lo contiene. Por ejemplo, la referencia
Así se comporta PHP. Para que las variables de una página puedan pasar a
otra nueva es necesario que las pasemos explícitamente, sea como campo
(incluso oculto) de un formulario, sea como asignación dentro de una URL.
- 377 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Puede ocurrir este error cuando estamos llamando a una función no declarada
o declarada en otro fichero que no se incluye en el script actual. También
puede deberse a las opciones incluidas al compilarse los módulos de PHP. En
este caso, lo mejor es mirar qué librerías se han incluido en la versión de PHP
que estamos usando y con qué opciones explícitas se ha compilado.
Ésta es su sintaxis:
Esta función envía un mensaje de error al fichero de tipo log de errores del
servidor web, a un puerto TCP o a un fichero diferente de log. El primer
parámetro (mensaje) contiene la cadena con el texto del mensaje de error. El
segundo parámetro (tipo de mensaje) indica el lugar al que debe dirigirse
mediante uno de estos cuatro valores:
La función () se usa para indicar el nivel de las incidencias que deben ser
registradas cuando se producen errores en la interpretación de un script.
Ésta es su sintaxis.
error_reporting([nivel])
El nivel se expresa mediante un número entero donde cada bit tiene su propio
significado. A continuación aparecen algunos de los valores posibles y su
significado:
- 378 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Notamos que en PHP 5 se ha aumentado esta lista para mostrar más tipos de
errores y poder encontrar los errores del código más fácilmente.
error_reporting(7);
en cuyo caso se mostrarán los mensajes de error de los tres primeros niveles
(1+2+4). Si escribimos
error_reporting(15);
Si ejecutas este programa puedes ver una página que usa estas dos funciones
para detectar y controlar los errores de un programa estableciendo diferentes
niveles y procedimientos para mostrar y escribir los mensajes de error en
ficheros.
- 379 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
- 380 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Compresión de ficheros
En este apartado vamos a estudiar la compresión y descompresión de ficheros
utilizando funciones de PHP.
Ésta es su sintaxis:
- 381 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Ésta es su sintaxis:
Ésta es su sintaxis:
Ésta es su sintaxis:
gzseek ($id_fichero,850 );
Ésta es su sintaxis:
- 382 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Ésta es su sintaxis:
Ésta es su sintaxis:
Ésta es su sintaxis:
- 383 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Ésta es su sintaxis:
Ésta es su sintaxis:
Ésta es su sintaxis:
Las función gzpassthru() lee desde la posición del puntero hasta el final de un
fichero de tipo gzip (el remanente) y escribe los resultados descomprimidos en
la salida estándar. Al acabar la lectura, el fichero leído queda cerrado.
Ésta es su sintaxis:
- 384 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Si ejecutas este programa puedes ver una página que, usado las funciones que
permiten crear ficheros comprimidos, así como descomprimirlos y leerlos. Fíjate
que, una vez ejecutado el proyecto, si lo actualizas con el atajo de teclas o [F5]
verás que aparece el fichero comprimido comprimido.txt.gz dentro de la
carpeta del proyecto que puedes abrir con cualquier programa de
descompresión de archivos:
- 385 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Así pues, para poder comprobar si el documento que hemos creado con las
funciones PDF de PHP está correctamente realizado, es preciso tener instalado
en nuestro ordenador alguna de las versiones del programa Acrobat Reader.
Hacemos notar que también existen otras aplicaciones gratuitas para abrir
documentos PDF en el mercado.
- 386 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
- 387 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
- 388 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
- 389 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
- 390 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
extension=php_xmlrpc.dll
extension=php_xsl.dll
extension=php_pdflib.dll
// En el caso de Linux y MAC sería esta línea en lugar de la
anterior
extension=php_pdflib.so
- 391 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
#binbuild LD_LIBRARY_PATH="/opt/lampp/lib/:$LD_LIBRARY_PATH"
#binbuild export LD_LIBRARY_PATH
Notamos que, si usas un sistema operativo Linux x64, XAMPP sólo está
disponible para 32 bits y, por lo tanto, debes instalar la versión de 32 bits de la
biblioteca PDFLib.
- 392 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
#DYLD_LIBRARY_PATH
Para utilizar ficheros PDF en php usando esta librería es necesario definir
primero un objeto que será el que, con sus propiedades y funciones, nos
permita crear y abrir este tipo de ficheros. La clase en cuestión se llama
pdf_new, y para usarla debemos escribir:
- 393 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
if ($pdf->begin_document($fichero_pdf, "") == 0) {
die("<b>No se puede crear el fichero pdf: '$fichero_pdf'.
<br>Compruebe que no lo tiene abierto con otra
aplicación.</b> Error: ".$pdf->get_errmsg());
}
end_document(lista opciones)
end_document("");
$pdf->set_parameter("textformat", "utf8");
Con esta orden indicamos que el formato del documento crear es UTF8. Hay
que tener en cuenta que el código fuente de los ejemplos del curso está
guardado con el juego de caracteres UTF8 para que sea compatible con los
diferentes sistemas operativos disponibles en el mercado. Por lo tanto, para
que los caracteres especiales como tildes y la letra “ñ” aparezcan
correctamente en el fichero final, es necesario configurarlo de esta manera.
- 394 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
- 395 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Hay que tener en cuenta que los valores ancho (width) y alto (height) de la
página determinan el tamaño de la misma, que tendrá una anchura desde 0
hasta x y una altura desde 0 hasta y. Cuando queramos escribir, colocar una
imagen o dibujar una figura en una posición determinada dentro de una página,
será necesario indicar las coordenadas x,y dentro de estos límites. Además,
hay que tener en cuenta que al situar algo (texto, imagen, gráfico, etcétera) en
una página se empieza a contar como en la pantalla del ordenador: de abajo
arriba y de izquierda a derecha.
tendrá la anchura y la altura de una hoja DINA4 (210 mm x 297 mm). Es este
caso hemos usado el parámetro “lista opciones” para incluir el tamaño de la
página.
- 396 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
end_page_ext(lista opciones)
Por ejemplo, con las dos instrucciones siguientes abrimos una página y la
cerramos:
- 397 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Así pues, esta función controla el color mediante combinación rgb (red=rojo,
green=verde y blue=azul). Si se pone 0.0 en los tres argumentos, se obtiene el
color negro. Si se pone 1.0 en uno solo de los tres argumentos, se consigue el
rojo, el verde o el azul, respectivamente. El valor de cada argumento, si no es
0, puede estar comprendido entre 0.000001 y 1.0. Además, se pueden
combinar los tres colores básicos para obtener los colores complementarios.
pdf_show(texto);
continue_text(texto);
set_value("leading", espaciado);
- 398 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
set_text_pos(coordenada x,coordenada y)
Una vez dada esta orden, ya podemos estar seguros de que la siguiente
escritura se producirá a partir de este punto.
Esta orden resulta más cómoda que las anteriores, pues permite a la vez
escribir un texto e indicar dónde debe aparecer. Ya hemos indicado que los
valores de las coordenadas deben estar dentro del rango asignado a la
anchura y a la altura de la página.
Si ejecutas este programa puedes ver una página que muestra un enlace al
documento creado:
- 399 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
En este Ejemplo puedes estudiar el código comentado para ver cómo hemos
usado las funciones que permiten crear este tipo de documentos.
- 400 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
La función setlinecap() especifica cómo deben ser los extremos de una línea.
Tiene esta sintaxis:
setlinecap(valor)
La función setlinejoin() especifica cómo deben ser las esquinas de una línea.
Tiene esta sintaxis:
setlinejoin(valor)
El parámetro valor puede tener los valores siguientes: 0=en forma de ingletes,
1=redondeadas, 2=en ángulo oblicuo.
setlinewidth(valor)
moveto(coordenada x, coordenada y)
La función curveto() dibuja una línea curva según los puntos indicados. Tiene
esta sintaxis:
La función lineto() dibuja una línea recta según los puntos indicados. Tiene
esta sintaxis:
- 401 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
lineto(coordenada x, coordenada y)
closepath()
La operación “cerrar el camino actual” significa que se dibuja una línea desde el
punto actual hasta el punto donde se inició la primera línea.
pdf_ stroke()
- 402 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Además, es interesante ver cómo hemos utilizado las cabeceras en PHP para
volcar al navegador del usuario con las siguientes sentencias:
- 403 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
<?
$imagen=$pdf->load_image("jpeg",$fic_imagen,"");
if (!$imagen) {
die("No existe el fichero de la imagen ".$fic_imagen);
}
...
$pdf->fit_image($imagen,0,0, "");
$pdf->close_image($imagen);
?>
- 404 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -
Resumen
- 405 -