Acceso a Base de Datos en PHP

19
 Tema 8 PHP: Acceso a Bases de Datos Una de las razones por las que más se ha popularizado PHP, como ya comentamos en el tema anterior, es su posibilidad de conexión con casi todos los tipos de bases de datos. En este tema vamos a ver algunas nociones de MySQL: instalación y configuración rápida, organización, etc. La razón de ver MySQL es porque se trata de base de datos más usada con PHP, incluso se podría decir que es la base de datos “propia” de PHP, pues al parecer, PHP Group desarrolla en primera instancia para esta base de datos y después migra el trabajo a las librerías de acceso a otras bases de datos. Otra librería de acceso a bases de datos interesante es la de acceso a través de ODBC que nos abre el camino a la conexión a cualquier otro tipo de base de datos de la que no se tenga acceso “nativo” en PHP. También puede ser interesante usar el acceso ODBC para las bases de datos de las que se tiene funciones PHP directamente, pues, aunque aparentemente más complejo y aveces más limitado, el acceso ODBC nos garantiza cierta compatibilidad que prácticamente nos independiza del SGDB que se use.  Así pues, en este tema vamos a trabaja r sobre tres ejemplo s de acceso a bases de datos MySQL y dos ejemplos ODBC en el que podremos trabajar tanto con MySQL como con otras bases de datos como MS-Access. 8.1. De vuelta con PHP Vamos en primera instancia a retomar algunos de los ejemplos PHP del tema anterior para ir calentando motores. En concreto, con idea de seguir con los ejemplos auto-ilustrativos del Tema 7, vamos a fusionar el ejemplo generico.php y ejemplos.php  de forma que un solo código nos gestione una plantilla genérica y nos permita elegir y ejecutar los ejemplos de este tema, que a semejanza del caso anterior están en el directorio: "C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8" La plantilla .phtml usada ahora se ha adaptado para este tema: Visualiza a la izquierda el código, a la derecha un formulario y encima de la tabla el posible resultado producido al invocar el formulario. La nueva plantilla se llama ahora: "C:\Archivos de programa\Apache Group\Apache\htdocs\tema8\index.phtml" La idea es la de adaptar Apache para que también pueda tomar como página por defecto de un sitio Web ese nombre de fichero, cambiando en httpd.conf la siguiente línea: DirectoryIndex index.html … por esta otra: DirectoryIndex index.html index.phtml Recuerda arrancar Apache.

Transcript of Acceso a Base de Datos en PHP

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 1/19

Tema 8PHP: Acceso a Bases de Datos

Una de las razones por las que más se ha popularizado PHP, como ya comentamos en el temaanterior, es su posibilidad de conexión con casi todos los tipos de bases de datos.

En este tema vamos a ver algunas nociones de MySQL: instalación y configuración rápida,organización, etc. La razón de ver MySQL es porque se trata de base de datos más usada conPHP, incluso se podría decir que es la base de datos “propia” de PHP, pues al parecer, PHPGroup desarrolla en primera instancia para esta base de datos y después migra el trabajo a laslibrerías de acceso a otras bases de datos.

Otra librería de acceso a bases de datos interesante es la de acceso a través de ODBC quenos abre el camino a la conexión a cualquier otro tipo de base de datos de la que no se tengaacceso “nativo” en PHP. También puede ser interesante usar el acceso ODBC para las bases

de datos de las que se tiene funciones PHP directamente, pues, aunque aparentemente máscomplejo y aveces más limitado, el acceso ODBC nos garantiza cierta compatibilidad queprácticamente nos independiza del SGDB que se use.

Así pues, en este tema vamos a trabajar sobre tres ejemplos de acceso a bases de datosMySQL y dos ejemplos ODBC en el que podremos trabajar tanto con MySQL como con otrasbases de datos como MS-Access.

8.1. De vuelta con PHP

Vamos en primera instancia a retomar algunos de los ejemplos PHP del tema anterior para ircalentando motores.

En concreto, con idea de seguir con los ejemplos auto-ilustrativos del Tema 7, vamos afusionar el ejemplo generico.php y ejemplos.php de forma que un solo código nosgestione una plantilla genérica y nos permita elegir y ejecutar los ejemplos de este tema, que asemejanza del caso anterior están en el directorio:

"C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8"

La plantilla .phtml usada ahora se ha adaptado para este tema: Visualiza a la izquierda elcódigo, a la derecha un formulario y encima de la tabla el posible resultado producido al invocarel formulario. La nueva plantilla se llama ahora:

"C:\Archivos de programa\Apache Group\Apache\htdocs\tema8\index.phtml"

La idea es la de adaptar Apache para que también pueda tomar como página por defecto de unsitio Web ese nombre de fichero, cambiando en httpd.conf la siguiente línea:

DirectoryIndex index.html

… por esta otra:

DirectoryIndex index.html index.phtml

Recuerda arrancar Apache.

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 2/19

Tema 8. PHP: Acceso a Bases de Datos

2

Listado 8.1. C:\Archivos de programa\Apache Group\Apache\htdocs\tema8\index.phtmlPlantilla de ejemplos del Tema 8.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<?php include "tema8/ejemplos.php"?>

<HTML>

<HEAD>

<TITLE><?php titulo()?>

</TITLE>

</HEAD>

<BODY>

<CENTER>

<H1 style="font-weight:bold; font-size:200%; color:blue">

<?php titulo()?>

</H1>

<?php resultado()?>

<TABLE width="100%" border="1" rules="all">

<TR align="center">

<TD>

<B>C&oacute;digo</B><BR>

</TD>

<TD>

<B>Formulario</B><BR>

</TD>

</TR>

<TR valign="top">

<TD>

<?php codigo()?>

</TD>

<TD>

<?php formulario()?>

</TD>

</TR>

</TABLE>

</CENTER>

</BODY>

</HTML>

El esquema es semejante al usado en el tema 7, pero hay que destacar que la funciónresultado ha sido sustituida por una formulario y una nueva función resultado debe reflejar en laparte superior el resultado de enviar el formulario.

La función formulario invocará a una función del mismo nombre que el ejemplo que se estévisualizando, como antes hacia la función resultado.

El código del nuevo ejemplo ejemplos.php queda así:

Listado 8.2. C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\ejemplos.phpPrograma que permite seleccinar uno de los ejemplos del Tema 8.

<SCRIPT language="php">

if (!isset($Ejemplo))

$Ejemplo="Ejemplos";

$Fichero=strToLower("tema8/$Ejemplo.php");

@include_once($Fichero);

if (!function_exists("titulo")) {

function titulo() {

global $Ejemplo;

print($Ejemplo);

}

}

if (!function_exists("resultado")) {

function resultado() {

}

}

function codigo() {

global $Ejemplo;

global $Fichero;if (@show_source($Fichero)) {

function formulario() {

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 3/19

Tema 8. PHP: Acceso a Bases de Datos

3

global $Ejemplo;

$Ejemplo();

}

}

else

print("¿$Ejemplo.php?");

}

function ejemplos() {

global $REQUEST_URI;include("tema8/plantillas/ejemplos.html");

}

function opciones() {

$Directorio=openDir(get_cfg_var("include_path")."/tema8/");

while ($Fichero=readDir($Directorio)) {

$Fichero=ucFirst(strToLower($Fichero));

list($Ejem,$Ext)=explode(".",$Fichero);

if ($Ejem AND !strCaseCmp($Ext,"php"))

print("<OPTION>$Ejem</OPTION>\n");

}

closeDir($Directorio);

}

</SCRIPT>

A destacar únicamente dos puntos. Lo primero que si la función resultado no existe (porque elejemplo no hace nada cuando se envía el formulario), para que no se produzca error alinvocarla, se crea vacía.

Lo segundo, el formulario que debería estar en la función con el mismo nombre que el fichero(ejemplos() en este caso) no esta en este fichero, sino aparte, en un fichero con extensión.html, que aunque no es verdaderamente un fichero HTML, puede ser medianamenteinterpretado por un navegador o un programa de diseño HTML, de forma que se puede ver ycambiar independientemente del código, es decir se trata de una plantilla.

Así pues, la función que muestra el formulario queda reducida a declarar como globales todaslas variables que se usen en la plantilla .html e incluirla. Este esquema se repite en todos losejemplos de este tema. El directorio que contiene las plantillas .html de los formularios es:

"C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\plantillas"

Puedes ver el aspecto que tienen estas plantillas cargándolas desde tu disco localdirectamente (no a través del servidor Apache) con tu navegador.

La plantilla que usamos en este “invocador” de ejemplos es:

Listado 8.3. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\ejemplos.htmlPlantilla formulario para seleccionar ejemplos.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<CENTER>

<LABEL><B>Ejemplos:</B><BR>

<SELECT name="Ejemplo">

<?php opciones()?>

</SELECT>

</LABEL><BR>

<INPUT type="submit" value="Mostrar">

</CENTER>

</FORM>

<SCRIPT language="php">

Ahora puedes ver el resultado, invocar a cualquier ejemplo de este tema se hace con la URL:

http://localhost/tema8

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 4/19

Tema 8. PHP: Acceso a Bases de Datos

4

8.2. MySQL

Monty Widenius quiso trabajar con APIs a bajo nivel de mSQL, comprobó que no eransuficientemente rápidas y decidió crear sus propias APIs MySQL. Así nació MySQL, una basede datos SQL (Structured Query Language ) muy rapida, multi-hebra, multi-usuario y robustasegún sus propios autores.

Se trata, además, de un software gratuito licenciado bajo la General Public License de GNU.

Instalación 

El primer paso que debemos dar es descargar la última versión desde http://www.mysql.com. Lasdistribuciones de binarios para Win32 siempre han sido “tradicionalmente” shareware . En elmomento de editar estas páginas, se encuentra disponible una versión 3.23.28-gammatotalmente gratuita.

El segundo paso es la descompresión del paquete y su instalación, ejecutando programasetup que aparece al descomprimir.

La instalación compacta es suficiente para nuestro caso y para la mayoría de usuarios deMySQL que lo ejecuten sobre Win32.

Si no le hemos indicado lo contrario el instalador nos habrá creado un directorio C:\mysql,con varios ficheros y subdirectorios. Los importantes son estos tres subdirectorios:

C:\mysql\docs

Contiene documentación sobre MySQL. Lo más interesante es el manual, accesible en HTMLdesde el fichero C:\mysql\docs\manual_toc.html .

C:\mysql\data

Por defecto almacena las bases de datos, en un subdirectorio cada una (con el mismo nombreque la base de datos). La distribución instala por defecto dos, la del sistema del propio servidorque se llama mysql y otra test, pero esta última está vacía. En subdirectorio correspondientea la base de datos del sistema (mysql) se puede apreciar que MySQL guarda tres ficheros porcada tabla, con el mismo nombre que la tabla pero distintas extensiones: El formato se guardaen los ficheros .frm, los datos en los .myd y la información para gestionar el acceso porindices en los .myi. Las tablas de mysql son 5: user, host, db, tables_priv ycolumns_priv.

C:\mysql\bin

Este directorio guarda los ejecutables: Demonios servidores, clientes, gestores y herramientasde test, administración y mantenimiento. Algunos de ellos son sólo para Windows NT o sólopara Windows 9x. El único que de momento nos interesa es winmysqladmin.exe, que loejecutaremos para comprobar la instalación y arrancar el servidor:

WinMySQLadmin 

Cuando lo ejecutamos por primera vez nos pregunta por un usuario y clave para establecerloscomo defecto. Esto lo hace por que detecta que no existe el fichero de configuración:

C:\windows\my.ini

En la documentación se explica como incluir distintas opciones en este fichero. Si le damos a

cancelar y no introducimos ningún usuario y clave, creará un fichero my.ini con las opcionesmínimas. No te tiene que preocupar no proporcionar usuario por defecto, pues la base de datosdel sistema (la mysql que hemos visto en el directorio data) viene preparada inicialmente para

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 5/19

Tema 8. PHP: Acceso a Bases de Datos

5

operar con cualquier usuario. Sin embargo el dar a cancelar también implica que no incluya unenlace directo a winmysqladmin.exe en el menú de inicio que producirá el arranqueautomático de este programa al iniciar una sesión en Windows. Puede ser interesante quecopies o muevas ese enlace directo a otro menú, uno propio del MySQL, para poderlo invocarvoluntariamente.

Después, el programa WinMySQLadmin se quedará residente. Lo puedes apreciar por unsemáforo con la luz verde que aparece a la derecha de la barra de tareas. Este semáforo tienela luz verde cuando el servidor de MySQL se encuentra en marcha y rojo si está parado. Elprograma WinMySQLadmin no es el servidor, sino un programa que sirve para arrancar, parary monitorizar al servidor. Éstas son las opciones que aparecen al solicitar el menú contextualsobre icono del semáforo, además de la opción de parar esta propia herramienta, que noimplica parar el servidor MySQL.

En conclusión, aunque esta herramienta nos permita curiosear el funcionamiento del servidor,principalmente servirá para poder arrancar y parar el servidor MySQL y comprobar mediante laluz del semáforo si está en marcha.

Acceso a MySQL

Otro programa llamado simplemente mysql (aparece también e el directorio C:\mysql\bin)es el típico interprete SQL de línea de comandos. Invócalo para ver alguna tabla de la base dedatos del sistema (la mysql):

C:\>C:\mysql\bin\mysql.exe mysql

Ahora prueba a listar la tabla de usuarios y permisos:

mysql> select * from user;

Lo que estas viendo significa algo así como:

• El usuario root tiene todos los privilegios posibles desde la máquina localhost.• Cualquier usuario desde cualquier máquina no tiene ningún privilegio.• Cualquier usuario desde localhost tiene todos los privilegios.• El usuario root desde cualquier máquina tiene todos los privilegios.• Es posible que aparezca otra fila con el usuario y clave que te pidió WinMySQLadmin.

