Diferencia entre revisiones de «Usuario:ManuelRomero/DAW/distancia/BD»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «=EXTENSIONES DE PHP PARA TRABAJAR CON BASES DE DATOS= ==MYSQLI== *Trabajaremos orientado a Objetos, con la clase '''''mysqli''''' ===Clases con las que vamos a trabajar===...»)
 
(Consultas preparadas de tipo SELECT)
 
(18 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
=EXTENSIONES DE PHP PARA TRABAJAR CON BASES DE DATOS=
 
=EXTENSIONES DE PHP PARA TRABAJAR CON BASES DE DATOS=
==MYSQLI==
+
==Clases con las que vamos a trabajar==
 +
;Extension MYSQLI
 +
  ;mysqli
 +
  ;mysql_result
 +
  ;mysql_stmt
 +
;Extension PDO
 +
  ;PDO
 +
  ;PDOStatemnet
 +
==Extensión MYSQLI==
 
*Trabajaremos orientado a Objetos, con la clase '''''mysqli'''''
 
*Trabajaremos orientado a Objetos, con la clase '''''mysqli'''''
===Clases con las que vamos a trabajar===
+
===Clase mysqli===
;mysqli
+
;mysql_result
+
;mysql_stmt
+
 
====Obtener una instancia====
 
====Obtener una instancia====
 
*Objeto que me permitirá interactuar con la base de datos
 
*Objeto que me permitirá interactuar con la base de datos
Línea 21: Línea 26:
 
$host, $usuario, $pass, $bd
 
$host, $usuario, $pass, $bd
 
</source>
 
</source>
;Verificar conexión
+
====Verificar conexión====
 
*Con los atributos '''''connect_error''''' y '''''connect_errno''''' de la clase '''''mysqli'''''  
 
*Con los atributos '''''connect_error''''' y '''''connect_errno''''' de la clase '''''mysqli'''''  
 
**Si su valor es '''''null''''' todo ok, si no contienen la información del error producido
 
**Si su valor es '''''null''''' todo ok, si no contienen la información del error producido
Línea 28: Línea 33:
 
$conexion->connect_error ? Echo 'error $conexion->connect_error' : echo 'Conectado';
 
$conexion->connect_error ? Echo 'error $conexion->connect_error' : echo 'Conectado';
 
</source>
 
</source>
=====Operaciones con la base de datos=====
+
====Operaciones con la base de datos====
*De tipo INSERT DELETE UPDATE
+
=====De tipo INSERT DELETE UPDATE=====
 
<source lang=php>
 
<source lang=php>
 
bool  $conexion->query($sentencia)
 
bool  $conexion->query($sentencia)
Línea 42: Línea 47:
 
$conexion->query($sentencia) ? Echo ·Se han insertado $conexion->affect_rows' : echo 'Error insertando';
 
$conexion->query($sentencia) ? Echo ·Se han insertado $conexion->affect_rows' : echo 'Error insertando';
 
</source>
 
</source>
;De tipo SELECT
+
=====De tipo SELECT=====
 
<source lang=php>
 
<source lang=php>
 
mysqli_result $conexion->query ($consulta);
 
mysqli_result $conexion->query ($consulta);
 
</source>
 
</source>
 
*En este caso el método retorna un objeto de la case '''''mysqli_result''''' '''null''' en caso de no haberse podido realizar.
 
*En este caso el método retorna un objeto de la case '''''mysqli_result''''' '''null''' en caso de no haberse podido realizar.
====Clase mysqli_result====
+
===Clase mysqli_result===
 
*Un objeto de esta clase contiene el resultado de una consulta junto con un puntero para pdoer recorrelo, lo que conocíamos como cursor.
 
*Un objeto de esta clase contiene el resultado de una consulta junto con un puntero para pdoer recorrelo, lo que conocíamos como cursor.
Instanciarlo: resultado del método query de la clase mysqli con una consulta.
+
====Instanciar mysqli_result====
Recorrelo
+
*resultado del método query de la clase mysqli con una consulta.
Métodos fetch_assoc() fetch_row() fetch_object()  de la clase mysqli_result
+
<source lang=php>
Hacen lo mismo, la diferencia es la forma de devolver el elemento de su colección de datos
+
$resultado = $conexion->query ($consulta);
fetch_array  lo retorna como un array asociativo o indexado
+
</source>
fetch_row  lo retorna como un array indexado
+
 
fetch_assoc() lo retorna como un array asociativo
+
====Recorrelo====
fetch_object() lo retorna como un objeto
+
*Tenemos diferentes formas de hacer lo mismo
Liberarlo
+
*Métodos '''''fetch_assoc()''''', '''''fetch_row()''''', '''''fetch_object()''''' de la clase '''''mysqli_result'''''
Método free() de la clase mysqli_result. Para mi, importante liberar las cosas que ya no se usen, es como recoger la habitación, mientras quepan cosas podemos seguir almacenanado ropa en la cama, pero cuando ya no quepa más .
+
*Hacen lo mismo, obteniendo el resultado de diferente manera
La clase mysqli_stmt: Consultas preparadas
+
*Recuperar la fila del resultado de la consulta que actualmente está apuntada  y avanzan el puntero a la siguiente fila si la hay.
Es otra manera de ejecutar las sentencias
+
*Cada método retorna esa fila de una manera
Consiste en crear una instancia de la clase mysqli_stmt
+
fetch_array() lo retorna como un array asociativo o indexado
 +
fetch_row() lo retorna como un array indexado
 +
fetch_assoc() lo retorna como un array asociativo
 +
fetch_object() lo retorna como un objeto
 +
====Liberarlo====
 +
*Método '''''free()''''' de la clase '''''mysqli_result'''''.
 +
  Para mi, muy importante liberar las cosas que ya no se usen, es como recoger la habitación,  
 +
mientras quepan cosas podemos seguir almacenanado ropa en la cama, pero cuando ya no quepa más ...  
 +
 
 +
<source lang=php>
 +
$conexion = new mysqli(...)
 +
$consulta = "select ...";
 +
$resultado =  $conexion->query ($consulta);
 +
while ($fila = $resultado->fetch_array()){
 +
  echo ·valor del campo primero $fila[1]";
 +
}
 +
$resultado->free();
 +
$conexion ->close();
 +
</source>
 +
 
 +
 
 +
===La clase mysqli_stmt===
 +
*Esta clase permiete gestionar las '''Consultas preparadas'''
 +
*Es otra manera de ejecutar las sentencias
 +
*Consiste en crear una instancia de la clase '''''mysqli_stmt'''''
 +
====Crear una instancia====
 +
<source lang=php>
 
$conexion= new mysqli(...);
 
$conexion= new mysqli(...);
 
$consultaPreparada = $conexion->stmt_init()
 
$consultaPreparada = $conexion->stmt_init()
Consultas preparadas de tipo INSERT UPDATE Y DELETE
+
</source>
*Vamos a ver con parámetros, sin parámetros es igual pero sin usar ? Y sin asignarbind_param()
+
=====Consultas preparadas de tipo INSERT UPDATE Y DELETE=====
 +
*Vamos a ver con parámetros, sin parámetros es igual pero sin usar ? Y sin asignar bind_param()
 +
<source lang=php>
 
$conexion = new mysqli(...); //Crea la conexion
 
$conexion = new mysqli(...); //Crea la conexion
 
$sentencia = 'insert.... where campo = ? and otroCampo=?';  //cadena con la sentencia
 
$sentencia = 'insert.... where campo = ? and otroCampo=?';  //cadena con la sentencia
 
mysql_stmt $consultaPreparada = $conexion->stmt_init(); //Crea el objeto mysql_stmt
 
mysql_stmt $consultaPreparada = $conexion->stmt_init(); //Crea el objeto mysql_stmt
 
bool $consultaPreparada->prepare($sentencia); //Prepara la consulta bool indica si lo ha hecho
 
bool $consultaPreparada->prepare($sentencia); //Prepara la consulta bool indica si lo ha hecho
bool $consultaPreparada->bind_param('ss',$valor_cmpo,$valor_otroCampo); //Asigna los valores a los parámetros de la cadena especificados con ?. Bool indica si lo hace o no
+
bool $consultaPreparada->bind_param('ss',$valor_cmpo,$valor_otroCampo); //Asigna los valores a los parámetros
 +
                                                    // de la cadena especificados con ?. Bool indica si lo hace o no
 
bool $consultaPreparada->execute(); Ejectua la sentencia. Bool indica si lo hace o no
 
bool $consultaPreparada->execute(); Ejectua la sentencia. Bool indica si lo hace o no
 
int $consultaPreparada->affected_rows; //Atributo con las filas afectadas.
 
int $consultaPreparada->affected_rows; //Atributo con las filas afectadas.
Liberar la consulta
+
</source>
 +
 
 +
=====Liberar la consulta=====
 +
<source lang=php>
 
$consultaPreparada->close(); //Libera el recurso
 
$consultaPreparada->close(); //Libera el recurso
Consultas preparadas de tipo SELECT
+
</source>
Se usan los mismos métodos.
+
=====Consultas preparadas de tipo SELECT=====
Se añaden para recuperar los valores.
+
*Se usan los mismos métodos.
 +
*Se añaden para recuperar los valores.
 +
<source lang=php>
 
$conexion = new mysqli(...); //Crea la conexion
 
$conexion = new mysqli(...); //Crea la conexion
 
$sentencia = 'select.... where campo = ? and otroCampo=?';  //cadena con la sentencia
 
$sentencia = 'select.... where campo = ? and otroCampo=?';  //cadena con la sentencia
 
mysql_stmt $consultaPreparada = $conexion->stmt_init(); //Crea el objeto mysql_stmt
 
mysql_stmt $consultaPreparada = $conexion->stmt_init(); //Crea el objeto mysql_stmt
 
bool $consultaPreparada->prepare($sentencia); //Prepara la consulta bool indica si lo ha hecho
 
bool $consultaPreparada->prepare($sentencia); //Prepara la consulta bool indica si lo ha hecho
bool $consultaPreparada->bind_param('ss',$valor_cmpo,$valor_otroCampo); //Asigna los valores a los parámetros de la cadena especificados con ?. Bool indica si lo hace o no
+
bool $consultaPreparada->bind_param('ss',$valor_cmpo,$valor_otroCampo); //Asigna los valores a los parámetros  
bool $consultaPreparada->bind_result('$campo1, ..,'$campon');//Preparamos las variables donde se van a asignar los valores de los diferentes campos para cada fila obtenida de hacer un fetch(). bool indica si se ha ejecutado correctamente el método.
+
                                                            //de la cadena especificados con ?. Bool indica si lo hace o no
Bool $consultaPreparada->store_result();//Almacena el resultado en memoria. Importante si quiero consultar por ejemplo $consultaPrepare->nun_rows para ver  filas afectadas
+
bool $consultaPreparada->bind_result('$campo1', ..,'$campon');//Preparamos las variables donde se van a asignar  
int $consultaPreparada->num_rows; Atributo con las filas que ha retornado la consulta
+
                                                            //los valores de los diferentes campos para cada  
bool $consultaPreparada->execute(); Ejectua la sentencia. Bool indica si lo hace o no
+
                                                            //fila obtenida de hacer un fetch().  
bool  $consultaPreparada->fetch() //Extrae una fila del último resultado select y asigna a cada variable especificado en bind_result cada valor de la fila . Bool true o folase (ok o error) y null si no hay más filas que extraer
+
                                                          //bool indica si se ha ejecutado correctamente el método.
bool $consultaPreparada->execute(); Ejectua la sentencia. Bool indica si lo hace o no
+
bool $consultaPreparada->store_result();//Almacena el resultado en memoria.
 +
                                      // Importante si quiero consultar por ejemplo  
 +
                                      //$consultaPrepare->nun_rows para ver  filas afectadas
 +
int $consultaPreparada->num_rows;// Atributo con las filas que ha retornado la consulta
 +
bool $consultaPreparada->execute();// Ejectua la sentencia. Bool indica si lo hace o no
 +
bool  $consultaPreparada->fetch() //Extrae una fila del último resultado select  
 +
                                  // y asigna a cada variable especificado en bind_result cada valor de la fila.
 +
                                  // Bool true o folase (ok o error) y null si no hay más filas que extraer
 +
bool $consultaPreparada->execute();// Ejectua la sentencia. Bool indica si lo hace o no
 +
</source>
 +
1 EXTENSIONES DE PHP PARA TRABAJAR CON BASES DE DATOS
 +
1.1 Clases con las que vamos a trabajar
 +
 
 +
==Extensión PDO==
 +
*Es una extensión nativa de php para operar con diferentes bases de datos
 +
*No habría que cambiar nada de código solo el conector
 +
*Con ello el mismo código se puede adaptar a diferentes gestores de bases de datos
 +
=== La clase PDO===
 +
 
 +
====Obtener una instancia====
 +
*Para crear una instancia
 +
<source lang=php>
 +
$conexion = new PDO (...opciones...);
 +
</source>
 +
*En este caso las opciones solemos usar 4 parámetros para poder tener ya acceso a la base de datos
 +
*Solo el primero es obligatorio, donde se especifica el tipo de gestor de bases de datos con el que se trabaja
 +
<source lang=php>
 +
$dns="mysql:host=localhost;dbname=nombreBD"
 +
$usuario ="usuario";
 +
$pass="pass"
 +
$opciones =array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); //Es un array, dependera del SGBD utilizado
 +
$conexion = new PDO ($dns,$usuario,$pass,$opciones);
 +
</source>
 +
==== Verificar conexión====
 +
*Verificamos si el valor de la conexión es difente a null
 +
*Tambien podemos usar excepciones
 +
<source lang=php>
 +
echo $conexion == null ?  "error en conexión " :  "Conectado";
 +
</source>
 +
 
 +
==== Operaciones con la base de datos====
 +
===== De tipo INSERT DELETE UPDATE=====
 +
*Método '''''exec()''''' que retorna el número de filas afectadas. No indica si hubo un error en la ejecución.
 +
*Para ello se puede usar el
 +
control de excepciones, o ver el método '''''errorCode()''''' o '''''errorInfo()''''' de la clase '''''PDO'''''
 +
int exec ($sentencia)
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$setencia = "insert into ...");
 +
