Posez votre question Signaler

Problème de boucles imbriquées en PHP [Résolu]

hellnino 7Messages postés 23 janvier 2007Date d'inscription - Dernière réponse le 26 jan 2007 à 17:38
J'ai crée la fonction suivante en php,mais lors de son execution un problème apparait:
Notice: Undefined offset: 1 in c:\documents and settings\...\recherche.php on line 66
Notice: Undefined offset: 2 in c:\documents and settings\...\recherche.php on line 66
Notice: Undefined offset: 3 in c:\documents and settings\...\recherche.php on line 66
Notice: Undefined offset: 4 in c:\documents and settings\...\recherche.php on line 66
....
Notice: Undefined offset: 1 in c:\documents and settings\...\recherche.php on line 74
Le code est le suivant:
function verif()
{
	$lien=seConnecter();
	$i=0;
	$j=0;
	$resultat69=executerRequeteBD($lien, "SELECT idAuteur FROM auteur" );
	$nblig69=mysql_num_rows($resultat69);
	$nblig690=mysql_fetch_array($resultat69);
	
	$resultat70=executerRequeteBD($lien, "SELECT idAuteur FROM ecrire" );
	$nblig70=mysql_num_rows($resultat70);
	$nblig700=mysql_fetch_array($resultat70);
	
	for ($i=0;$i<=$nblig69;$i++)
	{
		$som=0;
		for ($j=0;$j<=$nblig70;$j++)
		{
			if ($nblig690[$i]==$nblig700[$j])   //ligne 66
			{
				$som=$som++;
			}
			
		}
		if ($som==0)
		{
			$resultat80=executerRequeteBD($lien, "DELETE FROM auteur WHERE IdAuteur='$nblig690[$i]'");   //ligne 74
		}
	}
	
}

Sachant que les erreurs notice n'empèchent apparament pas la suite de la page de s'executer,mais la fonction elle ne s'execute pas correctement.Si quelqu'un pouvait m'aider...merci
Lire la suite 

Problème de boucles imbriquées en PHP »

5 réponses
Réponse
+3
moins plus
Bon, en fait, j'ai encore mieux pour faire ce que tu veux faire :)
Une seule requête !

Regarde déjà cette requête :
SELECT 
  DISTINCT idAuteur
FROM ecrire
Elle te renvoit tous les ID des auteurs qui ont effectivement écrit.
Si tu l'utilises dans ton delete :
DELETE FROM auteur
WHERE idAuteur NOT IN
(
SELECT 
  DISTINCT idAuteur
FROM ecrire
)
Une seule requête qui supprime tous les auteurs qui n'ont pas écrit. Le serveur PHP préfère, le serveur MySQL aussi, sans même parler de la personne qui lit ton code : tout bénèf :)
Ajouter un commentaire
Réponse
+0
moins plus
Ca ne va pas du tout !

Il ne faut pas bouclier en faisant des for, mais des while sur le résultat de tes deux premieres requetes comme suit :
function verif()
{
	$lien=seConnecter();
	$i=0;
	$j=0;
	
	$resultat69=executerRequeteBD($lien, "SELECT idAuteur FROM auteur" );	
	$resultat70=executerRequeteBD($lien, "SELECT idAuteur FROM ecrire" );

	while ( $nblig690=mysql_fetch_array($resultat69) ){
		$som=0;
		while ( $nblig700=mysql_fetch_array($resultat70) ){
			if ($nblig690[$i]==$nblig700[$j])
				$som++;
		}
		if ($som==0)
			$resultat80=executerRequeteBD($lien, "DELETE FROM auteur WHERE IdAuteur='$nblig690[$i]'");   //ligne 74
	}
	
}
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

C'est tout simple :)
Ta fonction mysql_num_rows te dit que tu as X auteurs.
Ensuite, dans ta boucle, tu prends tous les auteurs, de 0 à X inclu. si compte, cela fait... X+1 auteurs en tout. Alors forcément, sur le dernier, il y a un problème !

Bref, tout ça pour dire que dans tes boucles for() (les deux), il ne faut pas mettre des <= mais des < stricts.

Voilà, bon courage pour la suite :)

Xavier
Ajouter un commentaire
Réponse
+0
moins plus
ha ben non.
Oubli ce que j'ai mis c'est inutile.

Ajouter un commentaire
Réponse
+0
moins plus
Problème résolu!!Merci a Reivax962,ta première remarque était juste mais il y avait encor d'autres problèmes aloprs que la seconde marche parfaitement et est beaucoup plus simple^^.Merci aussi a kij_82.
Ajouter un commentaire
Ce document intitulé « Problème de boucles imbriquées en PHP » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook