Les déclarations préparées sont un moyen important d'assurer la sécurité des données et d'améliorer l'efficacité lors de l'utilisation d'extensions MySQLI en PHP. Cet article introduira en détail l'utilisation correcte de la méthode MySQLI :: STMT_INIT et PREPEAY () , et l'analysera en combinaison avec des exemples réels.
MySQLI :: STMT_INIT est une méthode fournie par MySQLI pour initialiser un objet MySQLI_STMT (instruction) vide. Cet objet peut ensuite être utilisé pour prétraiter les instructions SQL.
La syntaxe est la suivante:
mysqli_stmt mysqli::stmt_init ( void )
Il est généralement utilisé avec la méthode Pread () pour préparer des instructions SQL.
La méthode Pread () est utilisée pour préparer une instruction SQL qui sera exécutée ultérieurement et peut être liée à l'aide du paramètre. Cela peut effectivement empêcher les attaques d'injection SQL.
La syntaxe est la suivante:
bool mysqli_stmt::prepare ( string $query )
Voici le processus standard à l'aide de mysqli :: stmt_init et prépare () :
Connectez-vous à la base de données
Initialiser l'objet de déclaration de prétraitement
Préparez la déclaration en utilisant PREPEPT ()
Lier les paramètres (le cas échéant)
Instruction d'exécution
Obtenez le résultat (s'il s'agit d'une déclaration de requête)
Clôtures et connexions étroites
Supposons que nous ayons une table d' utilisateurs utilisateurs avec des champs: id , nom d'utilisateur , e-mail . Nous voulons interroger l'adresse e-mail de l'utilisateur en fonction du nom d'utilisateur.
<?php
// premier pas:Établir une connexion de base de données
$mysqli = new mysqli("localhost", "db_user", "db_password", "db_name");
// Vérifiez si la connexion réussit
if ($mysqli->connect_error) {
die("Échec de la connexion: " . $mysqli->connect_error);
}
// Étape 2:Initialiser l'objet de déclaration de prétraitement
$stmt = $mysqli->stmt_init();
// Étape 3:Préparer SQL Déclaration
$sql = "SELECT email FROM users WHERE username = ?";
if (!$stmt->prepare($sql)) {
die("SQL Le prétraitement a échoué: " . $stmt->error);
}
// Étape 4:Lier les paramètres
$username = "testuser";
$stmt->bind_param("s", $username); // "s" Représente le type de chaîne
// Étape 5:执行Déclaration
$stmt->execute();
// Étape 6:Liez les résultats et obtenez les données
$stmt->bind_result($email);
if ($stmt->fetch()) {
echo "E-mail de l'utilisateur est: " . $email;
} else {
echo "Cet utilisateur n'a pas été trouvé。";
}
// Étape 7:关闭Déclaration与连接
$stmt->close();
$mysqli->close();
?>
Bien que SQL puisse être exécuté directement à l'aide de la méthode Query () , cela est vulnérable aux attaques d'injection SQL. La liaison prépare () et le paramètre peuvent effectivement empêcher ce problème.
STMT_INIT () crée un objet d'instruction vide et prépare () charge le modèle SQL. Vous pouvez également ignorer STMT_INIT () et appeler directement $ mysqli-> prépare () pour terminer l'initialisation et la préparation en une seule étape.
Oui, tant que la structure du modèle SQL est cohérente, l'objet instruction peut être réutilisé et que les paramètres liés peuvent être modifiés.
L'exemple suivant montre comment soumettre des données via un formulaire et l'insérer en toute sécurité dans la base de données:
<?php
$mysqli = new mysqli("localhost", "db_user", "db_password", "db_name");
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST["username"] ?? "";
$email = $_POST["email"] ?? "";
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {
$stmt->bind_param("ss", $username, $email);
if ($stmt->execute()) {
echo "Enregistrement des utilisateurs avec succès!";
} else {
echo "L'exécution a échoué:" . $stmt->error;
}
$stmt->close();
}
}
$mysqli->close();
?>
<form method="POST" action="https://m66.net/register.php">
nom d'utilisateur:<input type="text" name="username" required><br>
Mail:<input type="email" name="email" required><br>
<input type="submit" value="registre">
</form>
La combinaison de mysqli :: stmt_init et prépare () fournit un puissant mécanisme de sécurité de la base de données pour PHP. La liaison des paramètres empêche non seulement l'injection de SQL, mais améliore également l'efficacité de l'exécution. Dans le développement réel, il est recommandé d'utiliser toujours des instructions de prétraitement pour faire fonctionner la base de données.
Vous voulez continuer à en savoir plus sur l'utilisation avancée de bind_param () et bind_result () dans mysqli?