Acceso a MySQL mediante PHP 

Vamos a intentar visualizar la misma tabla de usuarios que hemos visto mediante el interpreteSQL, pero a través de nuestro servidor Apache y un programa PHP. Para ello vamos a ver unejemplo de visor de tablas: un formulario recoge máquina, usuario, base de datos y tabla, ymediante las funciones PHP de acceso a MySQL visualizamos la tabla.

La plantilla del formulario será:

Listado 8.4. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\visor.htmlPlantilla formulario para el visor.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<TABLE>

<LABEL><TR>

<TD><B>Host:</B></TD>

<TD><INPUT type="text" name="Host" value="localhost"></TD></TR></LABEL>

<LABEL><TR>

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 6/19

Tema 8. PHP: Acceso a Bases de Datos

6

<TD><B>Usuario:</B></TD>

<TD><INPUT type="text" name="Usuario" value="root"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Base de datos:</B></TD>

<TD><INPUT type="text" name="BD"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Tabla:</B></TD><TD><INPUT type="text" name="Tabla"></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Visualizar" value="Visualizar">

<INPUT type="submit" value="Limpiar"></CENTER>

</TD></TR>

</TABLE>

</FORM>

<SCRIPT language="php">

Lo primero que nuestro programa debe hacer es conectarse a un servidor MySQL en unamáquina $Host como el usuario $Usuario, después seleccionar la base de datos $BD, lanzarla pregunta SQL que obtendrá la selección de las filas de la tabla $Tabla y por últimointerpretar el resultado:

Listado 8.5. C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\visor.phpVisor de tablas MySQL.

<SCRIPT language="php">

function visualizar($Host,$Usuario,$BD,$Tabla) {

if (!mysql_connect($Host,$Usuario))

print("<P>Error al conectar con $Host como $Usuario</P>");

elseif (!mysql_select_db($BD))

print("<P>Error al seleccionar la base de datos $BD</P>");

elseif (!$Cursor=mysql_query("SELECT * FROM $Tabla"))

print("<P>Error al obtener cursor a tabla $Tabla</P>");

else {

print("<TABLE border=\"1\" rules=\"all\">\n");

print("<TR>\n");

for ($i=0;$i<mysql_num_fields($Cursor);$i++)print("<TH>".mysql_field_name($Cursor,$i)."</TH>\n");

print("</TR>\n");

while ($Fila=mysql_fetch_row($Cursor)) {

print("<TR>\n");

foreach ($Fila as $Campo) print("<TD>$Campo</TD>\n");

print("</TR>\n");

}

print("</TABLE><BR>\n");

}

}

function resultado() {

global $Visualizar,$Host,$Usuario,$BD,$Tabla;

if (isset($Visualizar)) {

print("<P><B>Host:</B> $Host ");

print("<B>Usuario:</B> $Usuario ");

print("<B>Base de datos:</B> $BD ");

print("<B>Tabla:</B> $Tabla</P>\n");

visualizar($Host,$Usuario,$BD,$Tabla);

}

}

function visor() {

global $REQUEST_URI,$Ejemplo;

include("tema8/plantillas/visor.html");

}

</SCRIPT>

La función mysql_connect(), de ser satisfactoria, devuelve un enlace a la base de datos.Este enlace debería ser pasado a las funciones mysql_select_db() y mysql_query(),pero ese parámetro es opcional, en caso de no hacerlo, se toma como enlace, la últimaconexión hecha, que en nuestro caso se trata de la única conexión hecha.

La función mysql_query() devuelve un recurso, que puede ser interpretado en este casocomo un cursor, del que poder extraer la información requerida en la pregunta. Son varias las

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 7/19

Tema 8. PHP: Acceso a Bases de Datos

7

funciones que pueden extraer información de un recurso devuelto por mysql_query(), ydistintas las formas o estrategias para interpretarlo:

• Mediante la función mysql_fetch_object() se puede obtener un objeto por fila cuyosatributos son los campos de la tabla.

• Mediante la función mysql_fetch_array() se pude obtener un array por fila cuyas

claves sean los campos de la tabla, sus posiciones o ambas cosas.•  mysql_fecth_row() es un caso particular del anterior, el array siempre esta indexado

por posiciones (empezando por la 0).• Se puede acceder a cualquier fila y columna de la tabla mediante la función

mysql_result().

Además es posible acceder a otra información sobre la respuesta, como el nombre los camposde la tabla o que cantidad de filas o columnas hay. En el ejemplo se usan las funcionesmyql_num_fields() y mysql_filed_name() . Esto nos permite poder visualizar losnombres de los campos en la cabecera de la tabla incluso cuando la tabla esta vacía: Nopruebes solo la tabla user de la base de datos mysql, prueba también con una tabla vacíacomo tables_priv de la misma base de datos.

8.3. Manejo de bases de datos MySQL desde PHP

Para poder ilustrar gran parte de las posibilidades de edición de las funciones PHP de acceso aMySQL, vamos a ver dos ejemplos más. El primero para poder crear una base nueva con laque experimentar (crear tablas, campos, modificarlos, borrar, etc.). El segundo, combinándolocon el manejo de sesiones nos permitirá editar (añadir, modificar y borrar) fila a fila en una basede datos.

Gestor de base de datos (manejo de la estructura) 

En este ejemplo vamos a usar tres formularios distintos, dependiendo del nivel de atomicidad alque llevemos la gestión (base de datos, tabla o campo):

Listado 8.6. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\gesbd.htmlPlantilla formulario para el gestor en gestion a bases de datos.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<INPUT type="hidden" name="Gestion" value="<?=$Gestion?>">

<TABLE>

<LABEL><TR><TD><B>Host:</B></TD>

<TD><INPUT type="text" name="Host" value="<?=$Host?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Usuario:</B></TD>

<TD><INPUT type="text" name="Usuario" value="<?=$Usuario?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Base de datos:</B></TD>

<TD><INPUT type="text" name="BD"></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="Crear">

<INPUT type="submit" name="Operacion" value="Conectar">

<INPUT type="submit" name="Operacion" value="Eliminar"></CENTER>

</TD></TR></TABLE>

</FORM>

<SCRIPT language="php">

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 8/19

Tema 8. PHP: Acceso a Bases de Datos

8

La variable $Gestion informará de que gestión se lleva a cabo (base de datos, tabla ocolumna), mientras $Operacion indica si se debe crear, eliminar, etc.

Listado 8.7. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\gestabla.htmlPlantilla formulario para el gestor en gestion a tablas.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<INPUT type="hidden" name="Gestion" value="<?=$Gestion?>">

<INPUT type="hidden" name="Host" value="<?=$Host?>">

<INPUT type="hidden" name="Usuario" value="<?=$Usuario?>">

<INPUT type="hidden" name="BD" value="<?=$BD?>">

<TABLE>

<LABEL><TR>

<TD><B>Tabla:</B></TD>

<TD><CENTER><SELECT name="Tabla">

<?php tablas($BD)?>

</SELECT></CENTER></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="Cambiar"><INPUT type="submit" name="Operacion" value="Eliminar"></CENTER>

