Maison  >  Article  >  développement back-end  >  002 - Différences et choix entre PDO et MySQLi

002 - Différences et choix entre PDO et MySQLi

不言
不言original
2018-04-08 14:37:451865parcourir



Lorsque vous utilisez PHP pour accéder à la base de données, en plus du pilote de base de données fourni avec PHP, nous avons généralement deux meilleures options : PDO et MySQLi. . Dans le processus de développement proprement dit, pour décider lequel choisir, vous devez d’abord avoir une compréhension relativement complète des deux. Cet article analyse leurs différences et compare la prise en charge, la stabilité, les performances de plusieurs types de bases de données, etc.

tr>

 

PDO MySQLi
Database support 12 different drivers MySQL only
API OOP OOP + procedural
Connection Easy Easy
Named parameters Yes No
Object mapping Yes Yes
Prepared statements 
(client side)
Yes No
Performance Fast Fast
Stored procedures Yes Yes
AOP strong> MySQLi
Prise en charge des bases de données 12 pilotes différents MySQL uniquement
API POO POO + procédural
Connexion Facile Facile
Paramètres nommés Oui Non
Mappage d'objets Oui Oui
Relevés préparés (côté client) strong> Oui Non
Performances Rapide td> Rapide
Procédures stockées Oui Oui

1. Connexion


002 - Différences et choix entre PDO et MySQLi

// PDO$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password'); 
// mysqli, procedural way$mysqli = mysqli_connect('localhost','username','password','database'); 
// mysqli, object oriented way$mysqli = new mysqli('localhost','username','password','database');

002 - Différences et choix entre PDO et MySQLi

2. Prise en charge de l'API

PDO et MySQLi fournissent tous deux une API sous une forme orientée objet, mais MySQLi fournit également une API orientée processus. plus facile à comprendre pour les débutants. Si vous connaissez le pilote PHP mysql natif, vous constaterez qu'il est facile d'utiliser l'interface MySQLi pour remplacer l'accès aux données d'origine. L'avantage d'utiliser PDO est que PDO prend en charge plusieurs bases de données, tandis que MySQLi ne prend en charge que MySQL. Une fois que vous le maîtrisez, vous pouvez utiliser et connecter plusieurs bases de données à votre guise.

3. Prise en charge des bases de données

Le plus grand avantage de PDO par rapport à MySQLi est que PDO prend en charge de nombreux types de bases de données, tandis que MySQLi ne prend en charge que MySQLi. Pour voir quelles bases de données PDO prend en charge, utilisez le code suivant :

var_dump(PDO::getAvailableDrivers());

Quels sont les avantages de la prise en charge de plusieurs bases de données ? Lorsque votre programme souhaite passer de MySQL à SQL Server ou Oracle à l'avenir, les avantages de PDO seront reflétés, car la modification de la base de données est transparente pour l'interface du programme et les modifications du code php sont très minimes si vous utilisez MySQLi. , alors tous les utilisateurs partout dans la base de données doivent être réécrits, je ne peux donc apporter que de telles modifications.

4. Prise en charge des paramètres nommés

Paramètres nommés PDO et liaison des paramètres :


002 - Différences et choix entre PDO et MySQLi

