8797 sujets

Développement web côté serveur, CMS

Bonjour a tous,

Voila j'ai un souci voici d'abord mon code
$reponse = mysql_query("SELECT * FROM Mailing") or die(mysql_error());
$reponse2 = mysql_fetch_array($reponse);
$reponse4 = mysql_query("SELECT * FROM InscritVolontaire");
$reponse5 = mysql_fetch_array($reponse4);
$nbrnews = mysql_query("SELECT * FROM Newsletters");
$nbrnews2 = mysql_fetch_array($nbrnews);			
				
				while($nbrnews2 = mysql_fetch_array($nbrnews)) { 
					$i = 0;
					 while($reponse2 = mysql_fetch_array($reponse)) {
						if(stristr($reponse2['Ouverture'], $nbrnews2['Newsletter'])) {
							$i++;
						};
								
					}
					while($reponse5 = mysql_fetch_array($reponse4)) {
						if(stristr($reponse5['Ouverture'], $nbrnews2['Newsletter'])) {
								$i++;
							};
								
						echo '<p style="color:#FFFFFF; font-size:12px;">Dans boucle while2 ' . $nbrnews2["Newsletter"] . '</p>';							
					}

					echo '<p style="color:#FFFFFF; font-size:12px;">hors de la boucle ' . $nbrnews2["Newsletter"] . '</p>';
};


En faite lors du premier passage de la "Grande boucle" tous ce passe bien, il execute bien les 2 "petites boucles" mais c'est à partir du 2eme passage qu'il y a un probleme.
Il ignore purement et simplement les "petites boucles"

Voicie ce que donne mes echo (que j'ai placé la pour ca):
Dans boucle while2 YCV_002
Dans boucle while2 YCV_002
Dans boucle while2 YCV_002
Dans boucle while2 YCV_002
hors de la boucle YCV_002
hors de la boucle YCV_003
hors de la boucle YCV_004
hors de la boucle YCV_005


si qqun pouvait m'éclairer Smiley smile
Salut,

alors en vrac : Smiley langue

* ce serait plus explicite (à mon humble avis) de ne pas appeler la variable qui sert au fetch comme celle qui sert au query.

* tu perds le premier résultat de chacune de tes requêtes en faisant une fois (pour rien à priori) un mysql_fetch_array avant de rentrer dans le while...

* tu ne remets pas le curseur au début quand tu sors de tes "petites boucles" (il faut vraiment revoir comment fonctionne mysql_fetch_array et en même temps mysql_fetch_assoc et mysql_fetch_row ainsi que mysql_data-seek).

* tu fais "select * ... " alors que tu ne te sers que du champ Newsletter dans la table Newsletters et du champ Ouverture dans les tables Mailing et InscritVolontaire (d'ailleurs : ce n'est pas une erreur ? tu as bien un champ Ouverture dans les 2 tables ?)

* tu utilises stristr alors que si c'est juste pour compter il vaut mieux utiliser strpos moins gourmand en ressources.

Perso j'aurais fait :
<?php
require_once('connexion.php');
$sql1 = mysql_query("SELECT Newsletter FROM Newsletters");
$sql2 = mysql_query("SELECT Ouverture FROM Mailing") or die(mysql_error());
$sql3 = mysql_query("SELECT Ouverture FROM InscritVolontaire");
while($ligne1 = mysql_fetch_array($sql1)) { 
	$i = 0;
	while($ligne2 = mysql_fetch_array($sql2)) {
		if(stristr($ligne2['Ouverture'], $ligne1['Newsletter'])) {
			$i++;
		}
	}
	@mysql_data_seek($sql2, 0);
	while($ligne3 = mysql_fetch_array($sql3)) {
		if(stristr($ligne3['Ouverture'], $ligne1['Newsletter'])) {
			$i++;
		}
		echo '<p style="color:#fff; font-size:12px;">Dans boucle while2 ' . $ligne1["Newsletter"] . '</p>';							
	}
	@mysql_data_seek($sql3, 0);
	echo '<p style="color:#fff; font-size:12px;">hors de la boucle ' . $ligne1["Newsletter"] . '</p>';
}
echo $i;
?>

D'ailleurs il me semble bien que tu aurais pu t'épargner de coder en php et ne faire qu'une requête SQL :
Select count(DISTINCT(Newsletter)) 
+ ( 
Select count(DISTINCT(Newsletter)) 
from Mailing, Newsletters 
where Ouverture like CONCAT('%', CONCAT(Newsletter, '%'))   
) 
from inscritvolontaire, Newsletters 
where Ouverture like CONCAT('%', CONCAT(Newsletter, '%'))

Modifié par Heyoan (12 Feb 2009 - 21:33)
Salut,

Déjà merci pour ta réponse

*pour ce qui est des noms de variables j'en prend note ; )

*
* en effet je me suis tjrs demandé pk mes requêtes sql sautaient tjrs la premiere entré ^^ je ne sus pas très calé en sql, je vais étudié tous ça.

* j'utilise SELECT * car je n'ai pas mis tous mon code qui est un peu long, mais je me sers des autres champs en dessous pour afficher mes resultats, mais en règle général j'utilise souvent * pour des raisons de facilité (peut être n'est-ce pas conseiller).
Et non ce n'est pas une erreur j'ai bien 2 fois le champ "Ouverture".

* et pour le strpos j'en prend note également : )


Je vais étudier tous ça (surtout les requête sql) et je vous tiens au courant


UPDATE :

j'ai testé avec la requete

mysql_data_seek()

et effectviement il remonte bien tous en haut et passe bien par mes petite Boucles

Je garde dans un coin ton alternative SQL pour l'étudier egalement
mais est-ce plus rapide de passer par du language SQL que PHP ? moin on solicite MySQL mieux c'est non ?

Merci a toi, j'édite le message en [Résolu] Smiley cligne

ps: la @ avant la ligne c'est pour proteger la commande ?
Modifié par Traxyl2en1 (13 Feb 2009 - 11:45)