</TD></TR>

<TR><TD colspan="2"><CENTER><B>o</B></CENTER></TD></TR>

<LABEL><TR>

<TD><B>Tabla:</B></TD>

<TD><INPUT type="text" name="Nueva"></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="Crear"></CENTER>

</TD></TR>

</TABLE>

</FORM>

<SCRIPT language="php">

Las variables del formulario anterior en este se mantienen ocultas. La variable $Nueva llevará

el nombre de la tabla si se trata de una operación Crear.

Listado 8.8. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\gescampo.htmlPlantilla formulario para el gestor en gestion a campos.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<INPUT type="hidden" name="Gestion" value="<?=$Gestion?>">

<INPUT type="hidden" name="Host" value="<?=$Host?>">

<INPUT type="hidden" name="Usuario" value="<?=$Usuario?>">

<INPUT type="hidden" name="BD" value="<?=$BD?>">

<INPUT type="hidden" name="Tabla" value="<?=$Tabla?>">

<TABLE>

<LABEL><TR>

<TD><B>Campo:</B></TD><TD><CENTER><SELECT name="Campo">

<?php campos($BD,$Tabla)?>

</SELECT></CENTER></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="Eliminar"></CENTER>

</TD></TR>

<TR><TD colspan="2"><CENTER><B>o</B></CENTER></TD></TR>

<LABEL><TR>

<TD><B>Campo:</B></TD>

<TD><INPUT type="text" name="Nuevo"></TD>

</TR></LABEL>

<TR><TD>

<LABEL><INPUT type="radio" name="Tipo" value="INT" checked>Entero</LABEL>

</TD></TR>

<TR><TD><LABEL><INPUT type="radio" name="Tipo" value="VARCHAR">Cadena</LABEL>

</TD><TD><CENTER>

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 9/19

Tema 8. PHP: Acceso a Bases de Datos

9

<LABEL>Longitud: <INPUT type="text" name="Longitud" size="2"></LABEL>

</CENTER></TD></TR>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="Añadir"></CENTER>

</TD></TR>

</TABLE>

</FORM>

<SCRIPT language="php">

A la hora de añadir un campo, las variable $Nuevo y $Tipo aportan el nombre y el tiporespectivamente. Solo se permiten dos tipos de datos (para simplificar), el entero y la cadena.En este segundo tipo otra variable $Longitud aporta el número máximo de caracteres.También por simplificar, no se puede cambiar de tipo un campo, ha de eliminarse y añadirse denuevo.

Listado 8.9. C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\gestor.phpGestor de bases de datos MySQL.

<SCRIPT language="php">

function resultado() {

global $Host,$Usuario,$BD,$Tabla,$Campo;

global $Gestion,$Operacion;

if (isset($Gestion)) { // Si se ha solicitado una gestion ...

if (mysql_connect($Host,$Usuario)) { // se conecta y gestiona

$Gestion=$Gestion($Operacion,$BD,$Tabla,$Campo);

if ($Gestion!="gestionBD") { // Se muestran los datos

print("<P><B>Host:</B> $Host ");

print("<B>Usuario:</B> $Usuario ");

print("<B>Base de datos:</B> $BD ");

if ($Gestion!="gestionTabla")

print("<B>Tabla:</B> $Tabla");

print("</P>\n");

}

}

else {

print("<P>Error al conectar con $Host como $Usuario</P>\n");

$Gestion="gestionBD";

}

}else {

$Gestion="gestionBD";

$Host="localhost";

$Usuario="root";

}

}

function gestionBD($Operacion,$BD) { // Para base de datos

switch ($Operacion) {

case "Crear": // - o se crea:

if (!mysql_create_db($BD)) {

print("<P>Error al crear la base de datos $BD</P>\n");

return("gestionBD");

}

case "Conectar": // - o entra en la BD

if (!mysql_select_db($BD)) {

print("<P>Error al seleccionar la base de datos $BD</P>\n");return("gestionBD");

}

return("gestionTabla");

case "Eliminar": // - o se elimina

if (!mysql_drop_db($BD))

print("<P>Error al eliminar la base de datos $BD</P>\n");

default:

return("gestionBD");

}

}

function tablas($BD) { // Lista las tablas de una BD como opciones

$Cursor=mysql_list_tables($BD);

for ($i=0;$i<mysql_num_rows($Cursor);$i++)

print("<OPTION>".mysql_tablename($Cursor,$i)."</OPTION>\n");

}

function gestionTabla($Operacion,$BD,&$Tabla) { // Para tabla

global $Nueva;

if (!mysql_select_db($BD)) { // Entra en la base de datos

print("<P>Error al seleccionar la base de datos $BD</P>\n");

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 10/19

Tema 8. PHP: Acceso a Bases de Datos

10

return("gestionBD");

}

if ($Operacion=="Eliminar") { // Elimina tabla o ...

if (!mysql_query("DROP TABLE $Tabla"))

print("<P>Error al eliminar la tabla $Tabla</P>");

return("gestionTabla");

}

if ($Operacion=="Crear") { // ... crea tabla

if (!mysql_query("CREATE TABLE $Nueva (id INT)")) {print("<P>Error al crear la tabla $Nueva</P>");

return("gestionTabla");

}

$Tabla=$Nueva;

}

return("gestionCampo");

}

function campos($BD,$Tabla) { // Lista los campos de una tabla

$Cursor=mysql_list_fields($BD,$Tabla);

for ($i=0;$i<mysql_num_fields($Cursor);$i++)

print("<OPTION>".mysql_field_name($Cursor,$i)."</OPTION>\n");

}

function gestionCampo($Operacion,$BD,$Tabla,$Campo) { // Para campo

global $Nuevo, $Tipo, $Longitud;

if (!mysql_select_db($BD)) { // Entra en la base de datos

print("<P>Error al seleccionar la base de datos $BD</P>\n");return("gestionBD");

}

if ($Operacion=="Eliminar") // Elimina campo o ...

if (!mysql_query("ALTER TABLE $Tabla DROP COLUMN $Campo"))

print("<P>Error al eliminar el campo $Campo</P>");

if ($Operacion=="Añadir") { // ... añade campo

if ($Tipo=="VARCHAR")

$Tipo="$Tipo($Longitud)";

if (!mysql_query("ALTER TABLE $Tabla ADD COLUMN $Nuevo $Tipo"))

print("<P>Error al añadir el campo $Nuevo tipo $Tipo</P>");

}

return("gestionCampo");

}

function gestor() {

global $REQUEST_URI,$Ejemplo,$Gestion;

global $Host,$Usuario,$BD,$Tabla;

if ($Gestion=="gestionCampo") // Seleciona formulario

include("tema8/plantillas/gescampo.html");

elseif ($Gestion=="gestionTabla")

include("tema8/plantillas/gestabla.html");

else

include("tema8/plantillas/gesbd.html");

}

</SCRIPT>