$filas = $conexion->exec($sentencia);
 +
....
 +
</source>
 +
===== De tipo SELECT=====
 +
*En este caso usaremos el método '''''query(...)''''' de la clase PDO
 +
*Este médoto retorna un objeto de la case '''''PDOStatemne'''''
 +
PDOStatement query ($sentencia);
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$consulta = "select into ...");
 +
$resultado = $conexion->query($sentencia);
 +
</source>
 +
 
 +
=== Clase PDOStatement===
 +
*Esta es una clase para poder gestionar el resultado de una consutla
 +
*Esta consulta puede retornar una colección de filas y la funcionalidad de recorrerlos.
 +
==== Instanciar PDOStatement====
 +
*Un objeto de esta clase se instancia con el método  '''''query()''''' de la clase '''''PDO'''''
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$consulta = "select into ...");
 +
$resultado = $conexion->query($sentencia); //Resultado es de tipo PDOStatemen
 +
</source>
 +
 
 +
==== Recorrelo====
 +
*Para recorrelo usaremos el método '''''fetch(...)'''''
 +
*Este método  recibe un parámetro que indicará de forma extraerá la fila, como un array indexado, asociativo como objeto, ...
 +
*Si no pasamos parámetro el resultado se puede ver como un array asociativo o indexado
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$consulta = "select into ...");
 +
$resultado = $conexion->query($sentencia); //Resultado es de tipo PDOStatemen
 +
while ($fila = $resultado->fetch()){
 +
      print_r($fila);
 +
}
 +
$resultado->closeCursor
 +
$conexion=null;
 +
unset($conexion);
 +
</source>
 +
*Si queremos cambiar el modo de obtener cada fila
 +
#PDO::FETCH_ASSOC. Devuelve solo un array asociativo.
 +
#PDO::FETCH_NUM. Devuelve solo un array con claves numéricas.
 +
#PDO::FETCH_BOTH. Devuelve un array con claves numéricas y asociativas. Es el comportamiento por defecto.
 +
#PDO::FETCH_OBJ Lo devuelve ocmo objeto
 +
==== Liberarlo====
 +
*Para liberar un objeto de la clase PDOStatemenr usamos el método '''''closeCursor()'''''
 +
*Hacemos un recorrido obteniendo cada fila  como un array asociativo
 +
 
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$consulta = "select into ...");
 +
$resultado = $conexion->query($sentencia); //Resultado es de tipo PDOStatemen
 +
while ($fila = $resultado->fetch(PDO::ASSOC)){ //Observa el modo de acceder a un atributo de la clase
 +
      print_r($fila);
 +
}
 +
$resultado->closeCursor
 +
