Maison >développement back-end >Problème PHP >Introduction détaillée aux instructions de prétraitement pour l'exploitation des bases de données en PHP (avec code)

Introduction détaillée aux instructions de prétraitement pour l'exploitation des bases de données en PHP (avec code)

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-06-17 17:19:232684parcourir

Cet article vous donnera une introduction détaillée aux instructions préparées pour faire fonctionner des bases de données en PHP (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Introduction détaillée aux instructions de prétraitement pour l'exploitation des bases de données en PHP (avec code)

Instructions de prétraitement pour l'exploitation des bases de données en PHP

Le contenu de l'article d'aujourd'hui est en fait très basique, mais dans le développement moderne, tout le monde utilise des frameworks, et peu de personnes encapsulent ou écrivent souvent elles-mêmes le code de fonctionnement de la base de données sous-jacente. Cette fois, nous examinerons donc le contenu des instructions préparées dans les extensions associées de la base de données.

Que sont les déclarations préparées ?

Une instruction préparée peut être considérée comme un modèle compilé de l'instruction SQL que vous souhaitez exécuter, qui peut être contrôlée à l'aide de paramètres variables. Les instructions préparées peuvent apporter deux avantages majeurs :

  • Les requêtes ne doivent être analysées (ou prétraitées) qu'une seule fois, mais peuvent être exécutées plusieurs fois avec des paramètres identiques ou différents. Lorsqu'une requête est prête, la base de données analyse, compile et optimise le plan d'exécution de la requête. Ce processus prend plus de temps pour les requêtes complexes et peut ralentir considérablement votre application si la même requête doit être répétée plusieurs fois avec des paramètres différents. En utilisant des instructions préparées, vous pouvez éviter les cycles répétés d’analyse/compilation/optimisation. En termes simples, les instructions préparées utilisent moins de ressources et s'exécutent donc plus rapidement.

  • Les paramètres fournis aux relevés préparés n'ont pas besoin d'être mis entre guillemets, le conducteur les gérera automatiquement. Si votre application utilise uniquement des instructions préparées, vous pouvez être sûr qu'aucune injection SQL ne se produira. (Cependant, si d'autres parties de la requête sont construites à partir d'entrées non échappées, il existe toujours un risque d'injection SQL).

Le contenu ci-dessus est extrait de la documentation officielle, mais en fait, l'avantage le plus intuitif que nous apportent les instructions préparées est qu'elles peuvent empêcher efficacement l'injection SQL. Concernant le contenu de l'injection SQL, nous l'étudierons en profondeur lors de l'apprentissage de MySQL à l'avenir, donc je ne le présenterai pas trop ici. Quoi qu'il en soit, les instructions préparées peuvent compléter ce travail.

Instructions préparées pour les opérations PDO

Parmi les extensions PHP, PDO est déjà la bibliothèque d'extensions de base de données principale principale, et naturellement, elle dispose également d'un support très complet pour les instructions préparées de.

$pdo = new PDO('mysql:host=localhost;port=3306;dbname=blog_test', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// :xxx 占位符
$stmt = $pdo->prepare("insert into zyblog_test_user (username, password, salt) values (:username, :password, :salt)");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->bindParam(':salt', $salt);

$username = 'one';
$password = '123123';
$salt = 'aaa';
$stmt->execute();

$username = 'two';
$password = '123123';
$salt = 'bbb';
$stmt->execute();

Dans le code, nous utilisons la méthode prepare() pour définir des instructions préparées, qui renvoient un objet PDOStatement. Utilisez des symboles d'espace réservé comme :xxx dans les instructions préparées et liez les variables à ces espaces réservés en externe à l'aide de la méthode bindParam() de l'objet PDOStatement. Enfin, execute() est utilisé pour exécuter réellement l'instruction SQL.

À partir de ce code, nous pouvons voir les deux avantages majeurs des déclarations préparées. Le premier concerne les espaces réservés. Après avoir utilisé des espaces réservés, nous n'avons pas besoin d'écrire des guillemets simples dans les instructions SQL. Les guillemets simples sont souvent la principale source de vulnérabilités d'injection SQL. La méthode bindParam() convertit automatiquement le type de données liées. Bien entendu, la méthode bindParam() peut également spécifier le type de données lié dans les paramètres facultatifs, ce qui peut rendre notre code plus sûr. Vous pouvez consulter les documents concernés.

Un autre avantage est la capacité des modèles. Nous ne définissons qu'un seul objet PDOStatement, puis en modifiant le contenu des données, nous pouvons utiliser la méthode execute() plusieurs fois pour exécuter l'instruction préparée.

Il existe une autre façon d'écrire des espaces réservés, qui consiste à utiliser un point d'interrogation comme symbole d'espace réservé. Dans ce cas, le nom de clé de la méthode bindParam() utilisera un indice numérique. Il convient de noter ici que les indices numériques commencent à 1.

// ? 占位符
$stmt = $pdo->prepare("insert into zyblog_test_user (username, password, salt) values (?, ?, ?)");
$stmt->bindParam(1, $username);
$stmt->bindParam(2, $password);
$stmt->bindParam(3, $salt);

$username = 'three';
$password = '123123';
$salt = 'ccc';
$stmt->execute();

Dans notre requête, nous pouvons également facilement utiliser la fonction d'instructions préparées pour interroger des données. Ici, nous utilisons execute() directement pour transmettre les paramètres de l'espace réservé.

// 查询获取数据
$stmt = $pdo->prepare("select * from zyblog_test_user where username = :username");

$stmt->execute(['username'=>'one']);

while($row = $stmt->fetch()){
    print_r($row);
}

Déclarations préparées pour l'opération mysqli

Bien que le courant dominant soit PDO et que la plupart des frameworks utilisent PDO, nous écrivons des scripts ou devons tester rapidement En ce qui concerne certaines fonctions, J'utilise toujours MySQLi pour développer rapidement. Bien entendu, mysqli prend également en charge les fonctions liées aux instructions préparées.

// mysqli 预处理
$conn = new mysqli('127.0.0.1', 'root', '', 'blog_test');
$username = 'one';
$stmt = $conn->prepare("select username from zyblog_test_user where username = ?");
$stmt->bind_param("s", $username);

$stmt->execute();

echo $stmt->bind_result($unames);

var_dump($unames);

while ($stmt->fetch()) {
    printf("%s\n", $unames);
}

On peut voir qu'en plus des différents noms de méthode de mysqli, les noms de clé des paramètres de liaison ne sont pas exactement les mêmes. Ici, nous utilisons l'espace réservé au point d'interrogation dans la méthode bind_param(), s est utilisé Pour indiquer la position du symbole, s'il y a plusieurs paramètres, il doit être écrit comme sss... comme ceci.

Résumé

La capacité des déclarations préparées a été encapsulée pour nous dans le cadre actuel. En fait, nous n'avons pas besoin de trop nous en soucier, tout comme l'utilisation. dans Laravel Lorsque DB::select() effectue des opérations de base de données, nous pouvons voir l'application des instructions préparées.
Vous pouvez vérifier la méthode select() dans supplier/laravel/framework/src/Illuminate/Database/Connection.php.

Code de test :

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E9%A2%84%E5%A4%84%E7%90%86%E8%AF%AD%E5%8F%A5.php

Apprentissage recommandé : Tutoriel vidéo php

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer