Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/BasesDatos»
De WikiEducator
< Usuario:ManuelRomero | PHP
(Página creada con «{{TEP}} <!--__NOEDITSECTION__--> __NOTOC__ {|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid; border-width:2px; border-color:#00...») |
|||
(9 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
{{TEP}} | {{TEP}} | ||
− | |||
− | |||
− | |||
<!--__NOEDITSECTION__--> | <!--__NOEDITSECTION__--> | ||
__NOTOC__ | __NOTOC__ | ||
Línea 13: | Línea 10: | ||
[[Imagen:DWES_TituloTema3.gif|center]] | [[Imagen:DWES_TituloTema3.gif|center]] | ||
|} | |} | ||
− | + | {{#widget:Slides}} | |
+ | <div class="slides layout-regular template-default"> | ||
<div class="slide"> | <div class="slide"> | ||
− | =BASES DE DATOS | + | ===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). | *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 | http://php.net/manual/es/mysqli.overview.php | ||
*Para trabajar con bases de datos debemos | *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). | **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 | + | **Seleccionar (La base de datos con la que vamos a trabajar). |
− | + | </div> | |
+ | |||
+ | <div class="slide"> | ||
+ | ;Trabajar con Bases de datos | ||
**Actuar con la base de datos (Consultas, inserciones, modificaciones y/o borrados) | **Actuar con la base de datos (Consultas, inserciones, modificaciones y/o borrados) | ||
**Procesar información | **Procesar información | ||
**Cerrar la base de datos | **Cerrar la base de datos | ||
− | *Para realizar estas acciones disponemos de diversas | + | *Para realizar estas acciones disponemos de diversas '''''Funciones/Clases''''' específicas dentro de PHP, Nos referiremos a ellos como '''''extensiones''''' de PHP |
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Bases de datos y 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 | *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. | *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. | *También vamos a disponer de la extensión PDO, la cual se independiza del gestor concreto de bases datos que vayamos a utilizar. | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Extensiones de php | ||
*Por lo tanto en este tema vamos a ver dos extensiones: | *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 | #'''''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. | #'''''PDO''''' usar una extensión genéricoa que permite conectarse con cualquier gestor de BD, sin necesidad de cambiar nada de código. | ||
− | === | + | </div> |
+ | |||
+ | <div class="slide"> | ||
+ | ===Introducción al Uso de extensiones orientadas a objetos=== | ||
*Para trabajar con las extensiones, las usaremos siempre orientadas a objetos, aunque tengan | *Para trabajar con las extensiones, las usaremos siempre orientadas a objetos, aunque tengan | ||
la correspondiente funcionalidad en el lenguaje estructurado. | la correspondiente funcionalidad en el lenguaje estructurado. | ||
Línea 39: | Línea 50: | ||
http://www.desarrolloweb.com/articulos/1540.php | http://www.desarrolloweb.com/articulos/1540.php | ||
*Posteriormente veremos un tema de php orientado a objetos | *Posteriormente veremos un tema de php orientado a objetos | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Uso básico de POO | ||
*Recordamos que para crear una nueva instancia de una clase usamos el operador new | *Recordamos que para crear una nueva instancia de una clase usamos el operador new | ||
<source lang=php> | <source lang=php> | ||
Línea 59: | Línea 74: | ||
*El fichero de configuración | *El fichero de configuración | ||
/etc/mysql/my.cnf | /etc/mysql/my.cnf | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Mysql | ||
*En él podemos ver el puerto (3306 por defecto), el usuario y otros parámetros del servicio | *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 | *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 | *Debmos saber conectarnos por línea de comandos | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
{{Actividad| | {{Actividad| | ||
#Conectar a mysql <!--mysql -u root -proot--> | #Conectar a mysql <!--mysql -u root -proot--> | ||
Línea 72: | Línea 94: | ||
#sal de sql <!-- quit--> | #sal de sql <!-- quit--> | ||
}} | }} | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Bases de datos | ||
[[archivo:baseDatos.pdf]] | [[archivo:baseDatos.pdf]] | ||
{{Actividad| | {{Actividad| | ||
Usa mysql para cargar por líneas de comandos el siguiente fichero arriba especificado | Usa mysql para cargar por líneas de comandos el siguiente fichero arriba especificado | ||
}} | }} | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Recordando mysql | ||
*En la siguiente página puedes hacer un repaso de mysql | *En la siguiente página puedes hacer un repaso de mysql | ||
http://dev.mysql.com/doc/refman/5.7/en/index.html | http://dev.mysql.com/doc/refman/5.7/en/index.html | ||
Línea 82: | Línea 111: | ||
*Debemos conocer también la herramienta phpmyadmin | *Debemos conocer también la herramienta phpmyadmin | ||
sudo apt-get install phpmyadmin | sudo apt-get install phpmyadmin | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Recordando mysql | ||
*Aquí tienes una pequeña guía es de uso sencillo e intuitivo | *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 | 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 | *Y más información en la página oficial | ||
http://www.phpmyadmin.net/home_page/index.php | http://www.phpmyadmin.net/home_page/index.php | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Recordando mysql | ||
{{Actividad| | {{Actividad| | ||
Probamos a conectarno por phpmyadmin a nuestro servidor local | Probamos a conectarno por phpmyadmin a nuestro servidor local | ||
}} | }} | ||
[[Archivo:datos.sql]] | [[Archivo:datos.sql]] | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | |||
{{Actividad| | {{Actividad| | ||
Usando phpmyadmin, carga los datos para poblar la base de datos}} | Usando phpmyadmin, carga los datos para poblar la base de datos}} | ||
Línea 99: | Línea 139: | ||
sudo apt-get install mysql-workbench | sudo apt-get install mysql-workbench | ||
</source> | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
{{Actividad| | {{Actividad| | ||
Instalamos y probamos las diferentes opciones con esta herramienta | Instalamos y probamos las diferentes opciones con esta herramienta | ||
Línea 104: | Línea 146: | ||
*Probamos las opciones '''''forward engineer''''' y '''''reverser engineer''''' | *Probamos las opciones '''''forward engineer''''' y '''''reverser engineer''''' | ||
}} | }} | ||
+ | </div> | ||
+ | <div class="slide"> | ||
===Herramientas de administración=== | ===Herramientas de administración=== | ||
*Con '''''phpmyadmin''''', podemos hacer casi todo de administrar y manejar las bases de datos | *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 . | *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. | *En muchas ocasiones este tipo de operaciones resultan muy interesantes. | ||
Línea 112: | Línea 155: | ||
#myhsqladmin | #myhsqladmin | ||
#mysqlshow | #mysqlshow | ||
− | + | </div> | |
+ | <div class="slide"> | ||
+ | |||
+ | ;mysql | ||
*Esta heramienta ya la hemos comentado, permite conectarse a un servidor MySQL para ejecutar sentencias SQL | *Esta heramienta ya la hemos comentado, permite conectarse a un servidor MySQL para ejecutar sentencias SQL | ||
*Opciomes básicas ya conocidas | *Opciomes básicas ya conocidas | ||
Línea 120: | Línea 166: | ||
# help Para conocer los comandos que se pueden usar. | # help Para conocer los comandos que se pueden usar. | ||
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/sql-syntax.html | http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/sql-syntax.html | ||
− | + | </div> | |
− | + | ||
− | + | ||
+ | <div class="slide"> | ||
+ | ;mysqladmin | ||
+ | *Es un cliente específico para la administración | ||
+ | *Entre otras acciones podemos realizar: | ||
#crear y eliminar bases de datos. | #crear y eliminar bases de datos. | ||
#mostrar la configuración y el estado del servidor. | #mostrar la configuración y el estado del servidor. | ||
Línea 130: | Línea 178: | ||
#ver la version del servidor | #ver la version del servidor | ||
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/mysqladmin.html | http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/es/mysqladmin.html | ||
+ | </div> | ||
+ | <div class="slide"> | ||
{{Actividad| | {{Actividad| | ||
Prueba a hacer cada una de las acciones especificadas anteriormente | Prueba a hacer cada una de las acciones especificadas anteriormente | ||
Línea 139: | Línea 189: | ||
--> | --> | ||
}} | }} | ||
− | + | </div> | |
+ | |||
+ | <div class="slide"> | ||
+ | ;mysqlshow | ||
http://ftp.nchu.edu.tw/MySQL//doc/refman/5.0/es/mysqlshow.html | http://ftp.nchu.edu.tw/MySQL//doc/refman/5.0/es/mysqlshow.html | ||
*muestra informaicón sobre la base de datos | *muestra informaicón sobre la base de datos | ||
mysqlshow -u root -proot | mysqlshow -u root -proot | ||
*Nos mostraría las tablas de ese ususario | *Nos mostraría las tablas de ese ususario | ||
+ | </div> | ||
+ | <div class="slide"> | ||
===Mysql y su extensión mysqli para php=== | ===Mysql y su extensión mysqli para php=== | ||
: CONECTARNOS A LA BASE DE DATOS | : CONECTARNOS A LA BASE DE DATOS | ||
Línea 153: | Línea 208: | ||
$miConexion = new mysqli(....); | $miConexion = new mysqli(....); | ||
</source> | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Extensión Mysqli | ||
*El constructor de la clase puede recibir hasta 5 parámetros, de los cuales 4 se suelen usar con bastante frecuencia | *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 | #$host nombre o ip del equipo (null o localhost, identificaría el equipo actual).i | ||
Línea 161: | Línea 219: | ||
#'''''$puerto''''' | #'''''$puerto''''' | ||
#'''''$shocket''''' | #'''''$shocket''''' | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Ejemplo new mysqli(...) | ||
<source lang=php> | <source lang=php> | ||
$host="localhost" | $host="localhost" | ||
Línea 173: | Línea 235: | ||
echo "Conectado a la base de datos"; | echo "Conectado a la base de datos"; | ||
</source> | </source> | ||
− | + | </div> | |
+ | <div class="slide"> | ||
+ | ;mysqli(...) | ||
*Esta función retorna el recurso de la conexión | *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''''' | *Para gestionar los errores deberíamos usar el atributo '''''connect_error''''' de la clase '''''mysqli''''' | ||
Línea 182: | Línea 246: | ||
echo "Error conectando con la base de datos: ".$miConexion->connect_error; | echo "Error conectando con la base de datos: ".$miConexion->connect_error; | ||
</source> | </source> | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
*Para ver información sobre la conexión se puede usar los atributos *server_info o host_info | *Para ver información sobre la conexión se puede usar los atributos *server_info o host_info | ||
{{Resumen| | {{Resumen| | ||
Línea 192: | Línea 259: | ||
</source> | </source> | ||
}} | }} | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Opciones por defecto | ||
+ | <hr/> | ||
*Hay muchas opciones de mysqli que se pueden configurar en el fichero php.ini | *Hay muchas opciones de mysqli que se pueden configurar en el fichero php.ini | ||
*Aquí tenemos alguna de ellas | *Aquí tenemos alguna de ellas | ||
Línea 198: | Línea 269: | ||
;mysqli.default_port | ;mysqli.default_port | ||
:Número de puerto TCP predeterminado a utilizar cuando se conecta al Servidor de base de datos. | :Número de puerto TCP predeterminado a utilizar cuando se conecta al Servidor de base de datos. | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
+ | ;Opciones por defecto | ||
+ | <hr/> | ||
;mysqli.reconnect | ;mysqli.reconnect | ||
:Indica si se debe volver a conectar automáticamente en caso de que se pierda la conexión. | :Indica si se debe volver a conectar automáticamente en caso de que se pierda la conexión. | ||
Línea 206: | Línea 282: | ||
:mysqli.default_pw | :mysqli.default_pw | ||
;Contraseña predeterminada a usar cuando se conecta al servidor de base de datos. | ;Contraseña predeterminada a usar cuando se conecta al servidor de base de datos. | ||
+ | </div> | ||
+ | <div class="slide"> | ||
*La lista completa la podemos ver en el siguiente link | *La lista completa la podemos ver en el siguiente link | ||
http://php.net/manual/es/mysqli.configuration.php | http://php.net/manual/es/mysqli.configuration.php | ||
{{Actividad| | {{Actividad| | ||
− | * | + | *Configura dicho fichero, para poder conectar a la base de datos sin aportar parámetros al constructor |
*Luego déjalo como estaba :)}} | *Luego déjalo como estaba :)}} | ||
− | |||
− | |||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
Línea 226: | Línea 302: | ||
$miConexion->close(); | $miConexion->close(); | ||
</source> | </source> | ||
+ | </div> | ||
+ | |||
+ | <div class="slide"> | ||
===DML=== | ===DML=== | ||
*En SQL sabemos que tenmos tres tipos de lenguajes DDL, DML, DCL | *En SQL sabemos que tenmos tres tipos de lenguajes DDL, DML, DCL | ||
Línea 232: | Línea 311: | ||
#las que no devuelven registros de datos (INSERT, DELETE, UPDATE) | #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 | ##Generalmente retornan un entero que es el número de filas aceptadas o un booleano que indica si se realizó no la operación | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;DML | ||
#Las que pueden retornan una colección de filas (SELECT), generalmente conocidas como cursor. | #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''''' | *En mysqli podemos enviar cualquiera de estas claúsulas con el método '''''query''''' | ||
− | ===INSERT, UPDATE Y DELETE=== | + | </div> |
+ | <div class="slide"> | ||
+ | |||
+ | ===INSERT, UPDATE Y DELETE: Método query=== | ||
*Este tipo de sentencias retornan un booleano que indica si se ha realizado o no la acción | *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''''' | *El número de filas afectadas lo podemos ver en el atributo '''''affected_rows''''' | ||
Línea 245: | Línea 330: | ||
</source> | </source> | ||
}} | }} | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
<source lang=php> | <source lang=php> | ||
$sentenciaDelete="DELETE FROM tabla WHERE condicion"; | $sentenciaDelete="DELETE FROM tabla WHERE condicion"; | ||
Línea 262: | Línea 350: | ||
echo "Se han actualizado $miConexion->affected_rows filas "; | echo "Se han actualizado $miConexion->affected_rows filas "; | ||
} | } | ||
+ | </sourece> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | <source lang=php> | ||
$miConexion->query($sentenciasInsert); | $miConexion->query($sentenciasInsert); | ||
$resultado = $miConexion->query($sentenciaINSERT); | $resultado = $miConexion->query($sentenciaINSERT); | ||
Línea 270: | Línea 362: | ||
</source> | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
*Observemos su uso en el ejemplo | *Observemos su uso en el ejemplo | ||
Línea 284: | Línea 378: | ||
if ($error == null) { | if ($error == null) { | ||
$resultado = $miConexion->query('DELETE FROM stock WHERE unidades=0'); | $resultado = $miConexion->query('DELETE FROM stock WHERE unidades=0'); | ||
− | + | if ($resultado) { | |
− | + | ||
print "<p>Se han borrado $miConexion->affected_rows registros.</p>"; | print "<p>Se han borrado $miConexion->affected_rows registros.</p>"; | ||
} | } | ||
Línea 292: | Línea 385: | ||
} | } | ||
</source> | </source> | ||
+ | |||
</div> | </div> | ||
Línea 300: | Línea 394: | ||
#query | #query | ||
#real_query | #real_query | ||
− | *En el primero caso el método nos retorna un cursor que será de la | + | *En el primero caso el método nos retorna un cursor que será de la clase 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. | *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. | ||
+ | </div> | ||
+ | <div class="slide"> | ||
===Método query=== | ===Método query=== | ||
*Una vez que tenemos los datos almacenados debemos saber acceder. | *Una vez que tenemos los datos almacenados debemos saber acceder. | ||
Línea 308: | Línea 404: | ||
:Va obteniendo cada registro como un array | :Va obteniendo cada registro como un array | ||
:Este array podemos usar tanto de forma indexada, como asociativa (con el nombre del campo) | :Este array podemos usar tanto de forma indexada, como asociativa (con el nombre del campo) | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
;fetch_assoc() | ;fetch_assoc() | ||
:En este caso el array que retorna es asociativo | :En este caso el array que retorna es asociativo | ||
Línea 315: | Línea 414: | ||
:En este caso en lugar de retornar un array, retorna un objeto, donde cada campo son los diferentes atributos de ese objeto | :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 | *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 | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
{{Actividad| | {{Actividad| | ||
− | + | Opté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(); | + | *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 | + | </div> |
+ | <div class="slide"> | ||
+ | *La clase '''''mysqli_result''''', además de los métodos vistos tiene un par de atributos interesantes | ||
;int $field_count; | ;int $field_count; | ||
:Nos dice cuantas columnos tiene el query actual | :Nos dice cuantas columnos tiene el query actual | ||
Línea 325: | Línea 429: | ||
*Tenemos una lista completa | *Tenemos una lista completa | ||
http://es.php.net/manual/es/class.mysqli-result.php | http://es.php.net/manual/es/class.mysqli-result.php | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
{{Resumen| | {{Resumen| | ||
<source lang=php> | <source lang=php> | ||
Línea 343: | Línea 451: | ||
</source> | </source> | ||
}} | }} | ||
− | + | </div> | |
− | + | <div class="slide"> | |
{{Actividad| | {{Actividad| | ||
− | Haciendo una consulta del tipo select * from producto | + | Haciendo una consulta del tipo select * from producto where pvp < 200, realiza un código que visualizce en una tabla los resultados }} |
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
===Transacciones=== | ===Transacciones=== | ||
<br/> | <br/> | ||
Línea 352: | Línea 463: | ||
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}} | 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 | *Supongamos que hacemos una transferencia bancaria; cuando menos implica descontar dinera de una cuenta e ingresaro en otra | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Transacciones | ||
*Ahora supongamos que nada mas descontar el dinero de una cuenta se cae la luz y se apaga el servidor | *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 | *Esto creará una inconsistencia en la base de datos | ||
Línea 357: | Línea 471: | ||
<source lang=php> | <source lang=php> | ||
$conexion = new mysqli(..); | $conexion = new mysqli(..); | ||
− | $conexion-> | + | $conexion->autocommit(false); |
..... | ..... | ||
</source> | </source> | ||
− | *Si se ha desactivado el | + | </div> |
+ | <div class="slide"> | ||
+ | |||
+ | *Si se ha desactivado el autocommit, para terminar una transacción debemos usar los métodos '''''commit''''' o '''''rollback''''' | ||
<source lang=php> | <source lang=php> | ||
$conexion = new mysqli(..); | $conexion = new mysqli(..); | ||
− | $conexion-> | + | $conexion->autocommit(false); |
..... | ..... | ||
Línea 376: | Línea 493: | ||
} | } | ||
</source> | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
{{Actividad| | {{Actividad| | ||
Ejercicio de transacciones | Ejercicio de transacciones | ||
}} | }} | ||
+ | </div> | ||
+ | <div class="slide"> | ||
===Injecciones SQL=== | ===Injecciones SQL=== | ||
Línea 384: | Línea 506: | ||
*Existe mucha documentación al respecto, en general podemos afirmar que un buen conocimiento de SQL proporcina herramientas tanto para poder establecer este tipo de ataques, como para podernos prevenir de ellos. | *Existe mucha documentación al respecto, en general podemos afirmar que un buen conocimiento de SQL proporcina herramientas tanto para poder establecer este tipo de ataques, como para podernos prevenir de ellos. | ||
*Aportamos referenicas de web que nos pueden interesar consultar | *Aportamos referenicas de web que nos pueden interesar consultar | ||
+ | </div> | ||
+ | <div class="slide"> | ||
{{Recursos de la Web| | {{Recursos de la Web| | ||
#http://php.net/manual/es/security.database.sql-injection.php | #http://php.net/manual/es/security.database.sql-injection.php | ||
#http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL | #http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL | ||
#http://www.w3schools.com/sql/sql_injection.asp | #http://www.w3schools.com/sql/sql_injection.asp | ||
− | + | }} | |
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Otras entradas un poco cuestionables por finalidad ??? | ||
+ | {{Recursos de la web| | ||
#http://foro.elhacker.net/tutoriales_documentacion/tutorial_de_inyeccion_sql_sql_injection-t98448.0.html | #http://foro.elhacker.net/tutoriales_documentacion/tutorial_de_inyeccion_sql_sql_injection-t98448.0.html | ||
+ | |||
#http://www.mclibre.org/consultar/php/lecciones/php_db_inyeccion_sql.html#L2641 | #http://www.mclibre.org/consultar/php/lecciones/php_db_inyeccion_sql.html#L2641 | ||
#http://blog.netrunners.es/tabla-de-trucos-para-inyeccion-de-sql/ | #http://blog.netrunners.es/tabla-de-trucos-para-inyeccion-de-sql/ | ||
}} | }} | ||
+ | |||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
*A continuación y usando el ejemplo anterior de '''''acceso''''' vamos a probar a realizar un sencillo ataques sql. | *A continuación y usando el ejemplo anterior de '''''acceso''''' vamos a probar a realizar un sencillo ataques sql. | ||
#Entrar en la plataforma sin tener acceso | #Entrar en la plataforma sin tener acceso | ||
Línea 401: | Línea 534: | ||
*Como no sabemos el usuario ni contraseña probamos a ver si se puede hacer una inserción no controlada | *Como no sabemos el usuario ni contraseña probamos a ver si se puede hacer una inserción no controlada | ||
*Como programadores esperamos que en el código haya algo del estilo, como es nuestro caso | *Como programadores esperamos que en el código haya algo del estilo, como es nuestro caso | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
<source lang=php> | <source lang=php> | ||
$nombre=$_POST['usuario']; | $nombre=$_POST['usuario']; | ||
Línea 407: | Línea 543: | ||
$consulta="select * from usuarios where nombre = \"$nombre\" and pass = \"$pass\" "; | $consulta="select * from usuarios where nombre = \"$nombre\" and pass = \"$pass\" "; | ||
$resultado = $conexion->query($consulta); | $resultado = $conexion->query($consulta); | ||
− | </ | + | </source> |
*Si todo fuera normal y nombre fuera por ejemplo "maría" la consulta que se envía al servidor sería | *Si todo fuera normal y nombre fuera por ejemplo "maría" la consulta que se envía al servidor sería | ||
<source lang=php> | <source lang=php> | ||
Línea 413: | Línea 549: | ||
</source> | </source> | ||
*Esta consulta si existe el usuario maría nos retornará una tupla, si no no devolverá ninguna. | *Esta consulta si existe el usuario maría nos retornará una tupla, si no no devolverá ninguna. | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Inyecciones sql | ||
*Pero si añadimos más cosas obtendremos segura una respuesta, por ejemplo si en el codigo $nombre="maria or \"1\"= \"1\" " | *Pero si añadimos más cosas obtendremos segura una respuesta, por ejemplo si en el codigo $nombre="maria or \"1\"= \"1\" " | ||
*Entonces la consulta quedaría | *Entonces la consulta quedaría | ||
+ | |||
+ | |||
<source lang=php> | <source lang=php> | ||
select * from usuarios where nombre = "maria" or "1"="1" | select * from usuarios where nombre = "maria" or "1"="1" | ||
</source> | </source> | ||
*Que nos devolverá todas las filas | *Que nos devolverá todas las filas | ||
+ | </div> | ||
+ | <div class="slide"> | ||
*Así que si introducimos estos datos | *Así que si introducimos estos datos | ||
[[Archivo:miAccesoInjeccion.png]] | [[Archivo:miAccesoInjeccion.png]] | ||
Línea 424: | Línea 567: | ||
[[Archivo:accesoInjectado.png]] | [[Archivo:accesoInjectado.png]] | ||
+ | </div> | ||
+ | <div class="slide"> | ||
===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. | *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 | *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 ''''' | *Para trabajar con consultas preparadas, debemos usar la clase '''''mysqli_stmt''''', e inicializarla con el método '''''stmt_init ''''' | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
<source lang=php> | <source lang=php> | ||
$conexion = new mysqli('localhost', 'dwes', 'abc123.', 'dwes'); | $conexion = new mysqli('localhost', 'dwes', 'abc123.', 'dwes'); | ||
Línea 433: | Línea 581: | ||
$consulta = $conexion->stmt_init(); | $consulta = $conexion->stmt_init(); | ||
</source> | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
Los pasos para trabajar con consultas preparadas son: | Los pasos para trabajar con consultas preparadas son: | ||
#Preparar la consulta en el servidor MySQL utilizando el método '''''prepare'''''. | #Preparar la consulta en el servidor MySQL utilizando el método '''''prepare'''''. | ||
Línea 444: | Línea 595: | ||
$conexion->close(); | $conexion->close(); | ||
</source> | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
===Parametrizar las consultas preparadas=== | ===Parametrizar las consultas preparadas=== | ||
Línea 453: | Línea 606: | ||
*Consiste en indicar en la consulta preparada en lugar de los valores, signos de interrogación '''''?''''' | *Consiste en indicar en la consulta preparada en lugar de los valores, signos de interrogación '''''?''''' | ||
*En el caso anterior | *En el caso anterior | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
<source lang=php> | <source lang=php> | ||
$consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?,?); | $consulta->prepare('INSERT INTO familia (cod, nombre) VALUES (?,?); | ||
− | </ | + | </source> |
*Ahora habría que asigar los valores. Para ello usamos el método '''''bind_param'''' | *Ahora habría que asigar los valores. Para ello usamos el método '''''bind_param'''' | ||
− | + | bind_param(tipoDatos, variables_con_los_valores) | |
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
*Este método recibe dos tipos de parámetros | *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. | #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 : | **La codificación sería : | ||
− | #s: cadena de caracteres | + | #'''''s''''': cadena de caracteres |
− | #i: número entero | + | #'''''i''''': número entero |
− | #d: número float | + | #'''''d''''': número float |
− | #b: valor binario (BLOB) | + | #'''''b''''': valor binario (BLOB) |
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Consultas preparadas | ||
*En nuestro caso como va a recibir en los dos parámetros cada uno una cadena de caracteres sería '''''"ss"''''' | *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 | #El segundo grupo sería cada uno de los valores.SIEMPRE hay que especificar variables | ||
*En el ejemplo que estamos siguiendo | *En el ejemplo que estamos siguiendo | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
<source lang=php> | <source lang=php> | ||
$consulta = $conexion->stmt_init(); | $consulta = $conexion->stmt_init(); | ||
Línea 475: | Línea 641: | ||
$consulta->bind_param('ss', $cod_producto, $nombre_producto); | $consulta->bind_param('ss', $cod_producto, $nombre_producto); | ||
</source> | </source> | ||
− | * | + | </div> |
+ | <div class="slide"> | ||
+ | |||
+ | *Insisto en que siempre hay que especificar '''''variables''''', nunca directamente valores. | ||
+ | *Vemos el siguiente ejemplo: | ||
<source lang=php> | <source lang=php> | ||
$consulta->bind_param('ss', 'TABLET', 'Tablet PC'); // Genera un error | $consulta->bind_param('ss', 'TABLET', 'Tablet PC'); // Genera un error | ||
Línea 490: | Línea 660: | ||
</source> | </source> | ||
}} | }} | ||
+ | </div> | ||
+ | <div class="slide"> | ||
===Consultas preparadas que retornan valores=== | ===Consultas preparadas que retornan valores=== | ||
*En caso de que la consulta preparada retorne valores se recogen con el método '''''bind_result'''' | *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 | *Este método recibirá variables en los que se almacenarán los valores | ||
− | *Para recorre el conjunto de valores, usamos el método fectch() | + | *Para recorre el conjunto de valores, usamos el método fectch() |
+ | *Vemos el siguiente ejemplo | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ;Consultas preparadas que generan valores | ||
<source lang=php> | <source lang=php> | ||
$consulta = $conexion->stmt_init(); | $consulta = $conexion->stmt_init(); | ||
Línea 506: | Línea 682: | ||
$conexion->close(); | $conexion->close(); | ||
</source> | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
*Aquí hay un enlace para una información completa sobre consultas preparadas | *Aquí hay un enlace para una información completa sobre consultas preparadas | ||
http://php.net/manual/es/class.mysqli-stmt.php | http://php.net/manual/es/class.mysqli-stmt.php | ||
Línea 511: | Línea 690: | ||
*Modifica el ejercicio anterior usando consultas parametrizadas | *Modifica el ejercicio anterior usando consultas parametrizadas | ||
}} | }} | ||
− | + | </div> | |
− | {{Actividad| | + | <div class="slide"> |
+ | {{Actividad|Title=Práctica de tienda | ||
*Vamos a trabajar con la base de datos de la tienda | *Vamos a trabajar con la base de datos de la tienda | ||
*Lo primero usando la herramienta workbench generamos el modelo de tablas de la base de datos dwes y la analizamos | *Lo primero usando la herramienta workbench generamos el modelo de tablas de la base de datos dwes y la analizamos | ||
− | |||
*Crea una página web en la que se muestre el stock existente de un determinado producto en cada una de las tiendas. | *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. | *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 css y plantilla adjuntos. | + | }} |
+ | </div> | ||
+ | <div class="slide"> | ||
+ | |||
+ | {{Actividad|Title=Práctica de tienda | ||
+ | *Puedes usar como base los siguientes ficheros css y plantilla adjuntos. | ||
*Añade la opción de modificar el número de unidades del producto en cada una de las tiendas. | *Añade la opción de modificar el número de unidades del producto en cada una de las tiendas. | ||
*Utiliza una consulta preparada para la actualización de registros en la tabla stock. | *Utiliza una consulta preparada para la actualización de registros en la tabla stock. | ||
*No es necesario tener en cuenta las tareas de inserción (no existían unidades anteriormente) y borrado (si el número final de unidades es cero). | *No es necesario tener en cuenta las tareas de inserción (no existían unidades anteriormente) y borrado (si el número final de unidades es cero). | ||
}} | }} | ||
+ | </div> | ||
+ | <div class="slide"> | ||
<!-- | <!-- | ||
+ | |||
===Definición de funiones= | ===Definición de funiones= | ||
function ‘’’nombre_de_funcion’’’ (’’’’lista_de_parametros’’’’){ | function ‘’’nombre_de_funcion’’’ (’’’’lista_de_parametros’’’’){ | ||
Línea 592: | Línea 779: | ||
*En el caso de PDO, se diferencias las consultas que retornan datos (SELECT) y las que actúan sobre el contendio de los datos (INSERT, UPDATE, DELETE) | *En el caso de PDO, se diferencias las consultas que retornan datos (SELECT) y las que actúan sobre el contendio de los datos (INSERT, UPDATE, DELETE) | ||
;INSERT, OPDATE, DELETE | ;INSERT, OPDATE, DELETE | ||
− | *En este caso la sentencia se ejecuta envíandola con el | + | *En este caso la sentencia se ejecuta envíandola con el método '''''exec($sentencia)''''' |
*Este método retorna un entero que indica en número de registros afectados | *Este método retorna un entero que indica en número de registros afectados | ||
<source lang=sql> | <source lang=sql> | ||
Línea 615: | Línea 802: | ||
<source lang=php> | <source lang=php> | ||
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | $conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | ||
− | $resultado = $ | + | $resultado = $conexion->query("SELECT producto, unidades FROM stock"); |
while ($registro = $resultado->fetch()) { | while ($registro = $resultado->fetch()) { | ||
echo "Producto ".$registro['producto'].": ".$registro['unidades']."<br />"; | echo "Producto ".$registro['producto'].": ".$registro['unidades']."<br />"; | ||
Línea 622: | Línea 809: | ||
<source lang=php> | <source lang=php> | ||
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | $conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | ||
− | $resultado = $ | + | $resultado = $conexion->query("SELECT producto, unidades FROM stock"); |
− | while ($registro = $resultado->fetch(FETCH_ASSOC)) { | + | while ($registro = $resultado->fetch(PDO::FETCH_ASSOC)) { |
echo "Producto ".$registro['producto'].": ".$registro['unidades']."<br />"; | echo "Producto ".$registro['producto'].": ".$registro['unidades']."<br />"; | ||
} | } | ||
Línea 629: | Línea 816: | ||
<source lang=php> | <source lang=php> | ||
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | $conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | ||
− | $resultado = $ | + | $resultado = $conexion->query("SELECT producto, unidades FROM stock"); |
− | while ($registro = $resultado->fetch(FETCH_NUM)) { | + | while ($registro = $resultado->fetch(PDO::FETCH_NUM)) { |
echo "Producto ".$registro[0].": ".$registro[1]."<br />"; | echo "Producto ".$registro[0].": ".$registro[1]."<br />"; | ||
} | } | ||
Línea 637: | Línea 824: | ||
<source lang=php> | <source lang=php> | ||
$conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | $conexion = new PDO("mysql:host=localhost;dbname=dwes", "dwes", "abc123."); | ||
− | $resultado = $ | + | $resultado = $conexion->query("SELECT producto, unidades FROM stock"); |
− | while ($registro = $resultado->fetch( | + | while ($registro = $resultado->fetch(PDO::FETCH_OBJ)) { |
− | echo "Producto ".$registro | + | echo "Producto ".$registro->producto.": ".$registro->unidades."<br />"; |
} | } | ||
</source> | </source> | ||
Línea 647: | Línea 834: | ||
$user="root"; | $user="root"; | ||
$pass="root"; | $pass="root"; | ||
− | $opciones= | + | $opciones=array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); |
$conexion=new PDO($conexion,$usuario,$pass, $opciones); | $conexion=new PDO($conexion,$usuario,$pass, $opciones); | ||
Línea 663: | Línea 850: | ||
</source> | </source> | ||
}} | }} | ||
+ | |||
===Consultas preparadas=== | ===Consultas preparadas=== | ||
*Al igual que en mysqli, podemos preparar las consultas. Esta forma de trabajar es cómoda y mas segura que la habitual, según viemos en apartados anteriores | *Al igual que en mysqli, podemos preparar las consultas. Esta forma de trabajar es cómoda y mas segura que la habitual, según viemos en apartados anteriores | ||
Línea 707: | Línea 895: | ||
</source> | </source> | ||
{{Actividad| | {{Actividad| | ||
− | *Realiza un pequeño | + | *Realiza un pequeño programa en php que usando la extensión '''''PDO''''', realice las siguientes acciones |
#Se conecte a la base de datos '''''dwes''''' | #Se conecte a la base de datos '''''dwes''''' | ||
#insertamos un nuevo eleemntos o tupla en la tabla producto | #insertamos un nuevo eleemntos o tupla en la tabla producto | ||
Línea 780: | Línea 968: | ||
//Instrucciones que pueden lanzar una excepción y | //Instrucciones que pueden lanzar una excepción y | ||
− | //puedo capturar en tiempo de | + | //puedo capturar en tiempo de ejecución |
}cathc(Exception $e){ | }cathc(Exception $e){ | ||
Línea 857: | Línea 1045: | ||
− | + | --> | |
+ | ;Resetear la password de root | ||
+ | https://www.howtoforge.com/reset-forgotten-mysql-root-password | ||
|} | |} |
Última revisión de 21:29 15 nov 2016
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
|