La variable $Gestion almacena el nombre de la función que debe realizar la gestión:gestionBD(), gestionTabla(), o gestionCampo(). Todas las gestiones son llamadascon el máximo de parámetros, aunque a algunas no les hace falta tantos.

La función gestionBD() crea y destruye tablas con las funciones mysql_create_db() y

mysql_drop_db() respectivamente.

La función gestionTabla() destruye y crea tablas con las instrucciones DROP TABLE … yCREATE TABLE … de SQL.

La función gestionCampo() elimina y añade campos con la instrucción ALTER TABLE … deSQL.

Las funciones tablas() y campos() listan en los formularios, como opciones, las tablas deuna base de datos y los campos de una tabla. Para ello utilizan funciones para extraerinformación sobre la estructura de la base de datos como mysql_list_tables() ymysql_list_fields().

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 11/19

Tema 8. PHP: Acceso a Bases de Datos

11

Puedes probarlo creando nuevas bases de datos y/o eliminándolas después. Además puedesverificar los cambios que produces con el interprete de SQL (mysql) o con el visor del ejemploanterior.

Editor de base de datos (manejo de los datos) 

Vamos a ver otro ejemplo con el que poder rellenar de datos las bases de datos creadas con elanterior. La edición la haremos por fila, pudiendo pasar de una fila a otra para su edición. Estosupone establecer sesiones que nos guarden información sobre que fila de que tabla y base dedatos estamos editando. El directorio de datos para las sesiones es, como en otros temasanteriores, el subdiretorio datos:

C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\datos

La edición consistirá en modificar o borrar la fila actual o añadir una nueva al final, por esarazón, siempre se dejará editar una fila de más en blanco al final de la tabla.

Las plantillas formulario para este ejemplo son dos, una para seleccionar una tabla y otra paraeditar una fila:

Listado 8.10. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\editabla.htmlPlantilla formulario para el editor en selección de tabla.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<TABLE>

<LABEL><TR>

<TD><B>Host:</B></TD>

<TD><INPUT type="text" name="Host" value="<?=$Host?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Usuario:</B></TD>

<TD><INPUT type="text" name="Usuario" value="<?=$Usuario?>"></TD>

</TR></LABEL><LABEL><TR>

<TD><B>Base de datos:</B></TD>

<TD><INPUT type="text" name="BD" value="<?=$BD?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Tabla:</B></TD>

<TD><INPUT type="text" name="Tabla" value="<?=$Tabla?>"></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="Editar"></CENTER>

</TD></TR>

</TABLE>

</FORM>

<SCRIPT language="php">

Listado 8.11. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\edifila.htmlPlantilla formulario para el editor en edición de fila.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<TABLE>

<?php campos($Cursor,$Fila)?>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="<?=boton('Añadir')?>">

<INPUT type="submit" name="Operacion" value="<?=boton('Modificar')?>">

<INPUT type="submit" name="Operacion" value="<?=boton('Borrar')?>">

</CENTER></TD></TR>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Operacion" value="<?=boton('<<')?>"><INPUT type="submit" name="Operacion" value="<?=boton('<')?>">

<INPUT type="submit" name="Operacion" value="Salir">

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 12/19

Tema 8. PHP: Acceso a Bases de Datos

12

<INPUT type="submit" name="Operacion" value="<?=boton('>')?>">

<INPUT type="submit" name="Operacion" value="<?=boton('>>')?>">

</CENTER></TD></TR>

</TABLE>

</FORM>

<SCRIPT language="php">

La funciónboton()

determina si el botón queda habilitado o deshabilitado. Lamentablemente,esta funcionalidad de habilitar o deshabilitar controles no la reflejan correctamente todos losnavegadores.

El código es el siguiente:

Listado 8.12. C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\editor.phpEditor de bases de datos MySQL.

<SCRIPT language="php">

session_save_path("../../cgi-bin/tema8/datos"); // Antes que nada:

session_start(); // Inicia o restablece sesion:

if (!sizeof($HTTP_SESSION_VARS)) { // Si inicia, da valores

$Host="localhost"; // iniciales a Host y

$Usuario="root"; // Usuario y registra

session_register("Host","Usuario"); // todas las variables a

session_register("BD","Tabla","Fila"); // conservar en sesion

}

else // Si restablece, ...

foreach ($HTTP_POST_VARS as $Variable => $Valor)

if (session_is_registered($Variable)) // sobrescribe con los

${$Variable}=$Valor; // valores de formulario

function resultado() {

global $Operacion,$Host,$Usuario;

global $BD,$Tabla,$Cursor;

if (isset($Operacion) AND $Operacion!="Salir")

if (!mysql_connect($Host,$Usuario))

print("<P>Error al conectar con $Host como $Usuario</P>\n");

elseif (!mysql_select_db($BD))

print("<P>Error al seleccionar la base de datos $BD</P>");

elseif (!$Cursor=mysql_query("SELECT * FROM $Tabla"))

print("<P>Error al obtener cursor a tabla $Tabla</P>");else {

print("<P><B>Host:</B> $Host "); // Informa de conexion,

print("<B>Usuario:</B> $Usuario "); // base de datos y

print("<B>Base de datos:</B> $BD "); // tabla con la que

print("<B>Tabla:</B> $Tabla</P>\n"); // operar

return;

}

$Operacion="Salir";

}

function campos($Cursor,$Fila) { // Muestra los campos de la fila

$Tope=mysql_num_rows($Cursor); // corespondiente en formulario:

print("<TR><TD colspan=\"2 \"><CENTER>".($Fila+1));

print(" de ".$Tope."</CENTER></TD></TR>\n");

for ($i=0;$i<mysql_num_fields($Cursor);$i++) {

$Campo=mysql_field_name($Cursor,$i);

print("<TR><TD><B>$Campo: </B></TD><TD><CENTER>");print("<INPUT type=\"text\" name=\"_${Campo}_\"");

if ($Fila<$Tope)

print(" value=\"".mysql_result($Cursor,$Fila,$i)."\"");

print("></TD></CENTER></TD></TR>\n");

}

}

function boton($Tipo) { // Determina que botones deben

global $Cursor,$Fila; // o no estar deshabilitados.

print("$Tipo");

switch ($Tipo) {

case "Añadir";

if ($Fila==mysql_num_rows($Cursor))

return;

break;

case "<":

case "<<":

if ($Fila>0)

return;

break;

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 13/19

Tema 8. PHP: Acceso a Bases de Datos

13

case "Modificar":

case "Borrar":

case ">":

case ">>":

if ($Fila<mysql_num_rows($Cursor))

return;

}

print("\" disabled \"");

}function operar($Operacion,&$Cursor,$Tabla,&$Fila) {

switch ($Operacion) { // Determina, segun la operacion,

case "Salir": // incrementar o decrementar la

return(FALSE); // fila y hacer la operacion

case "<": // corespondiente.

if (--$Fila>=0) return(TRUE);

case "Editar":

case "<<":

$Fila=0;

return(TRUE);

case ">":

if (++$Fila<=mysql_num_rows($Cursor)) return(TRUE);

case ">>":

$Fila=mysql_num_rows($Cursor);

return(TRUE);

case "Modificar":case "Borrar":

if ($Fila==mysql_num_rows($Cursor)) return(TRUE);

}

$Operacion($Cursor,$Tabla,$Fila);

if (!$Cursor=mysql_query("SELECT * FROM $Tabla"))

print("<P>Error al obtener cursor a tabla $Tabla</P>");

return(TRUE);

}

