Diferencia entre revisiones de «Plantilla:PHP/Mysqli»
De WikiEducator
(→Clausula SELECT con query) |
|||
(18 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 | + | ===Mysqli=== |
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 9: | 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 19: | ||
</source> | </source> | ||
</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 34: | 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 53: | 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 85: | 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 94: | Línea 128: | ||
<div class="slide"> | <div class="slide"> | ||
− | + | ||
<hr/> | <hr/> | ||
;mysqli.reconnect | ;mysqli.reconnect | ||
Línea 114: | Línea 148: | ||
</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 124: | 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 141: | 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 189: | 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 195: | 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 217: | 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 281: | 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 326: | 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 351: | Línea 426: | ||
<div class="slide"> | <div class="slide"> | ||
− | ===Transacciones=== | + | ====Transacciones==== |
<br/> | <br/> | ||
{{MRM_Definicion| | {{MRM_Definicion| | ||
Línea 398: | 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 425: | 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 466: | 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 495: | 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 521: | 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 546: | 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(...); | ||
Línea 561: | 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 610: | 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)