effacer plusieurs lignes ayant la même valeur de référence

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : effacer plusieurs lignes ayant la même valeur de référence

par new morning » 28 mars 2009, 12:14

C'est vrai que c'est pas clair tout ça :shock: : le matin on y voit mieux !

En gros je voulais attribuer la même valeur à plusieurs clefs, donc ça pouvait pas marcher :? ...

J'ai donc bien progressé, mais but un peu sur le problème de départ : au début de mon code je compte mes doublons avec la requête :

Code : Tout sélectionner

SELECT nom count( * ) FROM users GROUP BY nom HAVING COUNT( * ) >1 LIMIT 0 , 30
Au cour de mon code, je supprime certaines lignes de cette table, en m'appuyant sur leur 'id', y compris les doublons repérés par cette requette.

Je compte les suppressions au fur et à mesure du code, au moyen d'un compteur
 $compteur -- ;
Ce que je n'arrive pas à faire de façon simple, c'est à dire sans refaire une requête à chaque fois et reparcourir tout le tableau, c'est un compteur de doublons : je me retrouve à faire la requête pour tous les utilisateurs !

Je dois pouvoir arranger ça (ci-dessous) pour mettre en tableau en une seule requête, mais surtout il doit y avoir plus simple, non ?
<?php


	$doubles = mysql_query("SELECT nom, id, count(*) FROM users  GROUP BY nom  HAVING  COUNT(*) > 1") or die(mysql_error());
	while ($doublon = mysql_fetch_assoc ($doubles))
	{
		if ($id == $doublon ['id'])
		{
			$compteur_doublon -- ;
		}
	}
	unset ($doubles);
EDIT : en tout cas ça fonctionne, donc mon problème est résolu, même s'il mérite peut-être un peu d'optimisation...

par Aureusms » 27 mars 2009, 09:42

Je pense que ton "champ" avec le doublon doit être $database['email'];
Pourquoi ne pas faire un autre array_diff entre $a_supprimer et $database['email']; ?

Tu peux aussi retirer les doublons temporairement avec array_unique puis faire un autre array_diff. mais j'avoue que ton explication ne m'aide pas beaucoup...

effacer plusieurs lignes ayant la même valeur de référence

par new morning » 27 mars 2009, 00:41

Bonjour,

je suis en train de m'arracher la tête sur le problème suivant : j'ai 2 tableaux ($existant et $reference) que je compare pour supprimer dans $existant ce qui ne se trouve pas dans $reference à l'aide de la fonction array_diff qui me renvoit un tableau $a_supprimer.

Mon problème est que j'utilise pour ça un champs qui tolère des doublons. De ce fait, lorsque je parcours le tableau $a_supprimer, la première ligne ayant la valeur est effectivement supprimée, mais elle joue un rôle de "fusible" pour les autres : en effet, le tableau $a_supprimer contient une seule fois chacune des valeurs à supprimer, même si elles sont présentes plusieurs fois dans la base.

Je ne sais pas trop comment m'y prendre, car j'utilise en même temps la même portion de code pour tester si tout va bien : je souhaite donc "simuler" l'effacement avec toutes les valeurs correspondantes. Ca donne quelque chose comme ça :

<?php

// code de base. Problème : utiliser un champs de référence où les doublons sont tolérés,
// alors que le processus de suppression des lignes s'effectue en parcourant un tableau
// ne contenant qu'une seule occurence des lignes  avec ces doublons.

$a_supprimer = array_diff ($reference, $existant);

foreach $a_supprimer as &$valeur)
{
	$username = $valeur ;

// le tableau $database contient ce dont j'ai besoin pour pas refaire une requête à chaque ligne
	$email = $database['email'];

	$id = $database['id'];

	if ($test)
	{
		echo "On aurait supprimé $username avec l'email $email";
	}
	else
	{
		courriel ($username, $email, $goodbye);
		change ($id, 1);
		efface ($username);
		if ($username = 'doublon')
			//recommence tout...
	}
}