Acceso a bases de datos desde linguaxes de script de servidor
Sumario
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 é:
- Aplicación conecta coa base de datos
- Aplicación solicita a execución dunha operación
- Base de datos retoma a información que se lle pedíua
- 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
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
- Implantación de aplicaciones web (Segunda edición).Paredes Colmenar, María del Pilar.ISBN: 9788491713500
- Ejercicios resueltos base de datos PHP