$conexion=null;
 +
unset($conexion);
 +
</source>
 +
 
 +
=== Consultas preparadas===
 +
*Para hacer una consulta preparada creamos un objeto de la clase '''''PDOStatement''''' con el método '''''prepare()''''' de la clase '''''PDO'''''
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$sentencia ('insert ....');
 +
$conPreparadaPDO = $conexion->prepare($sentencia);
 +
...
 +
</source>
 +
 
 +
===== Consultas preparadas de tipo INSERT UPDATE Y DELETE=====
 +
*Vamos a ver con parámetros
 +
*En este caso tenemos tres formas de asignar paráemtros
 +
;1.- forma ? ==> bindParam(1,$valor)
 +
*En este caso especificamos la sentencia especificando ?  donde debiera de haber un valor
 +
*Posteriormente con el método bindParam(posicion, $valor), especifricamos el número de parámetro (1, 2, 3, ..) y el valor
 +
*Se ejectua una vez el método por cada valor.
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$sentencia ('insert ....where campo1=? and  campo2 = ?');
 +
$conPreparadaPDO = $conexion->prepare($sentencia);
 +
$conPreparadaPDO->bindParam(1,$valorCampo1);
 +
$conPreparadaPDO->bindParam(2,$valorCampo2);
 +
 
 +
