sábado, 29 de noviembre de 2014

Acceso a las bases de datos con PHP - 5 de 6



d. Modificar datos

Para obtener el número de registros que la consulta de tipo UPDATE ha modificado, utilice la función mysqli_stmt_affected_rows().

Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y devuelve -1 en caso de error y el número de registros actualizados en caso contrario.

Por ejemplo, para modificar la persona cuyo apellido es MORALES, cambiando su apellido de nuevo a Morales y su edad de 62 a 61 años:

<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
$sql = "UPDATE Persona SET Apellidos = ?, Edad = ? WHERE Apellidos =
’MORALES’";
// Preparación de la consulta
$resultado = mysqli_prepare($base, $sql);
// Enlace de argumentos.
$ok = mysqli_stmt_bind_param($resultado, ’si’,$apellido,$edad);
$apellidos = ’Morales’;
$edad = 61; //Mientras no ejecute la consulta,
//puede inicializar las variables
// Ejecución de la consulta.
$ok = mysqli_stmt_execute($resultado);
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
echo "Número de personas modificadas:
".mysqli_stmt_affected_rows($resultado).".<br />";
}
mysqli_stmt_close($resultado);
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>

Da como resultado:

Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Número de personas modificadas:1.
Desconexión realizada.


e. Eliminar datos

De la misma manera que para escribir o modificar datos, vamos a utilizar las funciones mysqli_prepare(), mysqli_stmt_bind_param() y mysqli_stmt_execute() para eliminar datos.

Por ejemplo, para eliminar a David Morales:

<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
$sql = "DELETE FROM Persona WHERE Apellidos = ?";
// Preparación de la consulta
$resultado = mysqli_prepare($base, $sql);
// Enlace de argumentos.
$ok = mysqli_stmt_bind_param($resultado, ’s’,$apellido);
$apellidos = ’Morales’; //Mientras no ejecute la consulta,
//puede inicializar la variable
// Ejecución de la consulta.
$ok = mysqli_stmt_execute($resultado);
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
echo "Persona eliminada.<br />";
}
mysqli_stmt_close($resultado);
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>

Da como resultado:

Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Persona eliminada.
Desconexión realizada.


f. Almacenar un resultado

Si quiere saber el número de registros seleccionados en una consulta de tipo SELECT, hay una función que permite almacenar el resultado y otra que obtiene el número de registros de este resultado.

La función mysqli_stmt_store_result() permite almacenar en la memoria el resultado de una consulta. Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y devuelve false en caso de error y true en caso contrario.

La función mysqli_stmt_num_rows() permite devolver el número de registros de una consulta preparada. Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y devuelve 0 en caso de error y el número de registros de la consulta en caso contrario.

La función mysqli_stmt_free_result() permite liberar memoria con el resultado que se ha obtenido con mysqli_stmt_store_result(). Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y no devuelve nada.

Por ejemplo, para mostrar el número de personas que son mayores de 35 años:

<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
$sql = "Select Nombre, Apellidos FROM Persona WHERE Edad > ?";
// Preparación de la consulta
$resultado = mysqli_prepare($base, $sql);
// Enlace de argumentos.
$ok = mysqli_stmt_bind_param($resultado, ’i’,$Edad);
$Edad = 35; //mientras no ejecute la consulta,
//puede inicializar la variable
// Ejecución de la consulta.
$ok = mysqli_stmt_execute($resultado);
if ($ok == FALSE) {
echo "Error en la ejecución de la consulta.<br />";
}
else {
// Asociación de variables de resultado.
$ok = mysqli_stmt_bind_result($resultado,$Apellido,$Nombre);
// Almacenamiento de valores.
$ok = mysqli_stmt_store_result($resultado);
echo "Número de personas que tengan una edad > 35:
".mysqli_stmt_num_rows($resultado)."<br />";
//Liberación del resultado
mysqli_stmt_free_result($resultado);
mysqli_stmt_close($resultado);
}
if (mysqli_close($base)) {
echo ’Desconexión realizada.<br />’;
}
else {
echo ’Error en la desconexión.’;
}
}
else {
printf(’Error %d : %s.<br/>’,mysqli_connect_errno(),
mysqli_connect_error());
}
?>

