Quina és la diferència entre PDO i MySQLi?

El que no està tan definit és quina és la millor manera de connectar-se a MySQL fent servir PHP. A priori en destaquen dues:MySQLi, PDO

Quina és la diferència entre PDO i MySQLi?

Si em dieu que estàs desenvolupant una aplicació web usant PHP i no em dones més dades, tancant els ulls diria que estàs usant una base de dades MySQL i, segur que en el 80% dels casos encertaria.

És un fet: PHP i MySQL són un duet molt comú en aquest món.

El que no està tan definit és quina és la millor manera de connectar-se a MySQL fent servir PHP. A priori en destaquen dues:MySQLi, PDO

Tots dos poden utilitzar-se per armar CRUDs, reportis i qualsevol altra necessitat que impliqui comunicar una aplicació PHP amb una base de dades MySQL.

Aleshores… com triar?

Per fer-te (una cosa) més fàcil la tasca et comentaré breument de què es tracta cadascú.

En els dos blocs de codi PHP que has compartit, estàs treballant amb dues maneres diferents d'interactuar amb una base de dades: una utilitza PDO (PHP Data Objects) i l'altra utilitza l'extensió mysqli de PHP. Tot i que els dos enfoquen el mateix objectiu (recuperar i mostrar dades de la base de dades), hi ha algunes diferències importants entre les dues. A continuació, detallo les diferències i característiques de cada enfocament.

Primer bloc: Usant PDO (PHP Data Objects)

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
  $pdo = new PDO($dsn, $user, $pass, $options);
  $stmt = $pdo->prepare("SELECT posts.id, posts.title, posts.img, posts.url FROM posts INNER JOIN post_etiquetas ON posts.id = post_etiquetas.post_id WHERE posts.category_id = 23 AND post_etiquetas.etiqueta_id = 131 LIMIT 12");
  $stmt->execute();
  $pagines = $stmt->fetchAll();
} catch (\PDOException $e) {
  echo 'Error de connexió: ' . $e->getMessage();
  $pagines = [];
}

Característiques de PDO:

  1. Flexibilitat: PDO és més flexible perquè et permet connectar-te a múltiples tipus de bases de dades (MySQL, PostgreSQL, SQLite, etc.), mentre que mysqli només funciona amb MySQL.
  2. Seguretat: PDO gestiona les consultes preparades de manera eficient, ajudant a prevenir les injeccions SQL.
  3. Interfície orientada a objectes: PDO utilitza una sintaxi orientada a objectes, la qual pot ser més fàcil de mantenir i extendre en projectes més grans.
  4. Maneig d'errors: PDO utilitza excepcions per gestionar els errors, permetent-te capturar i manejar-los amb més control.
  5. Connexió única: La connexió es realitza mitjançant una cadena DSN, que especifica el tipus de base de dades, l'amfitrió, el nom de la base de dades, etc.

Codi SQL (PDO):

SELECT posts.id, posts.title, posts.img, posts.url
FROM posts
INNER JOIN post_etiquetas ON posts.id = post_etiquetas.post_id
WHERE posts.category_id = 23 AND post_etiquetas.etiqueta_id = 131
LIMIT 12

Segon bloc: Usant mysqli

Copia$conn = new mysqli($host, $user, $pass, $db);
$conn->set_charset("utf8");

if ($conn->connect_error) {
    die("Connexió fallida: " . $conn->connect_error);
}

$sql = "SELECT p.* FROM posts p JOIN post_etiquetas pe1 ON p.id = pe1.post_id AND pe1.etiqueta_id = 135 JOIN post_etiquetas pe2 ON p.id = pe2.post_id AND pe2.etiqueta_id = 62 WHERE p.category_id = 23";
$result = $conn->query($sql);

Característiques de mysqli:

  1. Específic de MySQL: mysqli està dissenyat exclusivament per a MySQL, mentre que PDO és una solució més genèrica que suporta diversos tipus de bases de dades.
  2. Interfície procedural i orientada a objectes: mysqli pot ser utilitzat tant en un estil procedimental (com el que veiem en aquest exemple) com en un estil orientat a objectes. Aquesta flexibilitat permet als desenvolupadors triar l'estil que els sigui més còmode.
  3. Connexió: En mysqli, crees la connexió a la base de dades amb el mètode new mysqli(). No cal especificar un DSN, només necessites l'amfitrió, usuari, contrasenya i base de dades.
  4. Maneig d'errors: El maneig d'errors es realitza de manera diferent a PDO, ja que aquí es fa mitjançant el mètode connect_error i la funció die() per sortir en cas de fallar la connexió.
  5. Consultes senzilles: Per a consultes senzilles, mysqli és bastant directe, però no és tan flexible ni pot manejar diferents tipus de bases de dades.

Codi SQL (mysqli):

SELECT p.* 
FROM posts p 
JOIN post_etiquetas pe1 ON p.id = pe1.post_id AND pe1.etiqueta_id = 135 
JOIN post_etiquetas pe2 ON p.id = pe2.post_id AND pe2.etiqueta_id = 62 
WHERE p.category_id = 23

Diferències clau:

  1. Compatibilitat de bases de dades: PDO és més flexible i es pot utilitzar amb diferents tipus de bases de dades, mentre que mysqli només funciona amb MySQL.
  2. Sintaxi: PDO utilitza una sintaxi orientada a objectes, mentre que mysqli ofereix tant una sintaxi orientada a objectes com una sintaxi procedimental.
  3. Seguretat: Amb PDO, les consultes preparades són la norma, mentre que amb mysqli també es poden utilitzar, però no és obligatori.
  4. Maneig d'errors: PDO utilitza excepcions per gestionar errors, mentre que mysqli utilitza codis d'error o missatges d'error per gestionar la connexió fallida.
  5. Rendiment: El rendiment és bastant semblant entre ambdós, però PDO podria ser més eficient en projectes més grans, ja que és més flexible i fa un millor maneig dels errors.

En resum:

  • Si estàs treballant en un projecte on la compatibilitat amb diferents bases de dades és important, PDO és la millor opció.
  • Si treballes exclusivament amb MySQL i busques una solució més senzilla, mysqli pot ser suficient.

Ambdós enfocaments són vàlids, però la teva elecció dependrà de les necessitats específiques del projecte i de la teva preferència personal per a l'estil de codi.