function añadir($Cursor,$Tabla,$Fila) { // Añade una fila

global $HTTP_POST_VARS;

for ($i=0;$i<mysql_num_fields($Cursor);$i++) {

if ($i>0) $Valores.=",";

$Campo=mysql_field_name($Cursor,$i);

$Tipo=mysql_field_type($Cursor,$i);

if (strToLower($Tipo)=="string") $Valores.="'";

$Valores.=$HTTP_POST_VARS["_${Campo}_"];

if (strToLower($Tipo)=="string") $Valores.="'";

}

if (!mysql_query("INSERT INTO $Tabla VALUES($Valores)"))

print("<P>Error añadiendo los valores:<BR>($Valores)</P>");

}

function modificar($Cursor,$Tabla,$Fila) { // Cambia una fila

global $HTTP_POST_VARS;

for ($i=0;$i<mysql_num_fields($Cursor);$i++) {

if ($i>0) {

$Nuevos.=",";

$Viejos.=" AND ";

}

$Campo=mysql_field_name($Cursor,$i);

$Nuevos.="$Campo=";

$Viejos.="$Campo=";

$Tipo=mysql_field_type($Cursor,$i);

if (strToLower($Tipo)=="string") {$Nuevos.="'";

$Viejos.="'";

}

$Nuevos.=$HTTP_POST_VARS["_${Campo}_"];

$Viejos.=mysql_result($Cursor,$Fila,$i);

if (strToLower($Tipo)=="string") {

$Nuevos.="'";

$Viejos.="'";

}

}

if (!mysql_query("UPDATE $Tabla SET $Nuevos WHERE $Viejos"))

print("<P>Error al sustituir por los valores:<BR>$Nuevos</P>");

}

function Borrar($Cursor,$Tabla,$Fila) { // Elimina una fila

for ($i=0;$i<mysql_num_fields($Cursor);$i++) {

if ($i>0) $Valores.=" AND ";$Campo=mysql_field_name($Cursor,$i);

$Valores.="$Campo=";

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 14/19

Tema 8. PHP: Acceso a Bases de Datos

14

$Tipo=mysql_field_type($Cursor,$i);

if (strToLower($Tipo)=="string") $Valores.="'";

$Valores.=mysql_result($Cursor,$Fila,$i);

if (strToLower($Tipo)=="string") $Valores.="'";

}

if (!mysql_query("DELETE FROM $Tabla WHERE $Valores"))

print("<P>Error al borrar los valores:<BR>$Valores</P>");

}

function editor() {global $REQUEST_URI,$Ejemplo;

global $Operacion,$Host,$Usuario; // Opera y determina a

global $Cursor,$BD,$Tabla,$Fila; // que formulario volver:

if (operar($Operacion,$Cursor,$Tabla,$Fila))

include("tema8/plantillas/edifila.html");

else

include("tema8/plantillas/editabla.html");

}

</SCRIPT>

Lo primero que hace el código es gestionar la sesión. Esta premura se justifica porque pordefecto las sesiones se establecen por medio de cookies que deben ser introducidas comocabeceras de los mensajes de respuesta, así que, como vimos en el tema anterior, la gestiónde una sesión debe realizarse antes de que el interprete PHP empiece a enviar el cuerpo del

mensaje de respuesta.

La función session_start() empieza una sesión si no existía, en caso contrario la reasume.Reasumirla significa restablecer los valores de las variables registradas en anterioresconexiones de esa misma sesión.

Así pues, si no existe ninguna variable vinculada a la sesión ($HTTP_SESSION_VARS) significaque es la primera conexión de la sesión y que todavía no se ha registrado ninguna variable. Eneste caso registraremos todas las variables necesarias previa inicialización de las que nosinteresen.

Si no se trata de la primera conexión de la sesión, es posible que los valores de las variablesregistradas en la sesión (valores que tenían en la última conexión) entren en conflicto con losvalores enviados por formulario (en nuestro caso por método POST). El problema es quevalores asumen las variables globales PHP, el procedente de la sesión (el que perdura de laconexión anterior) o el que proviene del formulario.

La directiva de configuración variables_order del fichero php.ini configura en que ordenpasan los valores a las variables globales. Los valores de las variables globales predefinidasprovienen de cinco posibles fuentes método GET, método POST, cookies, variables de entornoo sesión. En principio podríamos utilizar esta directiva para indicar que, en caso de conflicto,nos interesa más los valores introducidos por formulario (método POST) que los procedentesde la sesión.

Esto significaría que PHP debería leer primero las variables registradas en la sesión y después

las que vienen en la petición. Pero pensemos como obtiene PHP los valores de las variables desesión: los obtiene de un fichero asociado al identificador de sesión donde guardó los valores alterminar la última conexión de la sesión. El identificador de sesión es un nombre único paracada sesión que el navegador y PHP se pasan mediante cookies y/o variables ocultas enformularios. Puedes comprobarlo al visualizar el código HTML desde tu navegador y buscandoen el formulario de este ejemplo, por defecto la variable se llama PHPSESSID. PHP incluye pordefecto esta variable en cualquier formulario que genere durante una sesión como alternativa aque el usuario desactive el sistema de cookies.

En resumen, no se puede adelantar la valoración de las variables registradas en una sesión alpaso de variables por cookies, método GET o método POST, pues se usa una variable pasadapor alguno o algunos de estos tres métodos para identificar a la propia sesión.

Así pues nos toca a nosotros mismos reescribir los valores de las variables globales que entrenen conflicto por tener valor de procedencia sesión y procedencia formulario a la vez. Esto no es

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 15/19

Tema 8. PHP: Acceso a Bases de Datos

15

complicado, pues tenemos los valores claramente identificados por procedencia en los arrays$HTTP_COOKIE_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS y $HTTP_SESSION_VARS .

La función campos() crea entradas del formulario con los campos de la fila en edición, si éstaes la última fila (la fila de más para añadir) las entradas quedan en blanco. Las variablesasociadas a las entradas de texto tiene el mismo nombre que el campo de la tabla pero con un

carácter _ al principio y al final, por si el nombre del campo coincide con alguna variable yausada.

La función operar() ajusta el nuevo valor para la fila y en los casos de Añadir, Modificary Borrar, llama a la función del mismo nombre y luego vuelve a pedir el cursor para querefleje los cambios.

Las funciones añadir(), modifica() y borrar() hacen uso de las instrucciones SQLINSER INTO …, UPDATE … y DELETE FROM …. Añadir() y modificar() utilizan el array$HTTP_POST_VARS para obtener los valores de los campos enviados por formulario de lasvariables _campo _ correspondientes.

8.4. ODBC

