Les instructions de prétraitement sont un moyen d'exécution des requêtes SQL. Il divise les requêtes SQL en deux parties:
Étape de prétraitement : Envoyez le modèle de l'instruction SQL à la base de données, et la base de données analyse et compile l'instruction SQL, mais n'exécute pas la requête. À l'heure actuelle, la partie variable de la requête (comme ce que l'entrée utilisateur) n'est pas immédiatement insérée dans le SQL, mais est représentée comme un espace réservé (généralement ? ).
Phase d'exécution : Pendant l'exécution, la valeur du paramètre réel est tenue de remplacer l'espace réservé et la base de données exécute l'instruction.
L'avantage de cette approche est que la base de données peut préparer les requêtes à l'avance et vérifier en toute sécurité les paramètres de chaque requête, évitant ainsi le risque d'injection SQL.
Dans PHP, nous exploitons la base de données MySQL via l'extension MySQLI , et MySQLI_STMT :: __ Construct est un constructeur de la classe MySQLI_STMT , utilisé pour créer une instruction de prétraitement.
Présentation des étapes:
Établir une connexion de base de données : Tout d'abord, vous devez utiliser MySQLI_Connect ou New MySQLI () pour créer une connexion de base de données.
Préparer les instructions SQL : définir les instructions SQL avec les espaces réservés.
Initialiser les instructions de prétraitement : Créez des instructions de prétraitement à l'aide de MySQLI_PREPARE ou MYSQLI_STMT :: __ Construct .
Paramètres de liaison : utilisez la méthode Bind_param pour lier les valeurs variables aux espaces réservés dans les instructions de prétraitement.
Instruction d'exécution : utilisez la méthode EXECUTE pour exécuter l'instruction de prétraitement.
Supposons que nous souhaitions insérer des données utilisateur dans une table utilisateur, y compris le nom, le courrier électronique et l'âge, nous utilisons MySQLI_STMT :: __ Construire pour créer une instruction de prétraitement. Voici un exemple de code spécifique:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 1. Créer une connexion de base de données</span></span><span>
</span><span><span class="hljs-variable">$servername</span></span><span> = </span><span><span class="hljs-string">"localhost"</span></span><span>;
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">"root"</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$dbname</span></span><span> = </span><span><span class="hljs-string">"test"</span></span><span>;
</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$servername</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);
</span><span><span class="hljs-comment">// Vérifiez la connexion</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// 2. Définir l'espace réservé SQL Déclaration</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name, email, age) VALUES (?, ?, ?)"</span></span><span>;
</span><span><span class="hljs-comment">// 3. 创建预处理Déclaration</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-comment">// Vérifiez si le prétraitement réussit</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Error preparing statement: '</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->error);
}
</span><span><span class="hljs-comment">// 4. Lier les paramètres</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John Doe"</span></span><span>;
</span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-string">"[email protected]"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>;
</span><span><span class="hljs-comment">// "sss" Le type variable qui représente la limite,Correspondant aux chaînes、Chaîne、Entier</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"ssi"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);
</span><span><span class="hljs-comment">// 5. 执行预处理Déclaration</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"New record created successfully"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error;
}
</span><span><span class="hljs-comment">// 关闭Déclaration和连接</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Créez une connexion de base de données : utilisez la nouvelle méthode MySQLI () pour vous connecter à la base de données. Si la connexion échoue, le programme s'arrête et affiche un message d'erreur.
Instruction SQL : Définissez une instruction SQL avec des espaces réservés Insérer dans les utilisateurs (nom, e-mail, âge) Valeurs (?,?) . Voici l'espace réservé, ce qui signifie que nous insérons dynamiquement des données par les étapes suivantes.
Préparez-vous : créez une instruction de prétraitement via la méthode $ Conn-> Préparer ($ SQL) . Si la création échoue, un message d'erreur sera sorti.
Paramètres de liaison : la méthode $ stmt-> bind_param ("SSI", $ name, $ e-mail, $ Âge) lie les variables $ nom , $ e-mail et $ Age à la ? Payholder dans l'instruction SQL. "SSI" représente le type de données du paramètre, S est une chaîne, et I est un entier.
Exécuter Instruction : Exécutez des instructions de prétraitement via $ stmt-> execute () . Si l'exécution est réussie, le message de réussite sera renvoyé, sinon une erreur sera sortie.
Fermer la ressource : après l'exécution, vous devez fermer l'instruction de prétraitement et la connexion de la base de données pour libérer la ressource.
Empêcher l'injection SQL : en utilisant des espaces réservés au lieu d'épisser directement les instructions SQL, les utilisateurs malveillants peuvent effectivement prévenir les attaques d'injection SQL en entrant des caractères spéciaux.
Améliorez les performances : si vous exécutez plusieurs fois la même requête (comme l'insertion par lots de données), l'utilisation d'instructions de prétraitement est beaucoup plus efficace que de remettre à chaque fois les instructions SQL.
Code plus clair : l'utilisation d'instructions de prétraitement peut rendre la structure du code plus claire, en particulier lorsqu'elle implique la saisie de l'utilisateur et les requêtes multiples, en réduisant le risque d'erreurs d'épissage SQL.
Étiquettes associées:
mysqli_stmt