Gestion de doublons dans base de données MySQL

aissam92 Messages postés 2 Date d'inscription vendredi 20 mars 2009 Statut Membre Dernière intervention 30 mars 2009 - 23 mars 2009 à 12:20
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011 - 23 mars 2009 à 12:38
Bonjour,

Je possède une base de données dans laquelle on retrouve un table nommée sites_image. Dans cette table j'ai 3 champs: 'id', 'Site' et 'image'.
J'ai besoin de mettre à jour les enregistrements de cette table régulièrement (les données sont extraites d'un fichier Excel).
Malheuresement le code que j'utilise actuellement ne gère pas les doublons.

Je m'explique:

Supposons que j'ai dans ma base de données 1 enregistrement possédant comme valeurs: id= 1, site=A1000, image=3
Quand j'exécute mon fichier .php, ce dernier va quand même rajouter une ligne même si celle-ci possède les mêmes valeurs que celle déjà existante dans la table.
Au final ça donne 2 enregistrements identiques:

id=1, site=A1000, image=3
id=2, site=A1000, image=3

J'ai tenté d'utiliser 2 requêtes successives, la première vide la table et la deuxième la remplit à nouveau (étant débutant, je ne pense pas que cette méthode soit la meilleure à utiliser)
Le problème c'est que la table est bien vidée mais seulement la dernière ligne du fichier Excel est rajoutée et as tous les enregistrements.

Avez vous une requête qui permet de contrôler les doublons???

J'espère que j'ai bien exposé mon problème.

Voilà le code source de mon fichier .php

Bas de page

<?php
// importation
while (!feof($fp))
{
$ligne = fgets($fp,4096);
// on crée un tableau des élements séparés par des points virgule
$liste = explode(";",$ligne);
// premier élément
$liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
$liste[1] = ( isset($liste[1]) ) ? $liste[1] : Null;
$liste[2] = ( isset($liste[2]) ) ? $liste[2] : Null;

$champs1=$liste[0];
$champs2=$liste[1];
$champs3=$liste[2];

// pour eviter qu un champs "nom" du fichier soit vide
if ($champs1!='')
{
// nouvel ajout, compteur incrémenté
$cpt++;
// requete et insertion ligne par ligne
// champs1 id en general dc on affecte pas de valeur
// Pour supprimer tous les enregistrements avant d'en rajouter d'autres
// Le problème rencontrée c'est que lorsque la table est vidée, seulement la dernière ligne est ajoutée
//$query2= "DELETE FROM Site_image";
$query = "INSERT INTO Site_image (id,Site,Poids_Image) VALUES('','$champs1','$champs2')";
//$result2= mysql_query($query2);
$result= mysql_query($query);
if (mysql_error())
{
???> ERREUR DE REQUETE SUR LA BASE.

<?php
fclose($fp);
exit();
}
else
{
???><?php echo $liste[0];???>, <?php echo $liste[1];???>
<?php
}
}
}
// fermeture du fichier
fclose($fp);
//on supprime la derniere car elle est vide
$sql =mysql_query("DELETE FROM Site_image WHERE $champs1=''");

//==================
// FIN
//==================*/
???>

<?php echo $cpt;???> valeurs ajoutées dans la table.

Haut de page

1 réponse

Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
23 mars 2009 à 12:38
Il faut que tu fasse une requete qui calcul le nombre de ligne contenant deja la reference site = A1000, ainsi si le nombre de ligne est superieur a 0 cela signifie qu'il existe deja un enregistrement.

exemple :

$select = "SELECT * FROM sites_image WHERE site=A1000"; // Construction de la requete

$queryCheck = mysql_query($select, $connect); // Envoi de la requete

$check = mysql_num_rows($queryCheck); // calcul du nombre d'enregistrement de notre requete

if($check!=0){ // si nombre d'enregistrements different de 0

   // il y a au moins un enregistrement donc je met le code de redirection par exemple

} else { // sinon

  // il n'y a aucun enregistrement donc je met le code de traitement suivant.

}

A+
0
Rejoignez-nous