Da como resultado:

Conexión realizada.
Información del servidor:MySQL host info: 127.0.0.1 con TCP/IP
Número de personas que tengan una edad > 35: 2
Desconexión realizada.

Este método consume memoria; por lo tanto, debe tener cuidado con lo que almacena en ella.


g. Examinar los errores de una consulta preparada

Las funciones que permiten recuperar los errores de una consulta preparada son mysqli_stmt_errno() y mysqli_stmt_error().

La función mysqli_stmt_errno() permite devolver el número de error. Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto y devuelve 0 si no hay error.

La función mysqli_stmt_error() permite devolver el mensaje de error. Esta función toma como argumento el objeto consulta que la función mysqli_prepare() ha devuelto.

Estas funciones muestran los errores una vez que se ejecuta la consulta. Para ver los errores de preparación, utilice las funciones mysqli_errno() y mysqli_error().

Por ejemplo, si añade una persona con un identificador que ya existe:

<?php
// Conexión a la base de datos
$base = mysqli_connect("127.0.0.1", "root", "", "_prueba");
if ($base) {
echo ’Conexión realizada.<br />’;
echo ’Información del servidor:’.mysqli_GET_host_info($base).
’<br />’;
$sql = "INSERT INTO Persona (Id_person, nombre, edad) VALUES (?,?,?)";
// Preparación de la consulta
$resultado = mysqli_prepare($base, $sql); &


Esta librería se escribe en lenguaje objeto; por lo tanto, la sintaxis puede ser confusa. En el capítulo El objeto se explica más detalladamente la programación orientada a objetos.

Como requisito, es preciso haber creado la tabla Persona.


Y también los siguientes datos:


La sección PHPMyAdmin explica cómo debe crear la base con los datos.


2. Conexión

Para conectarse a base de datos MySQL, debe crear una instancia de la clase PDO, es decir, crear un objeto que es un elemento de la clase PDO, pero con algunos argumentos. Este concepto se explica de manera más concreta en el capítulo de programación orientada a objeto.

El objeto que permite conectarse a MySQL es PDO().

Este objeto toma como argumentos:
  • La cadena de conexión: cadena de caracteres que contiene el SGBD utilizado y el nombre o la dirección IP del host, que corresponde a "localhost" o 127.0.0.1 si trabaja en modo local. Esta cadena también contiene el nombre de la base de datos.
  • El usuario: cadena de caracteres que contiene el nombre de usuario para conectarse a la base de datos. Si trabaja en modo local, corresponde a "root". Atención, este usuario tiene todos los derechos sobre su base de datos.
  • La contraseña: cadena de caracteres que contiene la contraseña asociada al usuario. Por defecto está vacía.

Por ejemplo, para conectarse a la base de datos _prueba:

<?php
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
?>

La variable $base es un objeto; por lo tanto, no puede mostrar su valor.

Para comprobar si el código ha generado un error, debe escribir el código con la instrucción try {} catch (Exception $e) {}.

Por ejemplo:

<?php
try {
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
}
catch (Exception $e) {
die(’Error : ’ . $e->GetMessage());
}
?>

Si en el bloque try pasa un error, PHP pasa automáticamente al bloque catch y por lo tanto ejecuta la instrucción die(). La función die() equivale a la función exit(), es decir, termina el script actual mostrando un mensaje.

Para recuperar los errores que se producen, debe añadir el siguiente código:

$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

Este código va a activar las excepciones PDO.

Desde la versión 5.5 de PHP, es posible usar el bloque finally. Es bloque se ubica después del catch y siempre se ejecuta.

Por ejemplo:

<?php
try {
$base = new PDO(’mysql:host=127.0.0.1;dbname=_prueba’, ’root’, ’’);
$base->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
echo "Conexión ok.";
}
catch (Exception $e) {
die(’Error : ’ . $e->GetMessage());
}
finally {
$base = null; //cierre de la conexión
}
?>

Da como resultado:

Conexión ok.


En todos los casos, el código pasa al bloc finally y cierra la conexión.



Espero haber ayudado en algo. Hasta la próxima oportunidad!









No hay comentarios:

Publicar un comentario en la entrada