Open Data Base Connection es un estándar que permite tratar de forma genérica lasconexiones a bases de datos SQL. Cada fabricante de sistemas de bases de datos debefacilitar el controlador correspondiente para que a través de este se pueda conectar a susbases de datos.

Como cada sistema de base de datos crea, organiza y en general gestiona sus bases de datosde forma propia, ODBC solo proporciona funcionalidades genéricas a la mayoría de lossistemas, dejando fuera muchas operaciones “propias” para cada base de datos y al revés,pudiendo proporcionar funciones que no tienen efecto en algunos sistemas en concreto. Apesar de ello resulta muy útil e interesante, pues fusiona, por de alguna forma decirlo, todos lostipos de accesos a bases de datos en uno.

Para ver todos los controladores instalados que dispones en tu máquina, ves al panel decontrol y abre el icono “ODBC” u “ODBC de 32 bits”, los controladores suelen llevar en supropio nombre una descripción de para qué sistema de base de datos están diseñados.

Con ODBC, en vez de conectarse a una base de datos, hay que conectarse a una fuente dedatos (Data Source). Estas fuentes de datos no son más que una descripción de cómoconectarse a una verdadera base de datos (con que controlador, a que base de datos, con queusuario, etc.). Estas descripciones aparecen en la misma ventana de los controladores ODBCcomo DSN (Data Source Name), y las hay de tres tipos, generales a sistema, propias delusuario o descritas en un fichero.

Comprueba si ya tiene disponible alguna DSN a la que conectarte mediante ODBC.

MySQL a través de ODBC 

MySQL también tiene sus controladores ODBC, puedes descargarlos de MySQL, en elmomento de escribir este tema la última versión para Windows 9x es la 2.50.36.

El instalador es en realidad un instalador de controladores ODBC genérico que Microsoftproporciona a los fabricantes de sistemas de bases de datos para que distribuyan suscontroladores. Al descomprimir e instalar nos aparecerá la ventana de gestión de Data Sourcespor si queremos añadir una DSN. El instalador ya ha introducido como ejemplo una llamadasample-MySQL pero conecta con una base de datos test que posiblemente sigamos teniendovacía, podemos modificar esta para crear la nuestra.

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 16/19

Tema 8. PHP: Acceso a Bases de Datos

16

En cualquier caso (nueva o modificada), nosotros vamos a obtener una DSN con el nombreTema8-ODBC-Mysql que conectará con el controlador ODBC de MySQL a una base de datosen localhost llamada Tema8 con el usuario root.

Si no tienes una base de datos MySQL que se llame así (Tema8) créala con el ejemplo delgestor y rellénala con algún dato con el ejemplo editor, pues la vamos a usar en el siguiente

ejemplo.

Para comprobar el controlador ODBC de MySQL está correctamente instalado y que nuestraDSN está bien definida, llama al programa admndemo.exe que te habrá aparecido aldescomprimir el instalador del controlador.

Lo primero que te pide al arrancar es que le indiques con que DSN conectar. Seleccionanuestra DSN Tema8-ODBC-MySQL . Luego te aparecerá una ventana dividida en dos paneles.En el panel superior puedes escribir cualquier instrucción SQL (un SELECT será lo mas facil).En la barra de menús seleccionamos el menú Command seleccionamos la opción Execute y lainstrucción SQL debe ejecutarse sobre nuestra base de datos Tema8.

Visor ODBC 

Vamos a modificar el ejemplo visor para que en vez de conectar directamente con bases dedatos MySQL lo haga a través de ODBC. Le llamaremos odbc precisamente.

La nueva plantilla de formulario es:

Listado 8.13. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\odbc.htmlPlantila formulario para el visor ODBC.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<TABLE><LABEL><TR>

<TD><B>DSN ODBC:</B></TD>

<TD><INPUT type="text" name="DSN" value="<?=$DSN?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Usuario:</B></TD>

<TD><INPUT type="text" name="Usuario" value="<?=$Usuario?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Tabla:</B></TD>

<TD><INPUT type="text" name="Tabla" value="<?=$Tabla?>"></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Visualizar" value="Visualizar">

<INPUT type="submit" value="Limpiar"></CENTER>

</TD></TR></TABLE>

</FORM>

<SCRIPT language="php">

El código queda más sencillo todavía que el del visor:

Listado 8.14. C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\odbc.phpVisor de tablas a través de ODBC.

<SCRIPT language="php">

function titulo() {

print("Visor ODBC");

}

function visualizar($DSN,$Usuario,$Tabla) {

print("<P>");if ($DSN) print("<B>DSN ODBC:</B> $DSN ");

if ($Usuario) print("<B>Usuario:</B> $Usuario ");

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 17/19

Tema 8. PHP: Acceso a Bases de Datos

17

if ($Tabla) print("<B>Tabla:</B> $Tabla");

print("</P>\n");

if (!$Conexion=odbc_connect($DSN,$Usuario,""))

print("<P>Error al conectar con $DSN como $Usuario</P>");

elseif (!$Cursor=odbc_exec($Conexion,"SELECT * FROM $Tabla"))

print("<P>Error al obtener cursor a tabla $Tabla</P>");

else {

odbc_result_all($Cursor,"border=\"1\" rules=\"all\"");

print("<BR>\n");}

}

function resultado() {

global $Visualizar,$DSN,$Usuario,$Tabla;

if (isset($Visualizar))

visualizar($DSN,$Usuario,$Tabla);

else

$DSN=$Usuario=$Tabla=$Visualizar;

}

function odbc() {

global $REQUEST_URI,$Ejemplo,$DSN,$Usuario,$Tabla;

include("tema8/plantillas/odbc.html");

}

</SCRIPT>

La función odbc_connect() conecta con la DSN que se le indique.

La función odbc_exec() ejecuta una instrucción SQL. Necesita forzosamente de la conexióndevuelta por odbc_connect().

La función odbc_result_all() imprime el resultado de la consulta SQL en formato tabla HTML, lacadena que acompaña al cursor como parámetro proporciona los atributos para la etiquetaTABLE.

Visualiza tablas de la base de datos Tema8 a través de la DSN Tema8-ODBC-MySQLmedianteeste ejemplo.

Si dispones de MS-Access, prueba a crear una base de datos, créale una DSN (desde laventana de controladores de ODBC que obtienes a través del panel de control se puedenañadir DSN nuevas) y visualiza sus tablas con este visor PHP de ODBC.

Migración de unos a otros sistemas de bases de datos 

Como último ejemplo vamos a ver como pasar una tabla (estructura y datos) de una base dedatos a otra, con independencia de sus sistemas de bases de datos mediante una DNS deorigen y otra de destino.

La plantilla a utilizar es:

Listado 8.15. C:\Archivos de … Group\Apache\cgi-bin\tema8\plantillas\migrador.htmlPlantila formulario para el migrador.

</SCRIPT>

<FORM action="<?=$REQUEST_URI?>" method="POST">

<INPUT type="hidden" name="Ejemplo" value="<?=$Ejemplo?>">

