Acceso a bases de datos desde linguaxes de script de servidor

De MediaWiki
Ir a la navegación Ir a la búsqueda


Obxectivos

  • Aprender o esquema xeneral de acceso a bases de datos desde unha linguaxe de script.
  • Saber conectar desde PHP a un sistema sestor de bases de datos.
  • Coñecer os comandos que permiten seleccionar bases de datos desde PHP.
  • Aprender os comandos para poder crear unha táboa desde unha base de datos accedida desde PHP.
  • Lanzar consultas de selección sobre as táboas dunha base de datos.
  • Executar sentencias de actualización/eliminación e inserción sobre unha ou máis taboas
  • Coñecer os fundamentos de seguridad dun sitio web nos accesos á base de datos.

Programando con PHP o acceso a bases de datos

As aplicacións web fan habitualmente un uso intenso de bases de datos para diversos obxectivos. Nelas poden gardar, por exemplo, a lista de usuarios coñecidos, as opcións dos distintos menús, cachés de contidos ou alias de URLs.

As bases de datos son un medio eficaz, flexible, seguro e de alto rendemento de almacenar información e facela accesible a todas as aplicacións que precisen o seu uso. Deste xeito, a aplicación web pode ser só un dos múltiples clientes que estean a utilizar a información da base de datos.

Cando se programa a aplicación web con PHP, MySQL ou MariaDB son o sistemas xestores de bases de datos máis empregados. Tamén é común o uso de PostgreeSQL, e outras moitas alternativas son posibles.

O seu uso é realmente simple, porque o programador disporá dun conxunto de funcións que lle permitirán establecer unha comunicación entre a aplicación e o servidor de bases de datos e pedirlle a execución de todo tipo de operacións.

Como comezar. Non tes coñecementos de PHP? Podes atopar máis información:
* na anterior Unidade Didáctica
* no titorial específico de PHP.

Está particularmente ben descrito e con código con exemplos o titorial de PHP e Mysql de w3schools.

Tes tamén videotitorias que che poden servir de guía:

MySQLi ou PDO

Desde PHP 5 pódese traballar con bases de datos empregando:

  • MySQLi extension (a i é de improved, mellorada)
  • PDO (PHP Data Objects)

Desde 2012 está obsoleto o uso da extensión MySQL.

Cál é recomendable empregar? Cada un ten as súas vantaxes:

  • PDO pode traballar con 12 SXBD diferentes; MySQLi só con MySQL/MariaDB.
  • Os dous son orientados a obxectos, pero MySQLi tamén ofrece unha API procedimental
  • Os dous soportan Prepared Statements, que protexen a aplicación de SQL injections; un ataque moi frecuente, e que debemos ter moi en conta na seguridade da aplicación.

En resumo, se é posible que desexes migrar o proxecto a outra base de datos, ou que ese proxecto teña que ser integrado en diferentes empresas que poden ter diferentes SXBD, PDO posiblemente sea a amellor opción. Con cambiar a cadea de conexión e adaptar algunhas queries, xa estará operativo, mentres que con MySQLi tería que reeescribir todo o código, coas queries inclúidas. No resto dos casos, a elección e túa.

Tamén no referente o uso procedimental da API de MySQLi ou orientado a obxectos, ambas son opcións igualmente válidas.


IMPORTANTE. Centrarémonos en cómo conectar con MySQL desde PHP. Con todo, é posible utilizar o estándar ODBC (open database conectivity) para poder acceder a calquer outro SXBD para o que exista un controlador. 
ODBC é unha API (Application Programming Interface) que permite o acceso a calquier orixe de datos para o que exista un driver, que usará un conxunto de regras para permitir a comunicación entre distintos compoñentes de software.
ODBC é un estándar desenvolto por Microsoft e que podemos atopar dentro dos sistemas operativos Windows.

Pasos

A secuencia de pasos para acadar a integración entre a linguaxe de script (neste caso PHP) e a base de datos é:

  1. Aplicación conecta coa base de datos
  2. Aplicación solicita a execución dunha operación
  3. Base de datos retoma a información que se lle pedíua
  4. A aplicación manexa a información proporcionada pola base de datos e a presenta na pantalla ou informa ao usuario.

Conexión

Apertura

O primeiro paso para utilizar unha base de datos será tratar de establecer unha comunicación co servidor no que se atope.

No caso de MySQLi procedimental:

<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 $database = "database";

 // Create connection
 $conn = mysqli_connect($servername, $username, $password, $database);

 // Check connection
 if (!$conn) {
   die("Conexión fallou: " . mysqli_connect_error());
 }
 echo "Conexión con éxito";
?>

No caso de MySQLi orientado a obxectos:

<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 $database = "database";

 // Create connection
 $conn = new mysqli($servername, $username, $password, $database);

 // Check connection
 if ($conn->connect_error) {
   die("Conexión fallou: " . $conn->connect_error);
 }
 echo "Conexión con éxito";
?>

E no caso de PDO:

<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 $database = "database";
 try {
   $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
   // set the PDO error mode to exception
   $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   echo "Conexión con éxito";
 } catch(PDOException $e) {
   echo "Conexión fallou: " . $e->getMessage();
}
?>
INTERESANTE. Un beneficio de empregar PDO e que tén una clase de excepción para xestionar os problemas que poden ocurrir no lanzamento das queries.
Se unha excepción e lanzada dentro do bloque try{ } , detense a execución do script e contínua no primeiro bloque catch(){ }.

Conectarse a unha base de datos implica coñecer o seu nome (aínda que con MySQLi podemos conectar co xestor e indicar a base de datos máis adiante), en que máquina está o servidor de bases de datos e ter unha parella de login e contrasinal que permita o acceso.

