Diferencia entre revisiones de «Plantilla:PHP/Mysqli»
De WikiEducator
(→Clausula SELECT con query) |
|||
(38 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
<div id=parrafo> | <div id=parrafo> | ||
− | === | + | <div class="slide"> |
− | + | ===Mysqli=== | |
+ | 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. | ||
*Para recordar muy brevemente posemos usar el siguiente enlace | *Para recordar muy brevemente posemos usar el siguiente enlace | ||
Línea 8: | Línea 9: | ||
<div class="slide"> | <div class="slide"> | ||
− | ;Uso básico de | + | ;Uso básico de un recurso de tipo '''''mysqli''''' |
*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 19: | Línea 20: | ||
</div> | </div> | ||
+ | {{MRM_Puntos clave|Title=Acciones básicas que hemos de aprender| | ||
+ | ;Para trabajar con una base de datos, siempre hemos de seguir una serie de acciones | ||
− | + | ;1.- Concetarnos a la base de datos | |
− | + | Esto será crear una instancia de un objeto de conexión | |
− | + | ;2.- Verificar que la conexión se ha realizado | |
− | + | Si, por el motivo que fuera, no nos hemos podido conectar,generalmente: | |
− | + | 1.- Informaremos de ello | |
− | + | 2.- Cerraremos la conexión | |
− | + | ;3.- Realizaremos las operativas que necesitemos | |
− | + | Ejecutaremos sentencias SQL y recogeremos el resultado de la consulta | |
− | + | Generalmente informaremos de algo al usuario de la aplicación | |
− | + | ;4.- Cerraremos la conexión | |
− | + | Un aspecto que puede pasar desapercibido, pero muy importante | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | ; | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
}} | }} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<div class="slide"> | <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 | ||
*A continuación iremos viendo como implementar las acciones básicas en el lenguaje | *A continuación iremos viendo como implementar las acciones básicas en el lenguaje | ||
Línea 312: | Línea 50: | ||
<div class="slide"> | <div class="slide"> | ||
;Extensión Mysqli | ;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 |
#'''''$usario''''' es el usuario de la base de datos | #'''''$usario''''' es el usuario de la base de datos | ||
#'''''$pass''''' | #'''''$pass''''' | ||
Línea 331: | Línea 69: | ||
$miConexion = new mysqli ($host,$usuario,$pass,$nombreBD); | $miConexion = new mysqli ($host,$usuario,$pass,$nombreBD); | ||
if ($miConexion==null) | if ($miConexion==null) | ||
− | echo" | + | echo"No se ha podido crear el objeto. |
+ | Seguramente no tiene instalada la extensión mysqli. | ||
+ | Prueba a instalar apt install php-mysql "; | ||
else | else | ||
− | echo " | + | echo "Objeto creado"; |
</source> | </source> | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
+ | {{Nota|Pruena a ver el contenido del objeto con '''''var_dump''''', así podrás observar los atributos que tenemos disponibles. Son todos muy intuitivos y los iremos viendo a lo largo de este tema.}} | ||
+ | <source lang=php> | ||
+ | var_dump($miConexion); | ||
+ | </source> | ||
+ | |||
;mysqli(...) | ;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 | + | {{Tip|Aunque hablemos de mysqli como una clase, en realidad es una clase especial conocida como recurso. |
+ | '''Un recurso a diferencia de una clase no se puede serializar para pasar entre scripts.''' | ||
+ | }} | ||
+ | *Para gestionar los errores de la conexión, debemos de usar los atributos: | ||
+ | # '''''connect_errno''''': Número o códiog del error que se ha producido en la conexión. 0 implica que no hay error. | ||
+ | # '''''connect_error''''':Descripción del error en forma de string. "" (cadena vacía) es la descripción cuando no ha habido error en la conexión. | ||
+ | de la clase '''''mysqli'''''. | ||
+ | *El echo de que se pueda instanciar o el objeto de la clase, no implica que se haya realizado la conexión. | ||
*Este atributo aporta información sobre el error o contiene null si no se ha producido ninguno. | *Este atributo aporta información sobre el error o contiene null si no se ha producido ninguno. | ||
*En el código anterior | *En el código anterior | ||
<source lang=php> | <source lang=php> | ||
− | + | if ($miConexion->connect_error) { | |
− | + | echo "ERROR; | |
+ | echo "Error: Fallo al conectarse a MySQL debido a: \n"; | ||
+ | echo "Errno: " . $mysqli->connect_errno . "\n"; | ||
+ | echo "Error: " . $mysqli->connect_error . "\n"; | ||
+ | } | ||
</source> | </source> | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
− | *Para ver información sobre la conexión se puede usar los atributos | + | *Para ver información sobre la conexión se puede usar los atributos '''''$server_info''''' o '''''$host_info''''' |
− | {{ | + | {{MRM_Resumen| |
<source lang=php> | <source lang=php> | ||
$conesion= new mysqli($host,$user,$pass,$bd); | $conesion= new mysqli($host,$user,$pass,$bd); | ||
− | + | $conesion->conect_error | |
− | + | $conesion->conect_errno | |
− | + | $conesion->server_info | |
− | + | $conesion->host_info | |
</source> | </source> | ||
}} | }} | ||
Línea 363: | Línea 119: | ||
;Opciones por defecto | ;Opciones por defecto | ||
<hr/> | <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''''', no es algo que normalmente se modifique, pero por curiosidad las comentamos aquí. |
*Aquí tenemos alguna de ellas | *Aquí tenemos alguna de ellas | ||
;mysqli.allow_persistent | ;mysqli.allow_persistent | ||
Línea 372: | Línea 128: | ||
<div class="slide"> | <div class="slide"> | ||
− | + | ||
<hr/> | <hr/> | ||
;mysqli.reconnect | ;mysqli.reconnect | ||
Línea 387: | Línea 143: | ||
*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 | ||
− | {{ | + | {{MRM_Actividad| |
*Configura dicho fichero, para poder conectar a la base de datos sin aportar parámetros al constructor | *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"> | ||
+ | ====Cerrar una base de datos==== | ||
+ | ;Cerrar conexión | ||
+ | *Cuando ya no vamos a utilizar más la conexión la cerramos para liberar recursos. | ||
+ | *Es importante hacer esta acción de forma explícita | ||
+ | <source lang=php> | ||
+ | $miConexion->close(); | ||
+ | </source> | ||
− | ===Cambiar la base de datos=== | + | =====Cambiar la base de datos===== |
*Si hemos seleccionado una base de datos, o no hemos seleccionado ninguna y queremos cambiar a otra | *Si hemos seleccionado una base de datos, o no hemos seleccionado ninguna y queremos cambiar a otra | ||
<source lang=php> | <source lang=php> | ||
Línea 402: | Línea 165: | ||
$miConexion->close(); | $miConexion->close(); | ||
</source> | </source> | ||
+ | {{Tip|Es muy importante liberar un recurso reservado una vez que ya no se vaya a usar mas.}} | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
− | ===DML=== | + | ====Ejecutando sentencias SQL: DML (insert, delete, update, select)==== |
*En SQL sabemos que tenmos tres tipos de lenguajes DDL, DML, DCL | *En SQL sabemos que tenmos tres tipos de lenguajes DDL, DML, DCL | ||
− | * | + | *Nos vamos a centrar en el DML, Leguane de maniputación de datos |
*Podemos clasificar en dos tipos de clúsulas: | *Podemos clasificar en dos tipos de clúsulas: | ||
#las que no devuelven registros de datos (INSERT, DELETE, UPDATE) | #las que no devuelven registros de datos (INSERT, DELETE, UPDATE) | ||
Línea 419: | Línea 183: | ||
<div class="slide"> | <div class="slide"> | ||
− | ===INSERT, UPDATE Y DELETE: Método query=== | + | =====INSERT, UPDATE Y DELETE: Método '''''query(...)'''''===== |
− | + | El método '''''query''''', es un método de la clase '''''mysqli''''' que permite enviar una '''sentencia sql''' a la base de datos con la que tengamos conexión. En función del tipo de consulta, el método nos puede devolver los siguientes valores: <br /> | |
− | + | #'''''Booleano''''' (con las sentencias ''' Insert, Update, Delete'''); indica si la acción se realizó o no correctamente. | |
− | {{ | + | #'''''mysqli_result''''' (con la sentencia''' Select'''); si la consulta es de tipo '''''select''''', el método retornará un conjunto de filas (0 o más); Dispondremos de esta información en un objeto del la clase '''mysql_result'''. Esta clase la estudiamos posteriormente. |
+ | Hay que tener en cuenta que este método modifica el objeto de la clase '''''mysqli''''' pudiendo afectar a los siguiente atributos: | ||
+ | {{MRM_Puntos clave|Title=Atributos que puede modificar '''''query()'''''| | ||
+ | #'''''$affected_rows'''''. Número de filas modificadas por la acción. | ||
+ | #'''''$error, $errno'''''. En caso de producir un error la sentencia. | ||
+ | #'''''$insert_id''''' Devuelve el id autogenerado que se utilizó en la última inserción. | ||
+ | }} | ||
+ | |||
+ | |||
+ | {{MRM_Resumen| | ||
<source lang=php> | <source lang=php> | ||
− | $ | + | //Me conecto a la base de datos |
+ | $miConexion = new mysqli("localhost", "root", "root", "dwes"); | ||
+ | |||
+ | //Me preparo sentencias | ||
+ | //Actuaré sobre la tabla tienda (ver BD anterior) | ||
+ | //Tiene los campos cod (autogenerado de forma incremental), | ||
+ | //nombre y tlf (ambos de tipo varchar) | ||
+ | $sentenciaInsert="INSERT INTO tienda (nombre, tlf) | ||
+ | VALUES ('Tienda centro', '111-155226')"; | ||
+ | $sentenciaDelete="DELETE FROM tienda | ||
+ | WHERE nombre = 'Tienda centro' "; | ||
+ | $sentenciaUpdate="UPDATE tabla tienda | ||
+ | SET nombre = 'Tienda principal' | ||
+ | WHERE nombre = 'Tienda centro'"; | ||
+ | |||
+ | |||
+ | //Hago una consulta de tipo insert | ||
+ | $resultado=miConexion->query($sentenciaInsert) | ||
if($resultado){ | if($resultado){ | ||
− | echo"Se han | + | echo"Se han insertado $miConexion->affected_rows |
+ | filas en esta acción <br />"; | ||
+ | echo "en la inserción se asignó el id autogenerado $miConexion->insert_id | ||
+ | <br />"; | ||
} | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
</source> | </source> | ||
}} | }} | ||
+ | {{Tip|'''''Muy importante''''' observa el tema de las comillas, los valores de las instrucciones sql sin son de tipo varchar deben de ir entre comillas}} | ||
+ | {{Tip|'''''Muy importante''''' para la BD es igual comilla simple ''''''''''' que comillas dobles '''''"'''''}} | ||
+ | {{MRM_Pregunta| | ||
+ | '''''Qué pasa si en nombre de la tienda es por ejemplo Technology's house''''' | ||
+ | *Habría que escapar ese carácter}} | ||
+ | {{MRM_Actividad|Title=Inserción de datos| | ||
+ | *Realiza una aplicación para insertar datos en una tabla llamada usuarios | ||
+ | *Insertaremos '''''Nombre''''', '''''Password''''' y edad | ||
+ | *Verificaremos la insercción accediendo a la base de datos con phpmyadmin | ||
+ | *El password que esté cifrada | ||
+ | }} | ||
+ | |||
+ | ====Escapar caracteres==== | ||
+ | Consiste en que de una forma automática si una cadena de caracteres tiene comillas, que estás queden escapadas para que formen parte de la cadena de caracteres y no especifique delimitación de la cadena.<br /> | ||
+ | {{MRM_Definicion|Title=Método para escapar cadenas| | ||
+ | *Es un método de la clase '''''mysqli''''' | ||
+ | <source lang=php> | ||
+ | |||
+ | string mysqli_real_scape_string ( mysqli $conexion, string $cadena_a_escapar ) | ||
+ | |||
+ | </source> | ||
+ | También se puede usar como método de la clase | ||
+ | <source lang=php> | ||
+ | $conexion = new mysqli(..); | ||
+ | $cadena = $conexion->real_scape_string(....); | ||
+ | </source> | ||
+ | }} | ||
+ | |||
+ | {{MRM_Ejemplo|Title=Escapar caracteres| | ||
+ | *suponemos que tenemos una tabla llamada '''acciones''' que tiene el campo '''descripcion''' y '''cod_usuario''' | ||
+ | *Quiero insertar este valor para descripcion como muestra el siguiente código: | ||
+ | <source lang = php> | ||
+ | //... | ||
+ | $descripción = "I don't want go animal's house" | ||
+ | //Esta asignación es correcta | ||
+ | //... | ||
+ | $consulta = "INSERT INTO acciones VALUES (1, '$descripcion')" | ||
+ | //... | ||
+ | |||
+ | </source> | ||
+ | si yo miro el contenido de la variable '''''$consulta''''' que es lo que pasare al método '''''query()''''' | ||
+ | <source lang= php> | ||
+ | INSERT INTO acciones VALUES (1, 'I don't want go animal's house') | ||
+ | </source> | ||
+ | *Esto a la hora de insertar me generará un error, ya que el gestor interpreta que el contenido para el campo '''''descripcion''''' es 'I don' | ||
+ | *Para evitar esto yo querría que el valor de '''''$descripcion''''' estuviera escapado | ||
+ | |||
+ | |||
+ | <source lang= php> | ||
+ | INSERT INTO acciones VALUES (1, 'I don\'t want go animal\'s house') | ||
+ | </source> | ||
+ | se puede conseguir | ||
+ | <source lang = php> | ||
+ | //... | ||
+ | $descripción = $conexion->real_scape_string("I don't want go animal's house"); | ||
+ | //... | ||
+ | $consulta = "INSERT INTO acciones VALUES (1, '$descripcion')" | ||
+ | //... | ||
+ | |||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | {{Tip|Alternativamente al método de la clase mysqli, podemos usar con metodología estructurada la función '''''mysql_real_scape_string()}} | ||
+ | {{MRM_Web| | ||
+ | https://www.php.net/manual/es/mysqli.real-escape-string.php | ||
+ | }} | ||
+ | |||
+ | {{Tip|Observa el tema de las comillas, los valores de las instrucciones '''sql''' sin son de tipo '''''varchar''''' deben de ir entre comillas}} | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
<source lang=php> | <source lang=php> | ||
− | |||
− | |||
− | |||
− | |||
Línea 491: | Línea 352: | ||
<div class="slide"> | <div class="slide"> | ||
− | ===Clausula SELECT con query=== | + | ====Clausula SELECT con query==== |
*Tenemos dos maneras de realizar consultas con mysqli | *Tenemos dos maneras de realizar consultas con mysqli | ||
#query | #query | ||
#real_query | #real_query | ||
− | *En el primero caso el método nos retorna un cursor que será de la clase mysqli_result | + | *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> | ||
+ | *El método '''''query''''' con una sentencia de tipo '''''select''''' como parámetro, nos retorna un objeto de la clase mysqli_result. Esta clase (recurso) implemente la interfaz '''''Traversable''''', lo que le hace iterable en los datos que contiene. | ||
+ | *Esta clase contiene el resultado de la consulta como un conjunto de filas, pero no lo tiene como un atributo visible, si no como parte de los métodos que tenemos disponibles para obtenerlo (los metodos fetch_xxxx) | ||
<div class="slide"> | <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. | ||
− | *Tenemos 4 formas de poder acceder a los datos según usemos un método u otro | + | *Tenemos 4 formas de poder acceder a los datos según usemos un método u otro. |
+ | *Cuando hablamos de acceder a los datos, estamos estableciendo la forma de extraer cada fila, registro o tupla resultado de ejecutar la consulta. | ||
;fetch_array() | ;fetch_array() | ||
:Va obteniendo cada registro como un array | :Va obteniendo cada registro como un array | ||
Línea 518: | Línea 383: | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_Actividad| |
− | * | + | *Obtén todos los registros de la tabla familia |
− | * | + | *visualízalos 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()'''''; | ||
Línea 536: | Línea 401: | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_Resumen| |
<source lang=php> | <source lang=php> | ||
$conexion= new mysqli($host,$user,$pass,$bd); | $conexion= new mysqli($host,$user,$pass,$bd); | ||
Línea 556: | Línea 421: | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_Actividad| |
Haciendo una consulta del tipo select * from producto where pvp < 200, realiza un código que visualizce en una tabla los resultados }} | Haciendo una consulta del tipo select * from producto where pvp < 200, realiza un código que visualizce en una tabla los resultados }} | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
− | ===Transacciones=== | + | ====Transacciones==== |
<br/> | <br/> | ||
− | {{ | + | {{MRM_Definicion| |
*Una transacción es un conjunto de acciones u operaciones que | *Una transacción es un conjunto de acciones u operaciones que | ||
*Esta se realizan contra una base de datos de modo que o bien se realizan correctamente todas | *Esta se realizan contra una base de datos de modo que o bien se realizan correctamente todas | ||
Línea 589: | Línea 454: | ||
if (CondicionOK){ | if (CondicionOK){ | ||
− | //Terminamos la transacción confirmando todas las acciones sobre la base de datos desde que se inició la | + | //Terminamos la transacción confirmando todas las acciones sobre la base de |
− | + | //datos desde que se inició la transacción | |
$conexion->commit(); | $conexion->commit(); | ||
}else{ | }else{ | ||
− | //Terminamos la transacción | + | //Terminamos la transacción deshaciendo todas |
− | + | //las acciones sobre la base de datos desde que se inició la | |
+ | //transaccion, y dejando la base de datos igual que estaba al principio | ||
$conexion->rollback(); | $conexion->rollback(); | ||
} | } | ||
Línea 601: | Línea 467: | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_Actividad| |
Ejercicio de transacciones | Ejercicio de transacciones | ||
}} | }} | ||
Línea 607: | Línea 473: | ||
<div class="slide"> | <div class="slide"> | ||
− | ===Injecciones SQL=== | + | ====Injecciones SQL==== |
*Es un problema de seguridad importante, que hay que conocer y evitar | *Es un problema de seguridad importante, que hay que conocer y evitar | ||
*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. | ||
Línea 613: | Línea 479: | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_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 | ||
Línea 621: | Línea 487: | ||
<div class="slide"> | <div class="slide"> | ||
;Otras entradas un poco cuestionables por finalidad ??? | ;Otras entradas un poco cuestionables por finalidad ??? | ||
− | {{ | + | {{MRM_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 | ||
Línea 634: | Línea 500: | ||
#Entrar en la plataforma sin tener acceso | #Entrar en la plataforma sin tener acceso | ||
− | ===Entrar en la plataforma sin tener acceso=== | + | =====Entrar en la plataforma sin tener acceso===== |
*Entramos en una página y vemos el siguiente acceso | *Entramos en una página y vemos el siguiente acceso | ||
[[Archivo:miAcceso.png]] | [[Archivo:miAcceso.png]] | ||
Línea 670: | Línea 536: | ||
[[Archivo:miAccesoInjeccion.png]] | [[Archivo:miAccesoInjeccion.png]] | ||
*Entramos al sistema sin conocer usuario y contraseña | *Entramos al sistema sin conocer usuario y contraseña | ||
− | [[Archivo:accesoInjectado.png]] | + | [[Archivo:accesoInjectado.png|800px]] |
</div> | </div> | ||
<div class="slide"> | <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 | ||
Línea 703: | Línea 570: | ||
<div class="slide"> | <div class="slide"> | ||
− | ===Parametrizar las consultas preparadas=== | + | ====Parametrizar las consultas preparadas==== |
*El uso real de las consultas preparadas es que los valores que pasas se asignen antes de ejectuar la consulta. | *El uso real de las consultas preparadas es que los valores que pasas se asignen antes de ejectuar la consulta. | ||
*La idea es preapara la consulta sin indicar los valores. | *La idea es preapara la consulta sin indicar los valores. | ||
Línea 729: | Línea 596: | ||
#'''''i''''': número entero | #'''''i''''': número entero | ||
#'''''d''''': número float | #'''''d''''': número float | ||
− | #'''''b''''': valor binario (BLOB) | + | #'''''b''''': valor binario (BLOB ('''binary large object''')) |
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
Línea 754: | Línea 621: | ||
$consulta->bind_param('ss', 'TABLET', 'Tablet PC'); // Genera un error | $consulta->bind_param('ss', 'TABLET', 'Tablet PC'); // Genera un error | ||
</source> | </source> | ||
− | {{ | + | {{MRM_Resumen| |
<source lang=php> | <source lang=php> | ||
$conexion = new mysqli(...); | $conexion = new mysqli(...); | ||
$consulta = $conexion->stmt_init(); | $consulta = $conexion->stmt_init(); | ||
$consulta->prepare(...sentencia ... con ???) | $consulta->prepare(...sentencia ... con ???) | ||
− | $consulta->bind_param('s-i-b-d(tipo_de_valores)',valores_en_variables_respectivos_a_????'); | + | $consulta->bind_param('s-i-b-d(tipo_de_valores)', |
+ | valores_en_variables_respectivos_a_????'); | ||
$consulta->execute(); | $consulta->execute(); | ||
$consulta->close(); | $consulta->close(); | ||
Línea 768: | Línea 636: | ||
<div class="slide"> | <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 | ||
Línea 792: | Línea 660: | ||
*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 | ||
− | {{ | + | {{MRM_Actividad| |
*Modifica el ejercicio anterior usando consultas parametrizadas | *Modifica el ejercicio anterior usando consultas parametrizadas | ||
}} | }} | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_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 | ||
Línea 806: | Línea 674: | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_Actividad|Title=Práctica de tienda| |
*Puedes usar como base los siguientes ficheros css y plantilla adjuntos. | *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. | ||
Línea 817: | Línea 685: | ||
<div class="slide"> | <div class="slide"> | ||
<!-- | <!-- | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
;Resetear la password de root | ;Resetear la password de root | ||
https://www.howtoforge.com/reset-forgotten-mysql-root-password | https://www.howtoforge.com/reset-forgotten-mysql-root-password | ||
</div> | </div> |
Última revisión de 18:03 7 abr 2022
Esto será crear una instancia de un objeto de conexión
Si, por el motivo que fuera, no nos hemos podido conectar,generalmente: 1.- Informaremos de ello 2.- Cerraremos la conexión
Ejecutaremos sentencias SQL y recogeremos el resultado de la consulta Generalmente informaremos de algo al usuario de la aplicación
Un aspecto que puede pasar desapercibido, pero muy importante
|
- El método query con una sentencia de tipo select como parámetro, nos retorna un objeto de la clase mysqli_result. Esta clase (recurso) implemente la interfaz Traversable, lo que le hace iterable en los datos que contiene.
- Esta clase contiene el resultado de la consulta como un conjunto de filas, pero no lo tiene como un atributo visible, si no como parte de los métodos que tenemos disponibles para obtenerlo (los metodos fetch_xxxx)