2. Scientific Report on Components
2.6 Other Components
2.6.4 PaaS Application Manager
Actualizar los datos consiste en ejecutar las consultas
INSERT
(creación),UPDATE
(modificación) oDELETE
(eliminación).La ejecución de este tipo de consulta se puede efectuar con el método SQLite3::query, como para una consulta SELECT. Sin embargo, existe otro método SQLite3::exec, especialmente previsto para ejecutar una consulta que no devuelve ningún resultado y cuyo uso se recomienda.
Sintaxis
http://www.eni-training.com/client_net/mediabook.aspx?idR=85157 13/16
Además, dos métodos interesantes son:
SQLite3::changes
ySQLite3::lastInsertRowId
El métodoSQLite3::changes
permite conocer el número de líneas afectadas (insertadas, modificadas o eliminadas) por la última consulta INSERT, UPDATE o DELETE ejecutada en una base de datos.Sintaxis
entero SQLite3::changes()
Si la última consulta ha fallado, el método
SQLite3::changes
devuelve 0.El método
SQLite3::lastInsertRowId
devuelve el valor del último identificador generado por una consultaINSERT
en una base de datos, para una columna declarada enINTEGER PRIMARY
KEY
.Sintaxis
entero SQLite3::lastInsertRowId()
Si no se ha generado ningún identificador automáticamente, el método
SQLite3::lastInsertRowId
devuelve 0.La consulta INSERT no tiene por qué ser la última consulta ejecutada en la base de datos. Ejemplo
<?php
// Inclusión del archivo que contiene la definición de las // funciones generales.
require(’funciones.inc’);
// Definición de una pequeña función para mostrar la lista // de artículos.
function MostrarArtículos() {
$consulta = ’SELECT * FROM artículos’;
$artículos = db_leer_líneas_en_matriz($consulta); if ($artículos) {
echo ’<b>Lista de artículos:</b><br />’; foreach($artículos as $a) {
echo "$a[identificador] - $a[texto] - $a[precio]<br />"; } } else { echo "<b>Más artículos.</b><br />"; } } // Abrir la base.
$base = new SQLite3(’/app/sqlite/diane.dbf’); // Visualización de control.
http://www.eni-training.com/client_net/mediabook.aspx?idR=85157 14/16
$consulta = ’UPDATE artículos SET precio = precio * 1.1’ . ’WHERE precio < 40’;
$resultado = $base->exec($consulta); $número = $base->changes();
echo "$número artículo(s) añadido(s).<br />"; // Consulta DELETE.
$consulta = ’DELETE FROM artículos WHERE precio > 40’; $resultado = $base->exec($consulta);
$número = sqlite_changes($base);
echo "$número artículo(s) eliminado(s).<br />"; // Visualización de control. MostrarArtículos(); ?> Resultado Lista de artículos: 1 - Albaricoques - 35.5 2 - Cerezas - 48.9 3 - Fresas - 29.95 4 - Melocotones - 37.2
Identificador del nuevo artículo = 5. 4 artículo(s) añadido(s). 2 artículo(s) eliminado(s). Lista de artículos: 1 - Albaricoques - 39.05 3 - Fresas - 32.945 5 - Peras - 32.89
Crear formularios que permitan actualizar los datos es muy simple. Por ejemplo, vamos a construir un formulario que permite realizar una entrada en lista.
Presentación del formulario
http://www.eni-training.com/client_net/mediabook.aspx?idR=85157 15/16 Columna Nombre Identificador
entrada[i][modificar]
Textoentrada[i][texto]
Precioentrada[i][precio]
Eliminarentrada[i][eliminar]
El formulario ofrece el contenido actual de la tabla que se puede cambiar (entrada directa en los campos) o eliminar (a través de casillas de verificación), además de cinco líneas en blanco que permiten introducir nuevos valores. En ninguno de estos casos se puede introducir el identificador (es el motor SQLite quien debe asignarlo).
Cada línea de la matriz contiene 4 cuadros de formulario que se denominan (atributo
name
de la etiqueta<input>
) de la siguiente manera:El índice
i
es el identificador del artículo para las líneas existentes, y un número entre -1 y -5 para las líneas en blanco. El campo de la columna identificador es un campo oculto (tipo="hidden"
), que se utiliza para identificar las líneas en las que el usuario ha realizado alguna modificación.Con este proceso de denominación, todos los datos introducidos se recuperan en el script PHP en
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=85157 16/16
Este código JavaScript tiene el efecto, cada vez que se cambia el campo en cuestión, de colocar un 1 en el campo oculto asociado a la línea. El formulario se llama
formulario
(<form name =
"formulario"...
), la expresióndocumento.formulario[n]
designa el enésimo campo del formularioformulario
del documento actual, el primer campo del formulario tiene el número 0. En la fuente, la variable$n
se calcula para cada línea$i
del formulario, por la fórmula$n = 4 * ($i -
1)
: el campo oculto de la línea 1 tiene el número 0 (es el primero del formulario), el de la línea 2 el número 4 y así sucesivamente.Este ejemplo puede (debe) mejorarse:
Para controlar los datos introducidos por el usuario. Para gestionar los errores.
Fuente <?php
// Inclusión del archivo que contiene las funciones // generales.
require(’funciones.inc’); // Abrir la base de datos.
$base = new SQLite3(’/app/sqlite/diane.dbf’); // Procesamiento del formulario.
if (isset($_POST[’ok’])) {
// Recuperar la matriz que contiene los datos introducidos. $líneas = $_POST[’entrada’];
foreach($líneas as $identificador => $línea) { // Limpieza de los datos introducidos. $texto = trim($línea[’texto’]);
// Para el precio, reemplazar la coma por un punto // y eliminar los espacios.
$precio = str_replace(’,’,’.’,$línea[’precio’]); $precio = str_replace(’ ’,’’,$precio);
// En este punto, debe comprobar los datos introducidos ... // Definición de la consulta que se va a ejecutar.
// Para cada acción, utilizaremos una consulta // diferente.
$consulta = ’’;
if ($identificador < 0 and $texto.$precio != ’’) { // Identificador negativo y algo introducido // = creación = INSERT.
http://www.eni-training.com/client_net/mediabook.aspx?idR=85158 1/2
base de datos que utiliza; PDO no reescribe consultas SQL y no emula las características que faltan (a excepción de las consultas con parámetros).
Muchas bases de datos disponen de un controlador PDO como MySQL, Oracle, Microsoft SQL Server y SQLite. Tenga en cuenta que en la versión 5.4, los controladores de PDO para Oracle y SQL Server están todavía en fase experimental.
PDO es una extensión orientada a objetos compuesta de tres clases:
PDO
: conexión entre PHP y la base de datos,PDOStatement
: consulta preparada, y, después de la ejecución, resultado asociado,PDOException
: excepción planteada por PDO.En este capítulo, presentaremos esta extensión utilizando un sencillo ejemplo comentado: <?php
// Definición de los parámetros de conexión.
// La sintaxis de la fuente (Data Source Name o DSN) // es específica a cada controlador.
// Cambiar el valor de la variable $prueba para comprobar // diferentes bases de datos.
$prueba = 3; switch ($prueba) { caso 1: // MySQL $fuente = ’mysql:host=localhost;dbname=diane’; $usuario = ’root’; $contraseña = ’’; break; caso 2: // Oracle $fuente = ’oci:dbname=diane’; $usuario = ’demeter’; $contraseña = ’demeter’; break;
caso 3: // SQLite (versión 3.x)
$fuente = ’sqlite:/app/sqlite/diane.dbf’; $usuario = ’’;
$contraseña = ’’; break;
}
// Definición de dos consultas de prueba.
// Tener en cuenta que la consulta de inserción tiene parámetros (’es // de hecho la única característica que emula PDO,
// si no se admite de manera nativa por la base de // datos).
$sql_select = ’SELECT * FROM artículos ORDER BY identificador’; $sql_insert = ’INSERT INTO artículos(texto,precio) VALUES(:p1,:p2)’; // Todas las operaciones se efectúan en un bloque
// ’try’ para recuperar las excepciones planteadas por PDO. Try {
// Conexión a la base de datos.
http://www.eni-training.com/client_net/mediabook.aspx?idR=85158 2/2
$st->bindParam(’:p2’,$precio); // Asignar un valor a las variables. $nombre = ’Manzanas’;
$precio = 30.5;
// Ejecutar la consulta.
// Para las bases de datos que admiten las transacciones,
// se pueden utilizar los métodos beginTransaction(), commit() y rolback() // de los objetos PDO.
$st->execute();
// Preparar una consulta para la selección. $st = $db->prepare($sql_select);
// Ejecutar la consulta. $st->execute();
// Recuperar el resultado.
// Hay disponibles varios métodos para recuperar // el resultado: fetch(), fetchObject(), fetchAll(). // El método fetch() dispone de un parámetro que permite
// de especificar el tipo de resultado (matriz, objeto, etc.). while ($línea = $st->fetch()) {
echo "$línea[1] - $línea[2]<br />\n"; }
// Liberar los recursos. $st = null;
$db = null;
} catch (PDOException $e) { // Gesitionar las excepciones.
echo ’Error!: ’,$e->getMensaje(),’<br />’; die(); } ?> Resultado Albaricoques - 35.5 Cerezas - 48.9 Fresas - 29.95 Melocotones - 37.2 Manzanas - 30.5
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=85159 1/6
con el registro de datos en una base de datos realizando una codificación en los datos introducidos en un formulario.
Ejemplo (inserción en la base de un dato que contiene un apóstrofo) <?<?php
// Dato que supone un problema (puede introducirse sin querer // en un formulario).
$texto = "Pomme d’api"; $precio = 10;
// Consulta.
$consulta = "INSERT INTO artículos(texto,precio)" . "VALUES(’$texto’,$precio)";
echo "$consulta<br />"; // Ejecución con MySQL.
echo "<p><b>MySQL</b><br />"; $conexión = mysqli_connect();
$ok = mysqli_select_db($conexión, ’diane’); $resultado = mysqli_query($conexión, $consulta);
echo mysqli_error($conexión),’<br />’; // MySQL no genera ninguna alerta // Ejecución con Oracle.
echo "<p><b>Oracle</b><br />";
$conexión = oci_connect(’demeter’,’demeter’,’diane’); $resultado = oci_execute(oci_parse($conexión,$consulta)); // Ejecución con SQLite.
echo "<p><b>SQLite</b><br />";
$base = new SQLite3(’/app/sqlite/diane.dbf’); $resultado = $base->query($consulta);
?> > Resultado
INSERT INTO artículos(texto,precio) VALUES(’Pomme d’api’,10) MySQL
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ’api’,10)’ at line 1
Oracle
Warning: oci_parse(): ORA-01756: quoted
string not properly terminated in /app/scripts/index.php on line 19 Warning: oci_execute() expects parameter 1 to be resource,
boolean given in /app/scripts/index.php on line 19 SQLite
Warning: SQLite3::query(): Unable to prepare statement: 1, near "api": syntax error in /app/scripts/index.php on line 23
En SQL, el delimitador de cadena de caracteres es el apóstrofo: si una consulta envía la cadena ’Pomme
www.FreeLibros.me
http://www.eni-training.com/client_net/mediabook.aspx?idR=85159 2/6
<?<?php
// Dato corregido (válido para todas las bases de datos). $texto = "Pomme d’’api";
$precio = 10; // Consulta.
$consulta = "INSERT INTO artículos(texto,precio)" . "VALUES(’$texto’,$precio)";
echo "$consulta<br />"; // Ejecución con MySQL.
echo "<p><b>MySQL</b><br />"; $conexión = mysqli_connect();
$ok = mysqli_select_db($conexión, ’diane’); $resultado = mysqli_query($conexión, $consulta);
echo mysqli_error($conexión),’<br />’; // MySQL no genera ninguna alerta // Ejecución con Oracle.
echo "<p><b>Oracle</b><br />";
$conexión = oci_connect(’demeter’,’demeter’,’diane’); $resultado = oci_execute(oci_parse($conexión,$consulta)); // Ejecución con SQLite.
echo "<p><b>SQLite</b><br />";
$base = new SQLite3(’/app/sqlite/diane.dbf’); $resultado = $base->query($consulta);
?> > Resultado
INSERT INTO artículos(texto,precio) VALUES(’Pomme d’’api’,10) MySQL
Oracle SQLite
En cuanto a MySQL, la codificación con el carácter barra invertida (\) también funciona (pero no con otras bases de datos).
$texto = "Pomme d\’api";
En las versiones anteriores de PHP, la característica "magic quotes" de codificación automática respondía a este problema: si estaba activada (directiva de configuración
magic_quotes_gpc =
on
), todos los datos procedentes de un formulario (métodosGET
oPOST
), de una URL (métodoGET
) o de una cookie se codificaban automáticamente con el carácter de barra invertida (\), o apóstrofo (’) si la directiva de configuraciónmagic_quotes_sybase
estaba enon
.En la versión 5.4, la función "magic quotes" se ha eliminado definitivamente ya que planteaba otros problemas por otra parte.
En consecuencia, deberemos efectuar el cifrado necesario en el momento del registro en la base de datos. Esto lo veremos en la siguiente sección.
http://www.eni-training.com/client_net/mediabook.aspx?idR=85159 3/6
conexión
Identificador de conexión devuelto por la funciónmysqli_connect
.valor
Cadena de caracteres a escapar.En consecuencia, un dato leído de una base de datos no toma ningún cifrado ”magic quotes” automático, lo cual es bueno para poder manipular este dato y especialmente su presentación. Si el dato leído está destinado a ser registrado de nuevo en la base de datos, será necesario ”escapar” correctamente los apóstrofos (ver el punto siguiente).
Ejemplo <?php
// Consulta.
$consulta = ’SELECT texto FROM artículos " . "WHERE texto LIKE ’%api%’"; // Ejecución con MySQL.
$conexión = mysqli_connect(); $ok = mysqli_select_db($conexión,’diane’); $resultado = mysqli_query($conexión,$consulta); $artículo = mysqli_fetch_array($resultado); echo "$artículo[0]<br />"; ?> Resultado Pomme d’api