|
|
Línea 382: |
Línea 382: |
| | | |
| ===Consultas preparadas=== | | ===Consultas preparadas=== |
| + | *Una consulta preparada consiste en establecer una consulta como si fuera una variable y ejecutarla posteriormente tantas veces como sea necesario. |
| + | *Estas consultas se almacenan en el servidor y están listas para ser ejecutadas cuando sea necesario. El servidor solo tiene que analizarlas una vez |
| + | *Para trabajar con consultas preparadas, debemos usar la clase '''''mysqli_stmt''''', e inicializarla con el método '''''stmt_init ''''' |
| + | <source lang=php> |
| + | $dwes = new mysqli('localhost', 'dwes', 'abc123.', 'dwes'); |
| + | //Preparo el objeto $consulta para crear consultas preparadas en él |
| + | $consulta = $dwes->stmt_init(); |
| + | </source> |
| + | Los pasos para trabajar con consultas preparadas son: |
| + | #Preparar la consulta en el servidor MySQL utilizando el método '''''prepare'''''. |
| + | #Ejecutar la consulta, tantas veces como sea necesario, con el método '''''execute'''''. |
| + | #Una vez que ya no se necesita más, se debe ejecutar el método '''''close'''''. |
| + | <source lang=php> |
| + | $consulta = $dwes->stmt_init(); |
| + | $consulta->prepare('INSERT INTO familia (cod, nombre) VALUES ("TABLET", "Tablet PC")'); |
| + | $consulta->execute(); |
| + | $consulta->close(); |
| + | $dwes->close(); |
| + | </source> |
| + | ===Parametrizar las consultas preparadas=== |
| + | *El uso real de las consultas preparadas es que los valores que pasas se asignen antes de ejectuar la consulta. |
| + | *La idea es preapara la consulta sin indicar los valores. |
| + | *Asignar los valores y ejectuar la consulta cuantas veces sea necesario. |
| + | *Veamos el proceso |
| + | ;Parametrizar la consulta |
| + | *Consiste en indicar en la consulta preparada en lugar de los valores, signos de interrogación '''''?''''' |
| + | *En el caso anterior |
| + | <source lang=php> |
| + | $consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?,?); |
| + | </php> |
| + | *Ahora habría que asigar los valores. Para ello usamos el método '''''bind_param'''' |
| + | <bind_param(tipoDatos, > |
| + | *Este método recibe dos tipos de parámetros |
| + | #El primero es una cadena de caracteres, donde cada carácter especifica el tipo de valor que va a recibir cada uno de los valores esperados en la consulta. |
| + | **La codificación sería : |
| + | #s: cadena de caracteres |
| + | #i: número entero |
| + | #d: número float |
| + | #b: valor binario (BLOB) |
| + | *En nuestro caso como va a recibir en los dos parámetros cada uno una cadena de caracteres sería '''''"ss"''''' |
| + | #El segundo grupo sería cada uno de los valores.SIEMPRE hay que especificar variables |
| + | *En el ejemplo que estamos siguiendo |
| + | <source lang=php> |
| + | $consulta = $dwes->stmt_init(); |
| + | $consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?, ?)'); |
| + | $cod_producto = "TABLET"; |
| + | $nombre_producto = "Tablet PC"; |
| + | $consulta->bind_param('ss', $cod_producto, $nombre_producto); |
| + | </source> |
| + | *Insistimos en que siempre hay que especificar variables, de modo que |
| + | <source lang=php> |
| + | $consulta->bind_param('ss', 'TABLET', 'Tablet PC'); // Genera un error |
| + | </source> |
| + | {{Resumen| |
| + | $conexion = new mysqli(...); |
| + | $consulta = $conexion->stmt_init(); |
| + | $consulta->prepare(...sentencia ... con ???) |
| + | $consulta->bind_param('s-i-b-d(tipo_de_valores)',valores_en_variables_respectivos_a_????'); |
| + | $consulta->execute(); |
| + | $consulta->close(); |
| + | $conexion->close(); |
| | | |
| + | }} |
| + | ===Consultas preparadas que retornan valores==== |
| + | *En caso de que la consulta preparada retorne valores se recogen con el método '''''bind_result'''' |
| + | *Este método recibirá variables en los que se almacenarán los valores |
| + | *Para recorre el conjunto de valores, usamos el método fectch(), como se ve en el ejemplo |
| + | <source lang=php> |
| + | $consulta = $dwes->stmt_init(); |
| + | $consulta->prepare('SELECT producto, unidades FROM stock WHERE unidades<2'); |
| + | $consulta->execute(); |
| + | $consulta->bind_result($producto, $unidades); |
| + | while($consulta->fetch()) { |
| + | print "<p>Producto $producto: $unidades unidades.</p>"; |
| + | } |
| + | $consulta->close(); |
| + | $dwes->close(); |
| + | </source> |
| + | *Aquí hay un enlace para una información completa sobre consultas preparadas |
| + | http://php.net/manual/es/class.mysqli-stmt.php |
| | | |
| + | {{Actividad| |
| + | *Crea una página web en la que se muestre el stock existente de un determinado producto en cada una de las tiendas. |
| + | *Para seleccionar el producto concreto utiliza un cuadro de selección dentro de un formulario en esa misma página. Puedes usar como base los siguientes ficheros. |
| | | |
− | | + | }} |
− | | + | |
− | | + | |
| <!-- | | <!-- |
| ===Definición de funiones= | | ===Definición de funiones= |
BASES DE DATOS
Introducción
- Idea de independizar la base de datos y el lenguaje de programación: concepto de driver, conector y extensión (mysql, mysqli, PDO).
http://php.net/manual/es/mysqli.overview.php
- Para trabajar con bases de datos debemos
- Conectarnos (Para ello necesitamos un software específico del gestor de bases de datos con el que vayamos a trabajar).
- Seleccionar (La base de datos con la que vamos a trabajr).
- Normalmente también
- Actuar con la base de datos (Consultas, inserciones, modificaciones y/o borrados)
- Procesar información
- Cerrar la base de datos
- Para realizar estas acciones disponemos de diversas funciones específicas dentro de PHP,
- PHP tiene un API especifico para trabajar directamente con mysql mysqli, el cual incorpora el driver y conector necesario para trabajar con ella de forma nativa
- Que el driver sea nativo es que está implementado utlizando un framework de extensiones dde php.
- También vamos a disponer de la extensión PDO, la cual se independiza del gestor concreto de bases datos que vayamos a utilizar.
- Por lo tanto en este tema vamos a ver dos extensiones:
- mysqli usar una extensión nativa con su SGBD en concreto mysql que viene con el propio lenguaje
- PDO usar una extensión genéricoa que permite conectarse con cualquier gestor de BD, sin necesidad de cambiar nada de código.
Introduccion Usao de extensiones orientadas a objetos
- Para trabajar con las extensiones, las usaremos siempre orientadas a objetos, aunque tengan
la correspondiente funcionalidad en el lenguaje estructurado.
- Para recordar muy brevemene posemos usar el siguiente enlace
http://www.desarrolloweb.com/articulos/1540.php
- Posteriormente veremos un tema de php orientado a objetos
- Recordamos que para crear una nueva instancia de una clase usamos el operador new
- Para acceder a los diferentes métodos del objeto instaciado
$miObjeto->metodo($parametros);
- Con estos detalles nos sobra de momento para este tema.
Mysql y php
- Instalar mysql lo hicimos en el primer tema
apt-get install mysql-server mysql-client
- Para parar/arrancar el servicio
service mysql start/stop/restart/status
- El fichero de configuración
/etc/mysql/my.cnf
- En él podemos ver el puerto (3306 por defecto), el usuario y otros parámetros del servicio
- Podemos accecder a la documentación que php da sobre mysqli (mysql improve), o sea interfaz mysql mejorada http://php.net/manual/es/class.mysqli.php
- Debmos saber conectarnos por línea de comandos
Actividad
- Conectar a mysql
- Mira Las bases de datos que tienes
- usa una base de datos concreta
- mira las tablas que tiene esa bases de datos
- mira la estructura de la tabla
- Haz una consulta de los valores que tiene su primera columna
- ejecuta el comando help
- sal de sql
|
Archivo:BaseDatos.pdf
Actividad
Usa mysql para cargar por líneas de comandos el siguiente fichero arriba especificado
|
- En la siguiente página puedes hacer un repaso de mysql
http://dev.mysql.com/doc/refman/5.7/en/index.html
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/
- Debemos conocer también la herramienta phpmyadmin
sudo apt-get install phpmyadmin
- Aquí tienes una pequeña guía es de uso sencillo e intuitivo
http://www.ite.educacion.es/formacion/materiales/85/cd/linux/m5/instalacin_y_configuracin_de_phpmyadmin.html
- Y más información en la página oficial
http://www.phpmyadmin.net/home_page/index.php
Actividad
Probamos a conectarno por phpmyadmin a nuestro servidor local
|
Archivo:Datos.sql
Actividad
Usando phpmyadmin, carga los datos para poblar la base de datos
|
- Otra herramienta importante que permite realizar diseños es workbrench
http://dev.mysql.com/doc/workbench/en/index.html
sudo add-apt-repository ppa:olivier-berten/misc
sudo apt-get update
sudo apt-get install mysql-workbench
Actividad
Instalamos y probamos las diferentes opciones con esta herramienta
Probamos a hacer un diseño en modelo realcional y a partir del modelo creamos las tablas.
- Probamos las opciones forward engineer y reverser engineer
|
Herramientas de administración
- Con phpmyadmin, podemos hacer casi todo de administrar y manejar las bases de datos
- No obstante mysql proporciona una serie de herraminetas que perminten administrar por línea de comandos .
- En muchas ocasiones este tipo de operaciones resultan muy interesantes.
- mysql
- myhsqladmin
- mysqlshow
- mysql
- Esta heramienta ya la hemos comentado, permite conectarse a un servidor MySQL para ejecutar sentencias SQL
- Opciomes básicas ya conocidas
- connect -h,-u, -p
- use database
- exit o quit
- help Para conocer los comandos que se pueden usar.
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/sql-syntax.html
- mysqladmin
- Es un cliente específico para la administración
- Entre otras acciones podemos realizar
- crear y eliminar bases de datos.
- mostrar la configuración y el estado del servidor.
- cambiar contraseñas.
- detener un servidor.
- ver la version del servidor
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/mysqladmin.html
Actividad
Prueba a hacer cada una de las acciones especificadas anteriormente
|
- mysqlshow
http://ftp.nchu.edu.tw/MySQL//doc/refman/5.0/es/mysqlshow.html
- muestra informaicón sobre la base de datos
mysqlshow -u root -proot
- Nos mostraría las tablas de ese ususario
Mysql y su extensión mysqli para php
- CONECTARNOS A LA BASE DE DATOS
- A continuación iremos viendo como implementar las acciones básicas en el lenguaje
- Conectarse
- Para conectarse a una base de datos , creamos una instacia de la clase mysqli de la forma
$miConexion = new mysqli(....);
- El constructor de la clase puede recibir hasta 5 parámetros, de los cuales 4 se suelen usar con bastante frecuencia
- $host nombre o ip del equipo (null o localhost, identificaría el equipo actual).i
- $usario es el usuario de la base de datos
- $pass
- $nombreBD
- $puerto
- $shocket
$host="localhost"
$usuario="manolo";
$pass="romero";
$nombreBD="alumnos";
$miConexion = new mysqli ($host,$usuario,$pass,$nombreBD);
if ($miConexion==null)
echo"Error conectando a la base de datos";
else
echo "Conectado a la base de datos";
- Esta función retorna el recurso de la conexión
- Para gestionar los errores deberíamos usar el atributo connect_error de la clase mysqli
- Este atributo aporta información sobre el error o contiene null si no se ha producido ninguno.
- En el código anterior
if ($miConexion->connect_error)
echo "Error conectando con la base de datos: ".$miConexion->connect_error;
- Para ver información sobre la conexión se puede usar los atributos *server_info o host_info
Resumen
$conesion= new mysqli($host,$user,$pass,$bd);
mysqli->conect_error
mysqli->conect_errno
mysqli->server_info
mysqli->host_info
|
- Hay muchas opciones de mysqli que se pueden configurar en el fichero php.ini
- Aquí tenemos alguna de ellas
- mysqli.allow_persistent
- Permite crear conexiones persistentes.
- mysqli.default_port
- Número de puerto TCP predeterminado a utilizar cuando se conecta al Servidor de base de datos.
- mysqli.reconnect
- Indica si se debe volver a conectar automáticamente en caso de que se pierda la conexión.
- mysqli.default_host.
- Host predeterminado a usar cuando se conecta al servidor de base de datos.
- mysqli.default_user.
- Nombre de usuario predeterminado a usar cuando se conecta al servidor de base de datos.
- mysqli.default_pw
- Contraseña predeterminada a usar cuando se conecta al servidor de base de datos.
- La lista completa la podemos ver en el siguiente link
http://php.net/manual/es/mysqli.configuration.php
Actividad
- configura dicho fichero, para poder conectar a la base de datos sin aportar parámetros al constructor
- Luego déjalo como estaba :)
|
Cambiar la base de datos
- Si hemos seleccionado una base de datos, o no hemos seleccionado ninguna y queremos cambiar a otra
$miConexion->select_db("nombre_base_datos");
- Cuando ya no vamos a usar un recurso, conviente y repito CONVIENE, liberarlo.
DML
- En SQL sabemos que tenmos tres tipos de lenguajes DDL, DML, DCL
- Ahora toca DML, Leguane de maninputación de datos
- Podemos clasificar en dos tipos de clúsulas:
- las que no devuelven registros de datos (INSERT, DELETE, UPDATE)
- Generalmente retornan un entero que es el número de filas aceptadas o un booleano que indica si se realizó no la operación
- Las que pueden retornan una colección de filas (SELECT), generalmente conocidas como cursor.
- En mysqli podemos enviar cualquiera de estas claúsulas con el método query
INSERT, UPDATE Y DELETE
- Este tipo de sentencias retornan un booleano que indica si se ha realizado o no la acción
- El número de filas afectadas lo podemos ver en el atributo affected_rows
Resumen
$reusultado=miConexion->query($consulta)
if($resultado){
echo"Se han afectado $miConexion->affected_rows filas en esta acción");
}
|
$sentenciaDelete="DELETE FROM tabla WHERE condicion";
$sentenciaInsert="INSERT INTO tabla (opcional lista de campos) VALUES (valores en posiciones respectivas a los campos);
$sentenciaUpdate="UPDATE tabla WHERE condicion";
$miConexion->query($sentenciasDelete);
$resultado =$miConexion->query($sentenciaDELETE);
if ($resultado){
echo "Se han borrado $miConexion->affected_rows filas ";
}
$miConexion->query($sentenciasUpdate);
$resultado = $miConexion->query($sentenciaUPDATE);
if ($resultado){
echo "Se han actualizado $miConexion->affected_rows filas ";
}
$miConexion->query($sentenciasInsert);
$resultado = $miConexion->query($sentenciaINSERT);
if ($resultado){
echo "Se han insertado $miConexion->affected_rows filas ";
}
- Observemos su uso en el ejemplo
//Establecemos la conexión
$miConexion = new mysqli('localhost', 'manolo', '12345.', 'baseDatosPrueba');
//Capturamos un posible error
$error = $miConexion->connect_errno;
//En caso de error informamos de ello
if ($error == null) {
$resultado = $miConexion->query('DELETE FROM stock WHERE unidades=0');
if ($resultado) {
print "<p>Se han borrado $miConexion->affected_rows registros.</p>";
}
}
$miConexion->close();
}
Clausula SELECT con query
- Tenemos dos maneras de realizar consultas con mysqli
- query
- real_query
- En el primero caso el método nos retorna un cursor que será de la calse mysqli_result
- En el segundo caso nos retornará un booleano y para leer los datos deberemos usar o store_result o use_result según veamos a continuación.
Método query
- Una vez que tenemos los datos almacenados debemos saber acceder.
- Tenemos 4 formas de poder acceder a los datos según usemos un método u otro
- fetch_array()
- Va obteniendo cada registro como un array
- Este array podemos usar tanto de forma indexada, como asociativa (con el nombre del campo)
- fetch_assoc()
- En este caso el array que retorna es asociativo
- fetch_row()
- En este caso el array que retorna es indexado
- fetch_object()
- En este caso en lugar de retornar un array, retorna un objeto, donde cada campo son los diferentes atributos de ese objeto
- En todos los casos cada vez que leemos un elemento de mysqli_result, lo que por comparativa sería un cursor, vamos avanzando al siguiente. Cuando hayamos leído todos retornaría null
Actividad
Obtén todos los registros de la tabla familia y visualizalos en una tabla usando los tres modos de lectura de datos vistos anteriormente
|
- Para liberar un recurso del tipo mysqli_result, usamos el método free();
- La clase mysqli_result, además de los métodos vistos tiene un par de atributos interesantes
- int $field_count;
- Nos dice cuantas columnos tiene el query actual
- int $num_rows;
- Nos dice cuantas filas hemos obtenido con la consulta
- Tenemos una lista completa
http://es.php.net/manual/es/class.mysqli-result.php
Resumen
$conexion= new mysqli($host,$user,$pass,$bd);
if ($conexion->connect_errno==null){
$resultado = $conexion->query($consulta);
$numFilas = $resultado->num_rows;
$numCampos = $resultado->fields_count;
echo "La consulta ha retornado $numFilas filas con $numCampos columnas";
$fila = $resultado->fetch_array();
while ( $fila){
echo"El valor del primer campo es $fila[0]";
$fila = $resultado->fetch_array();
}
$fila->free();
$conexion->close();
}
|
Actividad
Haciendo una consulta del tipo select * from producto whre pvp < 200, realiza un código que visualizce en una tabla los resultados
|
Transacciones
Definición
Una transacción es un conjunto de acciones u operaciones que se realizan contra una base de datos de modo que o bien se realizan correctamente todas o no se realiza ninguna
|
- Supongamos que hacemos una transferencia bancaria; cuando menos implica descontar dinera de una cuenta e ingresaro en otra
- Ahora supongamos que nada mas descontar el dinero de una cuenta se cae la luz y se apaga el servidor
- Esto creará una inconsistencia en la base de datos
- Por defecto en mysqli cada acción con la base de datos es una transacción en sí misma, pero esto se puede modificar
$conexion = new mysqli(..);
$conexion->autocomit(false);
.....
- Si se ha desactivado el autocomit, para terminar una transacción debemos usar los métodos commit o rollback
$conexion = new mysqli(..);
$conexion->autocomit(false);
.....
if (CondicionOK){
//Terminamos la transacción confirmando todas las acciones sobre la base de datos desde que se inició la
transaccion
$conexion->commit();
}else{
//Terminamos la transacción desaciendo todas las acciones sobre la base de datos desde que se inició la
transaccion, y dejando la base de datos igual que estaba al principio
$conexion->rollback();
}
Actividad
Ejercicio de transacciones
|
Consultas preparadas
- Una consulta preparada consiste en establecer una consulta como si fuera una variable y ejecutarla posteriormente tantas veces como sea necesario.
- Estas consultas se almacenan en el servidor y están listas para ser ejecutadas cuando sea necesario. El servidor solo tiene que analizarlas una vez
- Para trabajar con consultas preparadas, debemos usar la clase mysqli_stmt, e inicializarla con el método stmt_init
$dwes = new mysqli('localhost', 'dwes', 'abc123.', 'dwes');
//Preparo el objeto $consulta para crear consultas preparadas en él
$consulta = $dwes->stmt_init();
Los pasos para trabajar con consultas preparadas son:
- Preparar la consulta en el servidor MySQL utilizando el método prepare.
- Ejecutar la consulta, tantas veces como sea necesario, con el método execute.
- Una vez que ya no se necesita más, se debe ejecutar el método close.
$consulta = $dwes->stmt_init();
$consulta->prepare('INSERT INTO familia (cod, nombre) VALUES ("TABLET", "Tablet PC")');
$consulta->execute();
$consulta->close();
$dwes->close();
Parametrizar las consultas preparadas
- El uso real de las consultas preparadas es que los valores que pasas se asignen antes de ejectuar la consulta.
- La idea es preapara la consulta sin indicar los valores.
- Asignar los valores y ejectuar la consulta cuantas veces sea necesario.
- Veamos el proceso
- Parametrizar la consulta
- Consiste en indicar en la consulta preparada en lugar de los valores, signos de interrogación ?
- En el caso anterior
$consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?,?);
</php>
*Ahora habría que asigar los valores. Para ello usamos el método '''''bind_param''''
<bind_param(tipoDatos, >
*Este método recibe dos tipos de parámetros
#El primero es una cadena de caracteres, donde cada carácter especifica el tipo de valor que va a recibir cada uno de los valores esperados en la consulta.
**La codificación sería :
#s: cadena de caracteres
#i: número entero
#d: número float
#b: valor binario (BLOB)
*En nuestro caso como va a recibir en los dos parámetros cada uno una cadena de caracteres sería '''''"ss"'''''
#El segundo grupo sería cada uno de los valores.SIEMPRE hay que especificar variables
*En el ejemplo que estamos siguiendo
<source lang=php>
$consulta = $dwes->stmt_init();
$consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?, ?)');
$cod_producto = "TABLET";
$nombre_producto = "Tablet PC";
$consulta->bind_param('ss', $cod_producto, $nombre_producto);
- Insistimos en que siempre hay que especificar variables, de modo que
$consulta->bind_param('ss', 'TABLET', 'Tablet PC'); // Genera un error
Consultas preparadas que retornan valores=
- En caso de que la consulta preparada retorne valores se recogen con el método bind_result'
- Este método recibirá variables en los que se almacenarán los valores
- Para recorre el conjunto de valores, usamos el método fectch(), como se ve en el ejemplo
$consulta = $dwes->stmt_init();
$consulta->prepare('SELECT producto, unidades FROM stock WHERE unidades<2');
$consulta->execute();
$consulta->bind_result($producto, $unidades);
while($consulta->fetch()) {
print "<p>Producto $producto: $unidades unidades.</p>";
}
$consulta->close();
$dwes->close();
- Aquí hay un enlace para una información completa sobre consultas preparadas
http://php.net/manual/es/class.mysqli-stmt.php
Actividad
- Crea una página web en la que se muestre el stock existente de un determinado producto en cada una de las tiendas.
- Para seleccionar el producto concreto utiliza un cuadro de selección dentro de un formulario en esa misma página. Puedes usar como base los siguientes ficheros.
|
|