Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 31/10/2009, 21h48   #1
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
Par défaut Extraction de données while, foreach

Bonjour à tous,

j'essaie d'extraire des données dans ma base de BDD et je n'y arrive pas.
Ma BDD est ouverte et prête pour l'extraction. voici un print_r de sa structure.

Array ( [id] => 849 [owner] => 580 [orderID] => 990 [title] => SELLING R/C AIRPLANE KITS & ARF COLLECTION [dateadded] => 2009-10-24 19:39:49 [TopNotified] => N [section] => 1 )



Je peux extraire les données en général avec ce code:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$sSQL = "SELECT p.id,p.owner,p.orderID,p.title,p.dateadded,TopNotified,p.section FROM ".PREFIX."listings AS p INNER JOIN ".PREFIX."users AS u ON p.owner=u.id WHERE display='Y' AND featured7 <> 'Y' AND notified <>'Y' ORDER BY section, dateadded DESC"; 
			$result=$db->query($sSQL);
			$numrows = $result->size();	
			while($rs=$result->fetch())
			{
				echo "ID = ".$rs['id']."<br />";
				echo "Owner = ".$rs['owner']."<br />";
				echo "Order ID = ".$rs['orderID']."<br />";
				echo "Title= ".$rs['title']."<br />";
				echo "Date = ".$rs['dateadded']."<br />";
				echo "Notified = ".$rs['TopNotified']."<br />";
				echo "Section = ".$rs['section']."<br />";
			}

Je reçois ceci:
ID = 1550
Owner = 939
Order ID = 1757
Title= Pilot Portraits: Pilots Figures For Your R/C Plane
Date = 2009-09-16 17:09:42
Notified = N
Section = 1

ID = 1448
Owner = 891
Order ID = 1635
Title= SMITH MINI PLANE
Date = 2009-08-23 12:38:20
Notified = N
Section = 1

ID = 1340
Owner = 218
Order ID = 1504
Title= Kaos 40 prêt à voler.
Date = 2009-08-03 21:24:17
Notified = N
Section = 1

Le trie de la BDD se fait sur les champs [section] et [dateadded]

Pour chaque [section], à partir du (ex: 30eme clients) de cette même [section ] j'aimerais les affichés.

J'ai essayé d'inclure un foreach dans le while mais je ne trouve pas la bonne façon.

voici un exemple plus concret:

j'ai une BDD de 500 clients dans 5 [section] différentes classées comme ceci:

Section 1 = 150 clients (Je veux afficher les 120 prochains clients de la section 1)
Section 2 = 40 clients (Je veux afficher les 10 prochains clients de la section 2)
Section 3 = 100 clients (Je veux afficher les 70 prochains clients de la section 3)
Section 4 = 60 clients (Je veux afficher les 30 prochains clients de la section 4)
Section 5 = 150 clients (Je veux afficher les 120 prochains clients de la section 5)

Comment travailler avec un foreach dans un while pour extraire les données voulus?
heldev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2009, 21h58   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Tu n'as pas bien compris ce que faisais foreach : foreach parcourt un tableau PHP.

Le plus simple pour faire ce que tu veux, c'est surement de faire une requete par section avec LIMIT pour avoir le bon nombre d'enregistrement.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2009, 02h47   #3
Invité de passage
 
Inscription : mars 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 10
Points : 1
Points : 1
Citation:
Envoyé par Sabotage
Le plus simple pour faire ce que tu veux, c'est surement de faire une requete par section avec LIMIT pour avoir le bon nombre d'enregistrement.
J'ai fait une requête par section en ajoutant limit et ça semble fonctionner. Est-ce que tu crois qu"il y aurait place à amélioration?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
			$sSQL = "SELECT p.id,p.owner,p.orderID,p.title,p.dateadded,TopNotified,p.section FROM ".PREFIX."listings AS p INNER JOIN ".PREFIX."users AS u ON p.owner=u.id WHERE p.display='Y' AND p.featured7 <> 'Y' AND p.Topnotified <>'Y' ORDER BY p.section, p.dateadded ASC"; 
			$result=$db->query($sSQL);
			$numrows = $result->size();	
			while($rs=$result->fetch())
			{
				$i=0;
				$cat_list = $rs['section'];
				$sSQL1 = "SELECT p.id,p.owner,p.orderID,p.title,p.dateadded,TopNotified,p.section FROM ".PREFIX."listings AS p INNER JOIN ".PREFIX."users AS u ON p.owner=u.id WHERE display='Y' AND featured7 <> 'Y' AND notified <>'Y' AND section = '".$cat_list. "' ORDER BY section, dateadded ASC LIMIT 30,50"; 	
				$result1=$db->query($sSQL1);
				if ($cat_temp <> $cat_list)
				{
					while($rs1=$result1->fetch())
					{
							$i++;
						$cat_temp=$cat_list;
						$cat_list1=$rs1['section'];
					}
					echo "cat_list = $cat_list -- cat_list1 while2= $cat_list1 -- cat_temp= $cat_temp -- Compteur = $i <br />";
				}
					echo"ID= ".$rs['id']." -- Titre = ".$rs['title']." Section1 = ".$cat_list." -- Section2 = ".$cat_list1."<br />";
			}
heldev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2009, 00h06   #4
Membre du Club
 
Inscription : janvier 2006
Messages : 74
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2006
Messages : 74
Points : 69
Points : 69
Envoyer un message via MSN à {Anthony}
Bonsoir,

Tu pourrais déjà remplacer ta première requête SQL par quelque chose comme :

Code :
1
2
 
$sql = "SELECT DISTINCT `section` FROM " . PREFIX . "listings";
Qui ne récupère QUE le champs section (celui qui t'intéresse) et sans doublons (grâce à l'option "DISTINCT").

Ou encore mieux si tu as un nombre de section pré-défini, par exemple tu sais que ça va de 1 à 5 et que ça ne change pas, tu peux te passer d'une requête SQL :

Code :
1
2
3
4
 
foreach (range(1, 5) as $section) {
   // $section vaudra de 1 jusqu'à 5
}
{Anthony} est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2009, 00h21   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Moi pour aller de 1 à 5 je ferrais plutot
Code :
1
2
for ($i=1; $i<6;$i++) {
}
le tableau prend de la mémoire pour rien
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 19h53.


 
 
 
 
Partenaires

Hébergement Web