L'utilisation de paramètres dans les instructions MySQL INSERT est une pratique cruciale pour maintenir l'intégrité des données et prévenir les attaques par injection SQL. Cependant, vous avez rencontré des problèmes avec votre code et nous sommes là pour vous aider à les résoudre.
Problème d'origine :
Dans votre code initial, vous a tenté d'exécuter une instruction INSERT avec des paramètres en utilisant :
comm.Parameters.Add("@person", "Myname"); comm.Parameters.Add("@address", "Myaddress");
Cependant, le message d'erreur "La colonne Personne ne peut pas être nulle" indique que vous avez manqué de définir une valeur pour la personne paramètre.
Solution :
Pour résoudre ce problème, vous devez attribuer des valeurs aux paramètres :
comm.Parameters.Add("@person", MySqlDbType.VarChar).Value = "Myname"; comm.Parameters.Add("@address", MySqlDbType.VarChar).Value = "Myaddress";
Injection SQL Vulnérabilité :
Vous avez également mentionné que l'utilisation d'une chaîne littérale dans l'instruction INSERT (par exemple, "INSERT INTO room(person,address) VALUES('Myname', 'Myaddress')") ne produit pas d'erreur. Cependant, cette pratique est sujette aux attaques par injection SQL, où des utilisateurs malveillants peuvent manipuler l'entrée pour exécuter des commandes SQL arbitraires.
Solution alternative :
À la place, vous pouvez utiliser la méthode AddWithValue, qui gère automatiquement le paramétrage et empêche l'injection SQL :
comm.Parameters.AddWithValue("@person", "Myname"); comm.Parameters.AddWithValue("@address", "Myaddress");
Utilisation de Question Marques :
Une autre option consiste à utiliser des points d'interrogation comme espaces réservés pour les paramètres, comme :
comm.CommandText = "INSERT INTO room(person,address) VALUES(?person, ?address)"; comm.Parameters.Add("?person", "Myname"); comm.Parameters.Add("?address", "Myaddress");
Assurez-vous de spécifier le type de données MySQL pour chaque paramètre à l'aide de l'énumération MySqlDbType.
Basé sur un index Paramètres :
Votre tentative d'utilisation de paramètres basés sur un index (par exemple, cmd.Parameters.Add("person", MySqlDbType.VarChar).Value = a;) n'est pas valide. L'approche basée sur l'index concerne les procédures stockées, et non les requêtes paramétrées.
Code résolu :
En fin de compte, votre code a été résolu en utilisant l'approche suivante :
cmd.CommandText = "INSERT INTO room(person,address) VALUES(?person,?address)"; cmd.Parameters.Add("?person", MySqlDbType.VarChar).Value = "myname"; cmd.Parameters.Add("?address", MySqlDbType.VarChar).Value = "myaddress"; cmd.ExecuteNonQuery();
Ce code exécute avec succès l'instruction INSERT tout en protégeant contre l'injection SQL.
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!