$conPreaparadaPDO->execute();
 +
...
 +
</source>
 +
;2.- forma :variable ==> bindParam(:variable, $valor);
 +
*En este caso en lugar de ? usamos :nombreVariable. Este mismo nombre es el que usaremos en el método '''''bindParam(...)
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$sentencia ('insert ....where campo1=:campo1 and  campo2 =:campo2');
 +
$conPreparadaPDO = $conexion->prepare($sentencia);
 +
$conPreparadaPDO->bindParam(:campo1,$valorCampo1);
 +
$conPreparadaPDO->bindParam(:campo2,$valorCampo2);
 +
 
 +
$conPreaparadaPDO->execute();
 +
...
 +
</source>
 +
;3.- En la ejecución de la consulta
 +
*En cualquiera de los casos anteriores, en lugar de usar '''''bindParam()''''', paremos un array a '''''execute()''''' con los valores.
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$sentencia ('insert ....where campo1=? and  campo2 = ?');
 +
$conPreparadaPDO = $conexion->prepare($sentencia);
 +
 
 +
$parametros = array("TABLET","Tablet PC");
 +
 
 +
$conPreaparadaPDO->execute($parametros);
 +
...
 +
</source>
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$sentencia ('insert ....where campo1=:campo1 and  campo2 =:campo2');
 +
$conPreparadaPDO = $conexion->prepare($sentencia);
 +
$parametros = array(":campo1"=>"TABLET",":campo2"=>"Tablet PC");
 +
 
 +
$conPreaparadaPDO->execute($parametros);
 +
 
 +
...
 +
</source>
 +
 
 +
===== Consultas preparadas de1 tipo SELECT =====
 +
*Una vez realizado el método execute(), si la consulta retorna un conjunto de filas, procedemos igual que anteriormente
 +
<source lang=php>
 +
$conexion = new PDO (...);
 +
$sentencia ('select ....where campo1=:campo1 and  campo2 =:campo2');
 +
$conPreparadaPDO = $conexion->prepare($sentencia);
 +
$parametros = array(":campo1"=>"TABLET",":campo2"=>"Tablet PC");
 +
 
 +
$conPreaparadaPDO->execute($parametros);
 +
while ($file = $conPreparadaPDO->fetch()){
 +
      print_r($fila);
 +
}
 +
//....
 +
</source>
 +
==Fichero resumen==
 +
*Aquí dejamos un fichero resumen de los métodos en una tabla
 +
[[Archivo:PHP_BD.pdf]]

Última revisión de 21:31 24 nov 2014

EXTENSIONES DE PHP PARA TRABAJAR CON BASES DE DATOS

Clases con las que vamos a trabajar

Extension MYSQLI
 ;mysqli
 ;mysql_result
 ;mysql_stmt
Extension PDO
 ;PDO
 ;PDOStatemnet

Extensión MYSQLI

  • Trabajaremos orientado a Objetos, con la clase mysqli

Clase mysqli

Obtener una instancia

  • Objeto que me permitirá interactuar con la base de datos
$conexion = new mysqli(parametros);
$conexion  Será una instancia de la clase mysqli
  • Alias del constructor
$conexion= mysqli_connect(parametros)
  • En ambos casos parámetros, no son obligatorios, pero en algún momento necesarios si quiero operar con una base de datos necesito saberlo;
  • Si no lo aportamos ahora, después con los métodos correspondientes
$host, $usuario, $pass, $bd

Verificar conexión

  • Con los atributos connect_error y connect_errno de la clase mysqli
    • Si su valor es null todo ok, si no contienen la información del error producido
$conexion = new mysqli(...);
$conexion->connect_error ? Echo 'error $conexion->connect_error' : echo 'Conectado';

Operaciones con la base de datos

De tipo INSERT DELETE UPDATE
bool  $conexion->query($sentencia)
  • El método retorna bool que indica si se ha realizado de forma correcta o no la sentencia.
  • no indica el número de filas afectadas (puede dar true y no haber afectado a ninguna fila por ejemplo un delete o un update).
  • Verificar número de tuplas afectadas por la setencia
    • Atributo affect_rows de la clase mysqli
$conexion = new mysqli(...);
$sentencia = “INSERT INTO …...$conexion->query($sentencia) ? Echo ·Se han insertado $conexion->affect_rows' : echo 'Error insertando';
De tipo SELECT
mysqli_result $conexion->query ($consulta);
  • En este caso el método retorna un objeto de la case mysqli_result null en caso de no haberse podido realizar.

Clase mysqli_result

  • Un objeto de esta clase contiene el resultado de una consulta junto con un puntero para pdoer recorrelo, lo que conocíamos como cursor.

Instanciar mysqli_result

  • resultado del método query de la clase mysqli con una consulta.
$resultado = $conexion->query ($consulta);

Recorrelo

  • Tenemos diferentes formas de hacer lo mismo
  • Métodos fetch_assoc(), fetch_row(), fetch_object() de la clase mysqli_result
  • Hacen lo mismo, obteniendo el resultado de diferente manera
  • Recuperar la fila del resultado de la consulta que actualmente está apuntada y avanzan el puntero a la siguiente fila si la hay.
  • Cada método retorna esa fila de una manera
fetch_array()  lo retorna como un array asociativo o indexado
fetch_row()  lo retorna como un array indexado
fetch_assoc() lo retorna como un array asociativo
fetch_object() lo retorna como un objeto

Liberarlo

  • Método free() de la clase mysqli_result.
 Para mi, muy importante liberar las cosas que ya no se usen, es como recoger la habitación,   
mientras quepan cosas podemos seguir almacenanado ropa en la cama, pero cuando ya no quepa más ... 
$conexion = new mysqli(...)
$consulta = "select ...";
$resultado =  $conexion->query ($consulta);
while ($fila = $resultado->fetch_array()){
   echo ·valor del campo primero $fila[1]";
}
$resultado->free();
$conexion ->close();


La clase mysqli_stmt

  • Esta clase permiete gestionar las Consultas preparadas
  • Es otra manera de ejecutar las sentencias
  • Consiste en crear una instancia de la clase mysqli_stmt

Crear una instancia

$conexion= new mysqli(...);
$consultaPreparada = $conexion->stmt_init()
Consultas preparadas de tipo INSERT UPDATE Y DELETE
  • Vamos a ver con parámetros, sin parámetros es igual pero sin usar ? Y sin asignar bind_param()
$conexion = new mysqli(...); //Crea la conexion
$sentencia = 'insert.... where campo = ? and otroCampo=?';  //cadena con la sentencia
mysql_stmt $consultaPreparada = $conexion->stmt_init(); //Crea el objeto mysql_stmt
bool $consultaPreparada->prepare($sentencia); //Prepara la consulta bool indica si lo ha hecho
bool $consultaPreparada->bind_param('ss',$valor_cmpo,$valor_otroCampo); //Asigna los valores a los parámetros
                                                     // de la cadena especificados con ?. Bool indica si lo hace o no
bool $consultaPreparada->execute(); Ejectua la sentencia. Bool indica si lo hace o no
int $consultaPreparada->affected_rows; //Atributo con las filas afectadas.
Liberar la consulta
$consultaPreparada->close(); //Libera el recurso
Consultas preparadas de tipo SELECT
  • Se usan los mismos métodos.
  • Se añaden para recuperar los valores.
$conexion = new mysqli(...); //Crea la conexion
$sentencia = 'select.... where campo = ? and otroCampo=?';  //cadena con la sentencia
mysql_stmt $consultaPreparada = $conexion->stmt_init(); //Crea el objeto mysql_stmt
bool $consultaPreparada->prepare($sentencia); //Prepara la consulta bool indica si lo ha hecho
bool $consultaPreparada->bind_param('ss',$valor_cmpo,$valor_otroCampo); //Asigna los valores a los parámetros 
                                                             //de la cadena especificados con ?. Bool indica si lo hace o no
bool $consultaPreparada->bind_result('$campo1', ..,'$campon');//Preparamos las variables donde se van a asignar 
                                                            //los valores de los diferentes campos para cada 
                                                            //fila obtenida de hacer un fetch(). 
                                                           //bool indica si se ha ejecutado correctamente el método.
bool $consultaPreparada->store_result();//Almacena el resultado en memoria.
                                       // Importante si quiero consultar por ejemplo 
                                       //$consultaPrepare->nun_rows para ver  filas afectadas
int $consultaPreparada->num_rows;// Atributo con las filas que ha retornado la consulta
bool $consultaPreparada->execute();// Ejectua la sentencia. Bool indica si lo hace o no
bool  $consultaPreparada->fetch() //Extrae una fila del último resultado select 
                                  // y asigna a cada variable especificado en bind_result cada valor de la fila.
                                  // Bool true o folase (ok o error) y null si no hay más filas que extraer
bool $consultaPreparada->execute();// Ejectua la sentencia. Bool indica si lo hace o no

1 EXTENSIONES DE PHP PARA TRABAJAR CON BASES DE DATOS 1.1 Clases con las que vamos a trabajar

Extensión PDO

  • Es una extensión nativa de php para operar con diferentes bases de datos
  • No habría que cambiar nada de código solo el conector
  • Con ello el mismo código se puede adaptar a diferentes gestores de bases de datos

La clase PDO

Obtener una instancia

  • Para crear una instancia
$conexion = new PDO (...opciones...);
  • En este caso las opciones solemos usar 4 parámetros para poder tener ya acceso a la base de datos
  • Solo el primero es obligatorio, donde se especifica el tipo de gestor de bases de datos con el que se trabaja
$dns="mysql:host=localhost;dbname=nombreBD"
$usuario ="usuario";
$pass="pass"
$opciones =array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); //Es un array, dependera del SGBD utilizado
$conexion = new PDO ($dns,$usuario,$pass,$opciones);

Verificar conexión

  • Verificamos si el valor de la conexión es difente a null
  • Tambien podemos usar excepciones
echo $conexion == null ?  "error en conexión " :  "Conectado";

Operaciones con la base de datos

De tipo INSERT DELETE UPDATE
  • Método exec() que retorna el número de filas afectadas. No indica si hubo un error en la ejecución.
  • Para ello se puede usar el

control de excepciones, o ver el método errorCode() o errorInfo() de la clase PDO

int exec ($sentencia)
$conexion = new PDO (...);
$setencia = "insert into ...");
$filas = $conexion->exec($sentencia);
....
De tipo SELECT
  • En este caso usaremos el método query(...) de la clase PDO
  • Este médoto retorna un objeto de la case PDOStatemne
PDOStatement query ($sentencia);
$conexion = new PDO (...);
$consulta = "select into ...");
$resultado = $conexion->query($sentencia);

Clase PDOStatement

  • Esta es una clase para poder gestionar el resultado de una consutla
  • Esta consulta puede retornar una colección de filas y la funcionalidad de recorrerlos.

Instanciar PDOStatement

  • Un objeto de esta clase se instancia con el método query() de la clase PDO
$conexion = new PDO (...);
$consulta = "select into ...");
$resultado = $conexion->query($sentencia); //Resultado es de tipo PDOStatemen

Recorrelo

  • Para recorrelo usaremos el método fetch(...)
  • Este método recibe un parámetro que indicará de forma extraerá la fila, como un array indexado, asociativo como objeto, ...
  • Si no pasamos parámetro el resultado se puede ver como un array asociativo o indexado
$conexion = new PDO (...);
$consulta = "select into ...");
$resultado = $conexion->query($sentencia); //Resultado es de tipo PDOStatemen
while ($fila = $resultado->fetch()){
      print_r($fila);
}
$resultado->closeCursor
$conexion=null;
unset($conexion);
  • Si queremos cambiar el modo de obtener cada fila
  1. PDO::FETCH_ASSOC. Devuelve solo un array asociativo.
  2. PDO::FETCH_NUM. Devuelve solo un array con claves numéricas.
  3. PDO::FETCH_BOTH. Devuelve un array con claves numéricas y asociativas. Es el comportamiento por defecto.
  4. PDO::FETCH_OBJ Lo devuelve ocmo objeto

Liberarlo

  • Para liberar un objeto de la clase PDOStatemenr usamos el método closeCursor()
  • Hacemos un recorrido obteniendo cada fila como un array asociativo
$conexion = new PDO (...);
$consulta = "select into ...");
$resultado = $conexion->query($sentencia); //Resultado es de tipo PDOStatemen
while ($fila = $resultado->fetch(PDO::ASSOC)){ //Observa el modo de acceder a un atributo de la clase
      print_r($fila);
}
$resultado->closeCursor
$conexion=null;
unset($conexion);

Consultas preparadas

  • Para hacer una consulta preparada creamos un objeto de la clase PDOStatement con el método prepare() de la clase PDO
$conexion = new PDO (...);
$sentencia ('insert ....');
$conPreparadaPDO = $conexion->prepare($sentencia);
...
Consultas preparadas de tipo INSERT UPDATE Y DELETE
  • Vamos a ver con parámetros
  • En este caso tenemos tres formas de asignar paráemtros
1.- forma ? ==> bindParam(1,$valor)
  • En este caso especificamos la sentencia especificando ? donde debiera de haber un valor
  • Posteriormente con el método bindParam(posicion, $valor), especifricamos el número de parámetro (1, 2, 3, ..) y el valor
  • Se ejectua una vez el método por cada valor.
$conexion = new PDO (...);
$sentencia ('insert ....where campo1=? and  campo2 = ?');
$conPreparadaPDO = $conexion->prepare($sentencia);
$conPreparadaPDO->bindParam(1,$valorCampo1);
$conPreparadaPDO->bindParam(2,$valorCampo2);
 
$conPreaparadaPDO->execute();
...
2.- forma 
variable ==> bindParam(:variable, $valor);
  • En este caso en lugar de ? usamos :nombreVariable. Este mismo nombre es el que usaremos en el método bindParam(...)
$conexion = new PDO (...);
$sentencia ('insert ....where campo1=:campo1 and  campo2 =:campo2');
$conPreparadaPDO = $conexion->prepare($sentencia);
$conPreparadaPDO->bindParam(:campo1,$valorCampo1);
$conPreparadaPDO->bindParam(:campo2,$valorCampo2);
 
$conPreaparadaPDO->execute();
...
3.- En la ejecución de la consulta
  • En cualquiera de los casos anteriores, en lugar de usar bindParam(), paremos un array a execute() con los valores.
$conexion = new PDO (...);
$sentencia ('insert ....where campo1=? and  campo2 = ?');
$conPreparadaPDO = $conexion->prepare($sentencia);
 
$parametros = array("TABLET","Tablet PC");
 
$conPreaparadaPDO->execute($parametros);
...
$conexion = new PDO (...);
$sentencia ('insert ....where campo1=:campo1 and  campo2 =:campo2');
$conPreparadaPDO = $conexion->prepare($sentencia);
$parametros = array(":campo1"=>"TABLET",":campo2"=>"Tablet PC");
 
$conPreaparadaPDO->execute($parametros);
 
...
Consultas preparadas de1 tipo SELECT
  • Una vez realizado el método execute(), si la consulta retorna un conjunto de filas, procedemos igual que anteriormente
$conexion = new PDO (...);
$sentencia ('select ....where campo1=:campo1 and  campo2 =:campo2');
$conPreparadaPDO = $conexion->prepare($sentencia);
$parametros = array(":campo1"=>"TABLET",":campo2"=>"Tablet PC");
 
$conPreaparadaPDO->execute($parametros);
while ($file = $conPreparadaPDO->fetch()){
       print_r($fila);
}
//....

Fichero resumen

  • Aquí dejamos un fichero resumen de los métodos en una tabla

Archivo:PHP BD.pdf