A continuación haberá que comprobar que a conexión foi posible e en caso de que non o fose tomaranse as medidas oportunas. Se a aplicación web confía no uso dunha base de datos para o seu correcto funcionamento a acción probablemente deba rematar o script (cunha chamada a funcións coma exit() ou die()).

Peche

A conexión será pechada automáticamente cando o script finalice. Con todo é unha boa práctica moi aconsellable asegurarnos de pechar a conexión, empregando:

MySQLi Object-Oriented:

$conn->close();

MySQLi Procedural:

mysqli_close($conn);

PDO:

$conn = null;

Consultas

Se a conexión tivo éxito, a maior parte do traballo que faremos a continuación consistirá en enviar consultas SQL ao servido de base de datos para pedirlle que actualice os datos ou para recuperar información.

Por exemplo, coa función mysqli_query():

$conexion = mysqli_connect($host, $login, $contrasinal, $base);
$resultado = mysqli_query($conexion, $consulta);
if($resultado) {
   //A consulta executouse correctamente
} else {
   //Houbo algún problema coa execución da consulta
}

Consultas de creación

Examplo de consulta de creación de base de datos con MySQLi Procedimental:

<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";

 // Create connection
 $conn = mysqli_connect($servername, $username, $password);
 // Check connection
 if (!$conn) {
   die("Connection failed: " . mysqli_connect_error());
 }

 // Create database
 $sql = "CREATE DATABASE myDB";
 if (mysqli_query($conn, $sql)) {
   echo "Database created successfully";
 } else {
   echo "Error creating database: " . mysqli_error($conn);
 }

 mysqli_close($conn);
?>
IMPORTANTE. Podes consultar o xeito equivalente de crear bases de datos,  ou crear táboas con MySQLi orientado a obxectos e PDO no titorial de w3schools.

Consultas de actualización

As consultas de actualización da base de datos terán a estrutura xenérica vista no apartado anterior. Unha vez enviada a consulta ao servidor de bases de datos só queda averiguar se a súa execución foi correcta e, nalgunhas ocasións, utilizar o dato de cantas filas se viron afectadas polos cambios, usando a función mysqli_affected_rows();

$conexion = mysqli_connect($host, $login, $contrasinal, $base);
$resultado = mysqli_query($conexion, 'DELETE FROM clientes');
if($resultado) {
   echo 'Borráronse ' . mysqli_affected_rows($conexion) . ' clientes';
} else {
   echo 'Non foi posible o borrado';
}
IMPORTANTE. Podes consultar o xeito equivalente de insertar datos, borrar datos, ou actualizar datos con MySQLi orientado a obxectos e PDO no titorial de w3schools

Consultas de lectura

Cando se trata dunha consulta de lectura, haberá que engadir ao proceso anterior o necesario para o tratamento dos datos recibidos como contestación.

$conexion = mysqli_connect($host, $login, $contrasinal, $base);
$resultado = mysqli_query($conexion, 'SELECT * FROM clientes');
if($resultado) {
   while($fila = mysqli_fetch_assoc($resultado)) {
	echo $fila['id'] . '-' . $fila['nome'];
   }
} else {
   echo 'Non foi posible a lectura';
}

Habitualmente incluiremos un bucle que se encargue de percorrer cada unha das filas que forman a resposta da base de datos. Neste exemplo utilízase a función mysqli_fetch_assoc() que colle unha fila do resultado e convírtea nun array asociativo para que o seu tratamento dentro do programa sexa sinxelo.

IMPORTANTE. Podes consultar o xeito equivalente de leer datos con MySQLi orientado a obxectos e PDO no titorial de w3schools

Frameworks

Laravel

Laravel é un framework PHP de código aberto creado en 2011 por Taylor Otwell:

  • Utiliza Blade como motor de plantillas
  • Ten soporte para o patrón MVC.
  • Emprega Eloquent ORM e compoñentes de Symfony.
  • Soporta caché de forma nativa.
  • Permite utilizar Homestead (máquina virtual Vagrant que proporciona contorna de desenvolvemento nuns minutos).

Estes videotitorias poden ser de gran interese:

Na documentación oficial, relacionado coa base de datos, aquí está a información máis relevante:

Acceso seguro a base de datos

Aspectos da seguridade nos sitios web

Resumo

  • As bases de datos son un elemento imprescindible para poder construir unha página web dinámica
  • Mediante o seu uso poderemos conservar os datos dun sitio web de forma permanente
  • E poderemos utilizar a linguaxe SQL para acceder a eses datos.
  • Con PHP é posible acceder a diferentes sistemas xestores de bases de datos libres e propietarios
  • ODBC permite conectar desde PHP a moitos oríxenes de datos
  • PHP pode acceder a MySQL utilizando MySQLi (de forma procedimental ou orientada a obxectos) ou PDO

PHP dispón de diferentes comandos para

  • iniciar a conexión con MySQL
  • seleccionar bases de datos
  • enviar consultas
  • recuperar consultas
  • executar sentencias de tipo DDL, para poder crear diferentes obxectos como bases de datos e táboas
  • Compre implementar mecanismos de seguridade nas páxinas web fronte a amenazas externas
  • a máis frecuente que sufre un sitio web é a SQL injection la llamada inyección SQL (unha consulta SQL lanzada por un atacante con propósito malicioso)
  • Os aspectos que hai que observar na seguridad dun sitio web son entre outros a seguridade
  • na comunicación
  • no cliente
  • no servidor
  • na aplicación

Relacionado

Referencias