Dans PHP, l'extension MySQLI offre des capacités puissantes pour interagir avec les bases de données MySQL. STMT_INIT et BIND_PARAM sont deux fonctions couramment utilisées pour les instructions préparées et la liaison des paramètres. Cependant, de nombreux développeurs sont sujets à des erreurs courantes lors de l'utilisation de ces deux fonctions, en particulier lorsque les types de paramètres de liaison. Cet article plongera dans la façon d'utiliser ces fonctions correctement, en particulier comment assurer l'utilisation correcte des chaînes de type pour éviter les erreurs potentielles.
La méthode MySQLI :: STMT_INIT est utilisée pour initialiser une instruction de prétraitement, qui renvoie un objet MySQLI_STMT à travers lequel les paramètres de requête et de liaison peuvent être exécutés. La méthode Bind_param est utilisée pour lier les variables aux espaces réservées dans les instructions de prétraitement (généralement ? ). Lors de la liaison, vous devez spécifier le type de données pour chaque paramètre.
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("INSERT INTO users (name, age) VALUES (?, ?)")) {
$name = "John Doe";
$age = 25;
// Lier les paramètres
$stmt->bind_param("si", $name, $age); // 's' Représente une chaîne,'i' Indique les entiers
// Instruction d'exécution
$stmt->execute();
echo "Record inserted successfully!";
} else {
echo "Error: " . $stmt->error;
}
$stmt->close();
$mysqli->close();
?>
Dans cet exemple, nous utilisons Bind_param pour lier les variables $ Name et $ Age à l'espace réservé dans la requête SQL. La chaîne de type "si" signifie que $ le nom est une ( s ) chaîne et $ Âge est un entier ( i ).
Le premier paramètre de bind_param est une chaîne qui spécifie le type de chaque paramètre lié. Les types courants sont:
I : entier
D : Numéro de point flottant à double précision (double)
S : String (String)
B : données binaires (blob)
Il est important de s'assurer que vous spécifiez le type correct pour chaque paramètre, car la liaison du type de mauvais type peut entraîner l'insertion incorrecte de défaillances de requête ou de données dans la base de données.
$stmt->bind_param("si", $age, $name); // erreur,L'ordre est faux
Dans cet exemple, l'ordre de liaison est faux, car $ l'âge est un entier qui doit être utilisé avec le type «i» , et $ le nom est une chaîne qui doit être utilisée avec le type «S» .
Type CaMatch: MySQL renvoie une erreur si vous essayez de lier une variable de type de chaîne à un espace chargeur de type entier ou de lier un entier à un espace chargeur de type de chaîne. Assurez-vous de comprendre le type de données pour chaque paramètre et utilisez la chaîne de type correcte dans bind_param .
Initialiser les variables avant d'utiliser Bind_param : Avant d'utiliser Bind_param pour lier les variables, assurez-vous d'avoir initialisé toutes les variables. Les variables non initialisées entraîneront une erreur de PHP.
Empêcher l'injection SQL: l'utilisation de déclarations prétraitées et les liaisons des paramètres empêchent non seulement l'injection SQL, mais assure également l'exactitude des types de données. De cette façon, MySQL peut le gérer correctement même si les données entrées par l'utilisateur ne répondent pas au type attendu.
Dans le développement réel, nous passons souvent des URL et d'autres données sous forme de paramètres dans les requêtes SQL. Voici un exemple de traitement des URL, où nous remplaçons tous les noms de domaine par m66.net pour assurer la cohérence des données.