<TABLE>

<TR><TD colspan="2">

<CENTER>Migrar de ...</CENTER>

</TD></TR>

<LABEL><TR>

<TD><B>DSN ODBC:</B></TD>

<TD><INPUT type="text" name="De_DSN" value="<?=$De_DSN?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Usuario:</B></TD><TD><INPUT type="text" name="De_Usuario" value="<?=$De_Usuario?>"></TD>

</TR></LABEL>

<LABEL><TR>

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 18/19

Tema 8. PHP: Acceso a Bases de Datos

18

<TR><TD colspan="2">

<CENTER>... a ...</CENTER>

</TD></TR>

<TD><B>DSN ODBC:</B></TD>

<TD><INPUT type="text" name="A_DSN" value="<?=$A_DSN?>"></TD>

</TR></LABEL>

<LABEL><TR>

<TD><B>Usuario:</B></TD>

<TD><INPUT type="text" name="A_Usuario" value="<?=$A_Usuario?>"></TD></TR></LABEL>

<TR><TD colspan="2">

<CENTER>... la ...</CENTER>

</TD></TR>

<LABEL><TR>

<TD><B>Tabla:</B></TD>

<TD><INPUT type="text" name="Tabla" value="<?=$Tabla?>"></TD>

</TR></LABEL>

<TR><TD colspan="2"><CENTER>

<INPUT type="submit" name="Migrar" value="Migrar">

<INPUT type="submit" value="Limpiar"></CENTER>

</TD></TR>

</TABLE>

</FORM>

<SCRIPT language="php">

Lo que el código de este ejemplo hace es: conectar con la DSN origen, obtener el cursor de latabla origen, conectar con la DSN destino, extraer información de la estructura de la tablaorigen y crear una tabla en destino como la origen, y por último copiar los datos obtenidos delcursor de la tabla origen a la tabla destino. Veamos, pues, el código:

Listado 8.16. C:\Archivos de programa\Apache Group\Apache\cgi-bin\tema8\migrador.phpMigrador de tablas a través de ODBC.

<SCRIPT language="php">

function migrar($De_DSN,$De_Usuario,$A_DSN,$A_Usuario,$Tabla) {

if (!$Origen=odbc_connect($De_DSN,$De_Usuario,""))

print("<P>Error al conectar con $De_DSN como $De_Usuario</P>");

elseif (!$Cursor=odbc_exec($Origen,"SELECT * FROM $Tabla"))

print("<P>Error al obtener cursor a tabla $Tabla</P>");elseif (!$Destino=odbc_connect($A_DSN,$A_Usuario,""))

print("<P>Error al conectar con $A_DSN como $A_Usuario</P>");

else {

extraerDefinicionCampos($Cursor,$Definicion,$Formatos);

if (odbc_exec($Destino,"CREATE TABLE $Tabla ($Definicion)"))

copiaFilas($Cursor,$Formatos,$Destino,$Tabla);

else

print("<P>Error creando la tabla $Tabla con:<BR>($Definicion)</P>");

}

}

function extraerDefinicionCampos($Cursor,&$Definicion,&$Formatos) {

for ($i=1;$i<=odbc_num_fields($Cursor);$i++) {

if ($i>1) $Definicion.=",";

$Definicion.=odbc_field_name($Cursor,$i);

$Tipo=odbc_field_type($Cursor,$i);

$Definicion.=" ".$Tipo;

if (strToLower($Tipo)=="varchar") {

$Definicion.="(".odbc_field_len($Cursor,$i).")";

$Formatos[]="'%s'";

}

else

$Formatos[]="%d";

}

}

function copiaFilas($Cursor,$Formatos,$Destino,$Tabla) {

for ($i=1;$i<=odbc_num_rows($Cursor);$i++) {

if (odbc_fetch_into($Cursor,$i,$Fila)) {

foreach ($Fila as $j => $Campo) {

if ($j==0)

$Valores=sprintf($Formatos[$j],$Campo);

else

$Valores.=",".sprintf($Formatos[$j],$Campo);

}if (!odbc_exec($Destino,"INSERT INTO $Tabla VALUES($Valores)"))

print("<P>Error añadiendo los valores:<BR>($Valores)</P>");

5/16/2018 Acceso a Base de Datos en PHP - slidepdf.com

http://slidepdf.com/reader/full/acceso-a-base-de-datos-en-php 19/19

Tema 8. PHP: Acceso a Bases de Datos

19

}

else

print("<p>Error al leer fila $i</P>");

}

}

function resultado() {

global $Migrar,$De_DSN,$De_Usuario,$A_DSN,$A_Usuario,$Tabla;

if (isset($Migrar))

migrar($De_DSN,$De_Usuario,$A_DSN,$A_Usuario,$Tabla);else

$De_DSN=$De_Usuario=$A_DSN=$A_Usuario=$Tabla=$Migrar;

}

function migrador() {

global $REQUEST_URI,$Ejemplo,$Tabla;

global $De_DSN,$De_Usuario,$A_DSN,$A_Usuario;

include("tema8/plantillas/migrador.html");

}

</SCRIPT>

La función extraerDefinicionCampos() obtiene información de la estructura de la tabla(nombres y tipos de sus campos) a través de as funciones odbc_num_fields(),odbc_field_name(), odbc_field_type() y odbc_field_len() y la devuelve en lacadena $Definicion (usada para crear la tabla) y en el array $Formatos donde se guardalos formatos %d o ’%s’ según sea el campo entero o cadena (No estamos contemplando mástipos de datos en los ejemplos de este tema).

La función copiaFilas() recorre todas las filas (odbc_num_rows()) mediante la funciónodbc_fetch_into() que pasa la fila a un array que es compuesto con los formatoscorrespondientes para enviar en una instrucción SQL INSER INTO ….

Para probarlo créate una base de datos MS-Access vacía llamada Tema8. Si no dispones deMS-Access, en el directorio datos (donde se guarda la información de las sesiones) tienes una.Crea una DSN con el controlador ODBC de Access llamada Tema8-ODBC-Access paraacceder a la base de datos vacía que has creado. Ahora ejecuta el ejemplo y pasa todas tustablas de la base de datos Tema8 de MySQL a la nueva de Access a través de las DSN

Tema8-ODBC-MySQL y Tema8-ODBC-Access . Abre la base de datos en Access y compruebala migración. Si no dispones de Access usa el visor ODBC del ejemplo anterior.

8.5. Combinando ejemplos.

Hemos terminado el tema habiendo creado una serie de herramientas que a través de Web nosvan a permitir manipular datos en cualquier sistema de base de datos del que dispongamos sucontrolador ODBC, apoyándonos si es necesario en tablas que nos creemos o migremos aMySQL de forma temporal.

Por ejemplo, si nos creamos la DSN Tema8-ODBC-Texto con el controlador ODBC de texto y

vinculándolo a un directorio cualquiera (o creando uno vacío para tal menester), podemoshacar tablas en MySQL, pasarlas a texto a través del nuevo DSN y para consultarlas podemosusar el visor ODBC.