Diferencia entre revisiones de «Plantilla:PHP/Mysqli»
De WikiEducator
(→Clausula SELECT con query) |
|||
(25 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
− | |||
<div id=parrafo> | <div id=parrafo> | ||
<div class="slide"> | <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 10: | 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 21: | 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 350: | 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 369: | 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 401: | 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 410: | Línea 128: | ||
<div class="slide"> | <div class="slide"> | ||
− | + | ||
<hr/> | <hr/> | ||
;mysqli.reconnect | ;mysqli.reconnect | ||
Línea 425: | 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 440: | 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 457: | 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 /> | 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. | #'''''Booleano''''' (con las sentencias ''' Insert, Update, Delete'''); indica si la acción se realizó o no correctamente. | ||
Línea 476: | Línea 202: | ||
//Me preparo sentencias | //Me preparo sentencias | ||
//Actuaré sobre la tabla tienda (ver BD anterior) | //Actuaré sobre la tabla tienda (ver BD anterior) | ||
− | //Tiene los campos cod (autogenerado de forma incremental), nombre y tlf (ambos de tipo varchar) | + | //Tiene los campos cod (autogenerado de forma incremental), |
+ | //nombre y tlf (ambos de tipo varchar) | ||
$sentenciaInsert="INSERT INTO tienda (nombre, tlf) | $sentenciaInsert="INSERT INTO tienda (nombre, tlf) | ||
VALUES ('Tienda centro', '111-155226')"; | VALUES ('Tienda centro', '111-155226')"; | ||
Línea 504: | Línea 231: | ||
{{MRM_Pregunta| | {{MRM_Pregunta| | ||
'''''Qué pasa si en nombre de la tienda es por ejemplo Technology's house''''' | '''''Qué pasa si en nombre de la tienda es por ejemplo Technology's house''''' | ||
− | *Habría que escapar ese | + | *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==== | ====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 /> | 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 /> | ||
Línea 510: | Línea 244: | ||
*Es un método de la clase '''''mysqli''''' | *Es un método de la clase '''''mysqli''''' | ||
<source lang=php> | <source lang=php> | ||
− | string | + | |
+ | 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> | </source> | ||
}} | }} | ||
Línea 532: | Línea 273: | ||
*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' | *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 | *Para evitar esto yo querría que el valor de '''''$descripcion''''' estuviera escapado | ||
+ | |||
+ | |||
<source lang= php> | <source lang= php> | ||
INSERT INTO acciones VALUES (1, 'I don\'t want go animal\'s house') | INSERT INTO acciones VALUES (1, 'I don\'t want go animal\'s house') | ||
</source> | </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}} | {{Tip|Observa el tema de las comillas, los valores de las instrucciones '''sql''' sin son de tipo '''''varchar''''' deben de ir entre comillas}} | ||
Línea 596: | 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 623: | 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 641: | 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 661: | 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 694: | 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 706: | Línea 467: | ||
<div class="slide"> | <div class="slide"> | ||
− | {{ | + | {{MRM_Actividad| |
Ejercicio de transacciones | Ejercicio de transacciones | ||
}} | }} | ||
Línea 712: | 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 718: | 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 726: | 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 739: | 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 780: | Línea 541: | ||
<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 809: | 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 835: | 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 860: | 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 874: | 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 898: | 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 912: | 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 923: | 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)