Conectar PHP y base de datos

Conectar PHP y base de datos

PHP

Al programar en PHP lo habitual en la mayoría de casos es necesitar conectar con una base de datos y realizar opciones en ella.

A grandes rasgos, existen dos formas de conectar PHP y una base de datos: utilizando mysqli o utilizando PDO. Antes también se utilizaba mysql, pero esta extensión está obsoleta a partir de PHP 5.5.0.

PHP y Mysqli

La extensión mysqli (mysql improved) permite acceder a la funcionalidad proporcionada por MySQL 4.1 y posterior.

La extensión mysqli, o como a veces se le conoce, la extensión de MySQL mejorada, se desarrolló para aprovechar las nuevas funcionalidades encontradas en los sistemas MySQL con versión 4.1.3 o posterior. La extensión mysqli viene incluida en las versiones PHP 5 y posteriores.

La extensión mysqli contiene numerosos beneficios, siendo estas las mejoras principales respecto a la extensión mysql:

  • Interfaz orientada a objetos
  • Soporte para Declaraciones Preparadas
  • Soporte para Múltiples Declaraciones
  • Soporte para Transacciones
  • Mejoradas las opciones de depuración
  • Soporte para servidor empotrado

Además de la interfaz orientada a objetos, esta extensión también proporciona una interfaz procedural.

La extensión mysqli ofrece una interfaz dual. Soporta el paradigma de programación procedimental y el orientado a objetos.

Mysqli procedimental

Los usuarios que migren desde la extensión mysql antigua pueden preferir la interfaz procedimental. Esta interfaz es similar a la de la extensión antigua de mysql. En la mayoría de los casos, los nombres de funciones difieren únicamente por el prefijo. Algunas funciones de mysqli toman como primer argumento un gestor de conexión, mientras que las funciones similares de la antigua interfaz de mysql lo toman como el último argumento opcional.

Ejemplo

El siguiente ejemplo muestra la forma de crear una conexión y realizar una consulta utilizando PHP + Mysqli procedimental.

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

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

// Set charset
mysqli_set_charset($conn, "utf8");

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "SELECT id, firstname, lastname FROM employee";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo "id: " . $row["id"] . " - Name: " . $row["firstname"] . " " . $row["lastname"] . "<br>";
    }
} else {
    echo "0 results";
}

// Close connection
mysqli_close($conn);

Mysqli orientada a objetos

Además de la clásica interfaz procedimental, los usuarios pueden optar por usar la interfaz orientada a objetos. La documentación está organizada según la interfaz orientada a objetos. Esta interfaz muestra las funciones agrupadas por su propósito, haciendo más fácil los comienzos. La sección de referencia proporciona ejemplos para ambas variantes de sintaxis.

No existen diferencias significativas de rendimiento entre las dos interfaces. Los usuarios puede basar su elección en sus preferencias personales.

Ejemplo

El siguiente ejemplo muestra la forma de crear una conexión y realizar una consulta utilizando PHP + Mysqli orientado a objetos.

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

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

// Set charset
$conn->set_charset("utf8");

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM employee";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"] . " - Name: " . $row["firstname"] . " " . $row["lastname"] . "<br>";
    }
} else {
    echo "0 results";
}

// Close connection
$conn->close();

PHP y PDO

Los Objetos de Datos de PHP, o PDO, son una capa de abstracción de bases de datos específicas para aplicaciones PHP. PDO ofrece una API homogénea para las aplicaciones PHP, independientemente del tipo de servidor de bases de datos con el que se vaya a conectar la aplicación. En teoría, si se utiliza la API PDO, se podría cambiar el servidor de bases de datos en uso, por ejemplo de Firebird a MySQL, y sólo se necesitarían algunos cambios menores en el código PHP.

A pesar de que PDO tiene sus ventajas, tales como una API limpia, sencilla y portable, su mayor inconveniente es que no permite utilizar todas las funcionalidades avanzadas en la última versión del servidor MySQL. Por ejemplo, PDO no permite hacer uso de las Declaraciones Múltiples de MySQL.

Ejemplo

El siguiente ejemplo muestra la forma de crear una conexión y realizar una consulta utilizando PHP + PDO.

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

try {
    // Create connection
    $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);

    // Set charset
    $conn->exec("set names utf8mb4");

    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT * FROM employee");
    $stmt->execute();
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    foreach ($stmt->fetchAll() as $row) {
        echo "id: " . $row["id"] . " - Name: " . $row["firstname"] . " " . $row["lastname"] . "<br>";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;

Utilizar MySQLi o PDO

Tanto MySQLi como PDO tienen sus ventajas:

PDO funcionará en 12 sistemas de bases de datos diferentes, mientras que MySQLi solo funcionará con bases de datos MySQL. Es importante remarcar que al funcionar con tantos sistemas distintos, PDO no está optimizado para ninguno de ellos.

Entonces, si tiene que cambiar su proyecto para usar otra base de datos, PDO facilita el proceso. Solo tiene que cambiar la cadena de conexión y algunas consultas. Con MySQLi, deberá volver a escribir todo el código, incluidas las consultas.

Ambos están orientados a objetos, pero MySQLi también ofrece una API de procedimiento.

Ambos admiten declaraciones preparadas. Las declaraciones preparadas protegen contra la inyección de SQL y son muy importantes para la seguridad de las aplicaciones web.

Base de datos de ejemplo

Si quieres realizar estas pruebas, a continuación te facilitamos la base de datos que hemos utilizado nosotros.

CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `firstname` varchar(50) NOT NULL,
  `lastname` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `employee` (`id`, `firstname`, `lastname`, `email`) VALUES
(1, 'John', 'Deere', 'jdeere@mycompany.com'),
(2, 'Adam', 'Perry', 'aperry@mycompany.com'),
(3, 'Noé', 'Bosch', 'nbosch@mycompany.com');

ALTER TABLE `employee`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `employee`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

Leer más: Sentencias básicas de SQL

Leave a reply