Empêcher la duplication des enregistrements à une table à l'aide de PHP
Je veux éviter des doublons dans une table de base de données à partir d'un formulaire à l'aide de PHP.
J'ai créé le suivant:
Une base de données avec une table nommée clients:
CREATE TABLE clients(
firstName varchar(20),
lastName varchar(20),
primary key(firstName, lastName));
Un simple formulaire nommé form.html
<h2>Enter your First and Last Name</h2>
<form action="frm_script.php" method="post">
<p><strong>First Name:</strong><br /> <input type="text" name="firstName" /></p>
<p><strong>Last Name:</strong><br /> <input type="text" name="lastName"/></p>
<input type="submit" name="submit" value="Add Customer" />
</form>
Une forme de traitement de script nommé frm_script.php
<?php
if(isset($_POST['submit']))
{
//get the name and comment entered by user
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
//connect to the database
$dbc = mysqli_connect('host', 'username', 'password', 'dbname') or die('Error connecting to MySQL server');
//insert results from the form input
$query = "INSERT IGNORE INTO clients(firstName, lastName) VALUES('$firstName', '$lastName')";
$result = mysqli_query($dbc, $query) or die('Error querying database.');
mysqli_close($dbc);
}
echo "Customer Added";
?>
Jusqu'à présent avec mon frm_script.php fichier les travaux ci-dessus et pour un unique enregistrement s'affiche à la clientèle ajouté. Cependant, pour un enregistrement en double il jette "Erreur de l'Interrogation de la Base de données".
Comment puis-je mettre à jour le frm_script.php script pour la suite?
Si une ligne en double est trouvé à l'entrée dans un Premier /Dernier combinaison de nom, il doit afficher le message "Client déjà répertorié" avec cet enregistrement.
Si aucun doublon ligne est trouvée en entrant dans un Premier /Dernier nom sur la combinaison de la forme, il faut insérer l'entrée de la base de données et affiche le message "client ajoutée"
J'ai lu qu'une sélection doit être exécuté en premier, puis un INSERT mais je ne suis pas sûr de savoir comment mettre en œuvre ce dans mon code existant.
die('Error querying database.')
avec die(mysqli_error($dbc));
firstName='); DROP TABLE clients; --
. Bye Bye les clients.Bonjour Amal, j'aime votre solution. Une bonne manière de voir une double entrée est à l'origine d'un problème avec l'insertion de l'enregistrement.
OriginalL'auteur Andy R | 2013-10-31
Vous devez vous connecter pour publier un commentaire.
seulement de vérifier les lignes de votre db pour firstname et lastname s'il en existe un écho de votre message d'ailleurs
insérez
maintenant, à voir si ça fonctionne
Salut Sai, merci pour le post de mise à jour. J'ai essayé le script de mise à jour, mais encore des messages d'erreurs. J'ai fait quelques changements: 1 - la concaténation et 2 - si/d'autre supports. La première partie fonctionne pas de problèmes et de nouveaux clients sont ajoutés à la base de données avec le bon message de sortie. La deuxième partie montre maintenant les deux messages de la si/d'autre "Client existe déjà" et le "Client ajoutée" ensemble. J'ai édité le post ci-dessus - j'espère que vous pourriez voir le problème. Merci encore, Andy 😉
Salut Sai, mon mauvais - c'était le travail. Merci pour le travail / en me montrant le script.
grand!!!!!!!!!!!
OriginalL'auteur Sudheer
Depuis votre clé primaire est (prénom, nom), vous n'avez pas besoin de php pour empêcher l'insertion de doublons. Mysql n'est que pour vous, parce que les clés primaires doivent être uniques.
(si c'était pas votre clé primaire, vous pouvez utiliser une contrainte unique)
Pour afficher votre message d'erreur "Client déjà répertorié" sur les entrées en double, vous pouvez utiliser
mysqli_errno($dbc)
et vérifiez le code d'erreur1062
.Solution rapide qui devrait faire ce que vous voulez: remplacer
or die('Error querying database.');
avecor die(mysqli_errno($dbc) == 1062 ? "Client already listed" : 'Error querying database.');
OriginalL'auteur sofa
Après le traitement de la
$_POST
de données, l'utilisation d'unSELECT
requête suivie par unif
instruction pour vérifier s'il y a des lignes dans la table avec le même prénom et nom que le$_POST
les nom et prénom des données.Si il y est, l'affichage d'un message de données a déjà été inséré.
Si il n'est pas le cas, utilisez un
INSERT
requête pour ajouter les données à la table de base de données, et afficher un message indiquant que ces données ont été ajoutées à la table.OriginalL'auteur Charles
J'ai ce problème tout le temps. Je suis allé de l'aide d'un auto-incrémenté primaire à l'aide d'un hash md5, la plupart du temps. Ainsi, alors que je n'ai pas mis en œuvre cette moi-même encore - pas de possibilité/nécessité actuellement - vous pouvez faire créer une clé primaire (VARCHAR 32) qui est un hachage md5 du nom et prénom. Comme ceci:
Faire la colonne de cette clé va dans te de clé primaire. Ensuite, vous utilisez un
INSERT IGNORE
et vous pouvez ignorer les erreurs.Ensuite, vous exécutez une
SELECT
sur la touche € pour revenir tout ce qui a trait à$key
et l'affichage de toutes les infos que vous avez sur l'utilisateur dans un format convivial. Vous n'avez pas à montrer à l'utilisateur un message d'erreur à ce point, il suffit de leur fournir les informations déjà saisies. Si vous êtes inquiet au sujet des utilisateurs avec le même nom en voyant des uns et des autres données les données peuvent être obscurci. Par exemple, au lieu d'afficher un numéro de téléphone (333) 444-5555 vous montrer (333) 444-5*5 ou (333) **-5555. Quelque chose qui donne à l'utilisateur suffisamment d'informations pour savoir si c'est eux ou quelqu'un d'autre avec le même nom.Souvent, j'ai utilisé le
SELECT
, si videINSERT
etSELECT
encore une fois, la méthode. Et cela fonctionne, mais il est nettement plus lent qu'un simpleINSERT IGNORE
et puisSELECT
. J'utilise un DAO j'ai construit sur les AOP et lesINSERT IGNORE
fonctionne très bien lorsqu'une seule colonne est la clé primaire. Je ne l'ai pas essayé sur une clé primaire, fondée sur plus de 1 colonne et je n'ai pas essayé avec le mysqli_* fonction.pas de problème. Quand j'ai écrit cela, je ne pense pas que j'en aurais besoin, mais je suis dans le milieu de ça maintenant. Par exemple, je suis à la capture de l'ensemble de mes campagnes AdWords et leur statut (en Pause, Active, etc). Bien généralement, je mettrais toutes les campagnes dans une table, par les statuts à un autre, et puis créer un lien de table - camp2stat. Cependant, la situation peut changer au fil du temps et j'aimerais magasin quand elle a changé. Donc, j'ai maintenant une table de lien avec une date qui n'est pas juste l'ID de la campagne et de l'ID de l'état. Cependant, je ne veux pas stocker le statut de tous les jours, juste quand ils changent...
OriginalL'auteur Gabe Spradlin