$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);     
$pdo->prepare('
    SELECT * FROM users
    WHERE username = :username
    AND email = :email
    AND last_login > :last_login');     
$pdo->execute($params);

002 - Différences et choix entre PDO et MySQLi

Et liaison des paramètres MySQLi :


002 - Différences et choix entre PDO et MySQLi

$query = $mysqli->prepare('
    SELECT * FROM users
    WHERE username = ?
    AND email = ?
    AND last_login > ?');     
$query->bind_param('sss', 'test', $mail, time() - 3600);$query->execute();

002 - Différences et choix entre PDO et MySQLi

D'après la comparaison ci-dessus, nous pouvons voir que PDO lie les valeurs via des paramètres nommés, tandis que la liaison des paramètres MySQLi utilise le point marquez "?" et lie les valeurs strictement dans l'ordre de ce point d'interrogation. De cette façon, bien que le code semble moins long que le nom correspondant de PDO, un inconvénient est que la lisibilité et la maintenabilité sont réduites lorsque le nombre de paramètres est relativement petit, cela n'est pas perceptible lorsque le nombre de paramètres augmente au-delà de. 10 Le cas d'un ou plusieurs est plus pénible. Il faut attribuer les valeurs une à une dans l'ordre des points d'interrogation. Si l'une d'elles est fausse, les suivantes le seront.

Malheureusement, MySQLi ne prend pas en charge la liaison de paramètres nommés comme PDO.

5. Mappage d'objets

Le développement basé sur une base de données lit généralement les données de la base de données, puis utilise un objet pour transporter les données. PDO et MySQLi prennent en charge le mappage d'objets. Supposons qu'il existe une classe User qui possède certaines propriétés correspondant à la base de données. Sinon, pour le mappage d'objets, nous devons attribuer des valeurs aux champs un par un après avoir lu les données, ce qui est très fastidieux.

Veuillez consulter le code des deux objets ci-dessous :

002 - Différences et choix entre PDO et MySQLi

class User {    public $id;    public $first_name;    public $last_name;     
    public function info()
    {        return '#'.$this->id.': '.$this->first_name.' '.$this->last_name;
    }
}

002 - Différences et choix entre PDO et MySQLi

6. Sécurité


Les deux peuvent empêcher l'injection SQL. Regardons d'abord un exemple. 002 - Différences et choix entre PDO et MySQLi

$query = "SELECT id, first_name, last_name FROM users";     
// PDO$result = $pdo->query($query);$result->setFetchMode(PDO::FETCH_CLASS, 'User'); 
while ($user = $result->fetch()) {    echo $user->info()."\n";
}// MySQLI, procedural wayif ($result = mysqli_query($mysqli, $query)) {    while ($user = mysqli_fetch_object($result, 'User')) {        echo $user->info()."\n";
    }
}// MySQLi, object oriented wayif ($result = $mysqli->query($query)) {    while ($user = $result->fetch_object('User')) {        echo $user->info()."\n";
    }
}

Lorsque la valeur du paramètre de nom d'utilisateur saisie par l'utilisateur est la valeur ci-dessus ("'; DELETE FROM users; /*"), si vous ne le faites pas. Si cette valeur est traitée de quelque manière que ce soit, l'utilisateur injecte avec succès l'instruction delete et tous les enregistrements de la table utilisateur seront supprimés. 002 - Différences et choix entre PDO et MySQLi6.1. Échappement manuel

$_GET['username'] = "'; DELETE FROM users; /*"

Ce qui précède utilise les fonctions fournies avec les API PDO et MySQLi pour échapper aux valeurs de paramètres obtenues.

6.2. Liaison des paramètres d'instruction préparée

Ce qui suit est un moyen plus efficace et plus sûr de lier les paramètres d'instruction préparée :

002 - Différences et choix entre PDO et MySQLi

// PDO, "manual" escaping$username = PDO::quote($_GET['username']); 
$pdo->query("SELECT * FROM users WHERE username = $username");         
// mysqli, "manual" escaping$username = mysqli_real_escape_string($_GET['username']); 
$mysqli->query("SELECT * FROM users WHERE username = '$username'");

002 - Différences et choix entre PDO et MySQLi

7. Performances

Étant donné que PDO peut prendre en charge d'autres bases de données non MySQL et que MySQLi est spécialement conçu pour MySQL, les performances de MySQLi sont légèrement meilleures que celles de PDO. Cependant, PDO et MySQLi ne sont toujours pas aussi rapides que l'extension MySQL native de PHP. Mais ce type de comparaison de performances ne veut pas dire grand-chose, car ils sont tous assez rapides. Si les exigences de performances de votre programme ne sont pas particulièrement exigeantes, les trois peuvent vous satisfaire. Quant à savoir lequel vous souhaitez choisir, vous devez le peser en fonction de votre situation pratique.

8. Résumé

PDO prend en charge 12 types de pilotes de base de données et la liaison de paramètres nommés est son plus grand avantage. Grâce à la comparaison ci-dessus, je pense que vous savez également ce que vous utiliserez dans votre propre projet. on est connecté à la base de données ?

Recommandations associées :

001 - Analyse détaillée de l'utilisation des AOP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn