Déclarations préparées PHP MySQL

Les

Les déclarations préparées sont très utiles pour empêcher l'injection MySQL. L'

Injection SQL consiste à insérer des commandes SQL dans les soumissions de formulaires Web ou à saisir des chaînes de requête pour les noms de domaine ou les demandes de pages, incitant finalement le serveur à exécuter des commandes SQL malveillantes.


Instructions préparées et paramètres liés

Les instructions préparées sont utilisées pour exécuter plusieurs instructions SQL identiques avec une efficacité d'exécution élevée.

Le principe de fonctionnement des instructions préparées est le suivant :

1. Prétraitement : créez un modèle d'instruction SQL et envoyez-le à la base de données. Les valeurs réservées sont marquées du paramètre "?". Par exemple :

INSÉRER INTO MyGuests (prénom, nom, email) VALEURS(?, ?, ?)

2. Base de données Analysez, compilez, optimisez les requêtes sur les modèles d'instructions SQL et stockez les résultats sans les afficher. L'application peut exécuter l'instruction plusieurs fois si les valeurs des paramètres sont différentes.

3. Exécution : Enfin, transmettez la valeur liée à l'application au paramètre (marque "?") et la base de données exécute l'instruction.

Par rapport à l'exécution directe d'instructions SQL, les instructions préparées présentent deux avantages principaux

· L'instruction préparée réduit considérablement le temps d'analyse et une seule requête est effectuée (bien que l'instruction soit exécutée plusieurs fois).

· Les paramètres de liaison réduisent la bande passante du serveur, il vous suffit d'envoyer les paramètres de la requête au lieu de l'intégralité de l'instruction.

· Les instructions préparées sont très utiles pour l'injection SQL, car différents protocoles sont utilisés après l'envoi des valeurs des paramètres, garantissant la légalité des données.


MySQLi a préparé des déclarations

suite à The L'exemple utilise des instructions préparées dans MySQLi et lie les paramètres correspondants :

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $servername = "localhost";
 $username = "root";
 $password = "root";
 $dbname = "test";
 
 // 创建连接
 $conn = new mysqli($servername, $username, $password, $dbname);
 
 // 检测连接
 if ($conn->connect_error) {
     die("连接失败: " . $conn->connect_error);
 }
 
 // 预处理及绑定
 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
 $stmt->bind_param("sss", $firstname, $lastname, $email);
 
 // 设置参数并执行
 $firstname = "John";
 $lastname = "Doe";
 $email = "john@example.com";
 $stmt->execute();
 
 $firstname = "Mary";
 $lastname = "Moe";
 $email = "mary@example.com";
 $stmt->execute();
 
 $firstname = "Julie";
 $lastname = "Dooley";
 $email = "julie@example.com";
 $stmt->execute();
 
 echo "新记录插入成功";
 
 $stmt->close();
 $conn->close();
 ?>

Analysez chaque ligne de code dans l'exemple suivant :

"INSERT INTO MyGuests (prénom, nom, email) VALEURS(?, ?, ?)"

Dans l'instruction SQL, on utilise le point d'interrogation (?), ici on peut remplacer les points d'interrogation par des entiers , chaînes, doubles et booléens.

Ensuite, jetons un coup d'œil à la fonction bind_param() :

$stmt->bind_param("sss", $firstname, $lastname, $email );

Cette fonction lie les paramètres SQL et indique à la base de données la valeur des paramètres. La colonne de paramètres "sss" gère les types de données des paramètres restants. Il y en a plusieurs (?) ci-dessus et plusieurs types de données ci-dessous. Le caractère s indique à la base de données que le paramètre est une chaîne.

Les paramètres ont les quatre types suivants :

· i - entier (type entier)

· d - double (type à virgule flottante double précision)

· s - string (string)

· b - BLOB (grand objet binaire : grand objet binaire)

Chaque paramètre doit spécifier le type.

Comment spécifier le type de données a été introduit dans la section précédente

En indiquant à la base de données le type de données du paramètre, le risque d'injection SQL peut être réduit.

Le résultat de l'exécution du code ci-dessus :

Nouvel enregistrement inséré avec succès

Vérifiez si vos données sont là Insertion réussi?


Exemple

Insérons les données du formulaire dans la base de données

D'abord Une page HTML

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>PHP中文网</title>
 </head>
 <body>
 
 <form action="insert.php" method="post">
     Firstname: <input type="text" name="firstname" /><br/>
     Lastname: <input type="text" name="lastname" /><br/>
     email: <input type="text" name="email" /><br/>
     <input type="submit" />
 </form>
 </body>
 </html>

est soumise à la page PHP

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $servername = "localhost";
 $username = "root";
 $password = "root";
 $dbname = "test";
 
 // 创建连接
 $conn = new mysqli($servername, $username, $password, $dbname);
 
 // 检测连接
 if ($conn->connect_error) {
     die("连接失败: " . $conn->connect_error);
 }
 
 // 预处理及绑定
 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
 $stmt->bind_param("sss", $firstname, $lastname, $email);
 
 // 设置参数并执行
 $firstname = $_POST['firstname'];
 $lastname =$_POST['lastname'];
 $email = $_POST['email'];
 $stmt->execute();
 
 echo "新记录插入成功";
 
 $stmt->close();
 $conn->close();
 ?>

Grâce aux deux programmes ci-dessus, les données de notre formulaire peuvent être insérées dans la base de données


Formation continue
||
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $servername = "localhost"; $username = "root"; $password = "root"; $dbname = "test"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 预处理及绑定 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // 设置参数并执行 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "新记录插入成功"; $stmt->close(); $conn->close(); ?>
soumettreRéinitialiser le code
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!