Aide pour récupérer des données

Bonjour,

voilà je suis un peu novice dans la programmation mais je comprends le fonctionnement.
Cependant j’ai un soucis, je cherche à créer une page où sera affiché toutes les catégories d’un annuaire ainsi que la quantité d’entrée dans chaque catégorie.

J’ai réussit à récupérer le nom des catégories remplit mais pas celle créé, devrais-je les indiquer dans un fichier afin de les récupérer ?
Si oui, comment procéder ?

Car voilà ce que j’ai fait jusqu’à présent :

<?php include ("include/dbconnect.php"); //création de la requête SQL: $sql = "SELECT * FROM addressbook ORDER BY categorie"; //exécution de notre requête SQL: $requete = mysql_query( $sql) or die( "ERREUR MYSQL numéro: ".mysql_errno()."
Type de cette erreur: ".mysql_error()."
\n" ); //récupération avec mysql_fetch_array(), et affichage de nos résultats : echo( "\n" ); echo( "" ); while( $result = mysql_fetch_array( $requete ) ) { echo( "\n" ); echo( "\n" ); echo( "\n" ); } echo( "
Catégorie
".$result["categorie"]."

\n" ); ?>

Je n’ai pas compris la phrase en gras (reformulez-la clairement s’il vous plait).

En fait lorsque la page s’ouvre, le codage php me permet d’afficher les catégories des données déjà entrée dans la base de données.
Mais j’aimerais faire apparaître toutes les catégories même si elles sont vide et indiquer le nombre d’entrée dans chaque catégorie.

Le seul SELECT SQL tape dans la table [i]addressbook[/i], est-ce la table contenant les catégories ?
Edité le 25/08/2009 à 15:10

oui Raynor c’est le nom de ma table où se trouve toutes mes données.

Je te mets la table de mon addressbook :
CREATE TABLE addressbook (
id int(9) unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
address1 text NOT NULL,
address2 text NOT NULL,
cp text NOT NULL,
ville text NOT NULL,
departement text NOT NULL,
pays text NOT NULL,
home text NOT NULL,
fax text NOT NULL,
email text NOT NULL,
website text NOT NULL,
categorie text NOT NULL,
PRIMARY KEY (id)
);

Le seul hic on va dire c’est qu’avec une table comme celle là je ne peux pas nommer les catégories et les récupérer sauf si la table est remplit, en fait elles sont saisie grâce à un formulaire d’inscription et c’est sur ce formulaire de saisie que figure les catégories.
C’est pourquoi je me demandais comment faire pour que les catégories apparaissent.
Dois-je créer une autre base de données, si oui comment la lier à la première afin que les données circulent entre elle.

Merci d’avance de ta réponse.

Comprends bien que pour MySQL, ta catégorie n’existe que dès lors qu’une ligne de ta table [i]addressbook[/i] la mentionne.

Ce que je veux dire c’est que si tu as imaginé les catégories suivantes :

  • Emploi
  • Jeux
  • Meubles
  • Voiture

et que la table [i]addressbook[/i] ne contient que les lignes suivantes :

Et bien MySQL ne connais que les catégories “Emploi”, “Jeux” et “Meubles”. Il n’a aucun moyen de savoir que tu en as imaginé une quatrième : “Voiture”.

Une des solutions serait de passer par une table [i]catégorie[/i].
Edité le 25/08/2009 à 21:38

c’est bien ce que je pensais.
Donc il serait bon que je créé une base “categorie” avec toutes les catégories que je désire faire apparaître.
Est-ce que je créé aussi une table “categorie” dans ma base “addressbook” ou pas, car je me demande si lors de l’inscription d’une entrée sur la base “addressbook” la catégorie sera prise en compte.

Mon idée pour créer ma base “categorie” est la suivante, créer une base avec catégorie et sous catégorie.

J’ai commencé à préparer celle-ci :

CREATE TABLE categorie (
id INT NOT NULL AUTO_INCREMENT,
libelle VARCHAR(30) NOT NULL,
PRIMARY KEY(id)
) type=InnoDB;

INSERT INTO categorie
VALUES
(1,‘Alimentation’,1),
(2,‘Boucheries’,2),
(3,‘Boulangeries - Pâtisseries’,2),
(4,‘Centres Commerciaux’,2),
(5,‘Chocolatiers’,2),
(6,‘Drogueries’,2),
(7,‘Épiceries’,2),
(8,‘Fromageries’,2),
(9,‘Fruits & Légumes’,2),
(10,‘Glaces’,2),
(11,‘Hypermarchés’,2),
(12,‘Poissonneries’,2),
(13,‘Produits Bio’,2),
(14,‘Rôtisseries’,2),
(15,‘Spécialités’,2),
(16,‘Supérettes’,2),
(17,‘Supermarchés’,2),
(18,‘Torréfaction’,2),
(19,‘Traiteurs’,2),
(20,‘Vins & Spiritueux’,2),
(21,‘Ameublement & Décoration’,1),
(22,‘Antiquités’,2),
(23,‘Arts de la table’,2),
(24,‘Bricolage’,2),
(25,‘Brocantes’,2),
(26,‘Cuisines - Sanitaires’,2),
(27,‘Décoration’,2),
(28,‘Galeries d’art’,2),
(29,‘Linge de maison’,2),
(30,‘Luminaires’,2),
(31,‘Maison’,2),
(32,‘Mobilier de bureau’,2),
(33,‘Placards & Dressings’,2),
(34,‘Tapissier’,2),
(35,‘Tissus’,2);

ça te semble comment ?
Est-ce une bonne idée ?
Car avec ce système ça va afficher les catégories et sous catégories et c’est ce que je recherche.
Merci de ta réponse.

Tu n’as pas besoin de créer une seconde base (de données) : une seconde table (dans la même base que addressbook) suffit.

Bah en fait si j’en ai besoin.
J’ai créé sur ma page d’index toutes mes rubriques et sous rubriques.
Page index.php


<?php
include ("header.php");
include("include/dbconnect.php");  //connexion vers ma base addressbook
include("include/dbconnect3.php") ;//connexion vers ma base categorie

$result = mysql_query("SELECT id FROM addressbook
UNION ALL
SELECT id FROM categorie",$db);
			
echo '<h2>Annuaire</h2><br />';

// affichage des catégories et sous catégories 
// tous les liens ne sont pas en place mais cela fonctionne
echo '<table bgcolor="#FFFFFF">'."\n";
echo '<tr>';
echo '<td width="32%" align="left" valign="top">
<h6><a href="az_categorie.php?categorie=alimentation">Alimentation</a></h6>
Alimentation | Boucheries | Boulangeries - Pâtisseries | Centres Commerciaux | Chocolatiers | Drogueries | Epiceries | Fromageries | Fruits & Légumes | Glaces | Hypermarchés | Poissonneries | Produits Bio | Rôtisseries | Spécialités | Superettes | Supermarchés | Torréfaction | Traiteurs | Vins & Spiritueux |<br><br>
<h6><a href="az_categorie.php?categorie=ameublement">Ameublement & Décoration</a></h6>
Antiquités | Arts de la table | Bricolage | Brocantes | Cuisines - Sanitaires | Décoration | Galeries d\'art | Linge de maison | Luminaires | Maison | Mobilier de bureau | Placards & Dressings | Tapissier | Tissus |<br><br>
<h6>Artisans / Bâtiments</h6>
Bâtiment | Carreleurs | Climatisation | Electriciens | Luminaire | Maçons | Matériaux de construction | Menuisiers / ALU - PVC | Mosaïques / Staff | Paysagistes | Peintres bâtiments | Peintres décorateurs | Plaquistes | Plâtriers | Plombiers | Storistes ( stores, volets roulants) | Terrassiers | Vitrerie Miroiterie |<br><br>
<h6>Artisans d\'art</h6>
Céramistes | Ebénistes | Encadreurs | Ferronniers | Gravure | Restaurateur Conservateur d\'art | Sculpteurs | Tapissiers Matelassiers |<br><br>
<h6>Auto, Moto, Bateaux</h6>
Antiquités | Arts de la table | Bricolage | Brocantes | Cuisines - Sanitaires | Décoration | Galeries d\'art | Linge de maison | Luminaires | Maison | Mobilier de bureau | Placards & Dressings | Tapissier | Tissus |<br><br>
</td>';
echo '<td width="2%"></td><td width="32%" align="left" valign="top">
<h6><a href="az_categorie.php?categorie=bijouterie">Bijouterie & Horlogerie</a></h6>
Bijouteries<br><br>
<h6>Culture & Divertissements</h6>
Beaux-Arts & Loisirs créatifs | Cds, Dvds | Discothèque | Ecole de danse | Jeux & jouets | Librairies | Location de Dvd | Loisirs | Manège | Piano-Bar |<br><br>
<h6>Electroménager</h6>
Electricité | Electroménager | Electronique |<br><br>
<h6>Fleurs & Cadeaux</h6>
Bazar | Broderie | Cadeaux | Coutellerie | Fleuristes |<br><br>
<h6>Hifi, Photo, Vidéo</h6>
Photo | Télévision |<br><br>
<h6>Hôtellerie</h6>
Camping | Chambres d\'hôtes | Gîtes | Hôtels | Hôtels Restaurants | Résidences | Villages de vacances |<br><br>
<h6>Immobilier</h6>
Agences Immobilières | Architectes | Crédit Immobilier | Promoteurs |<br><br>
<h6>Prêt à Porter & Accessoires</h6>
Chapellerie | Chaussures | Fourrures | Haute couture & création | Lingerie | Maroquinerie | Mercerie | Vêtements | Vêtements enfants | VPC |<br><br>
</td>';
echo '<td width="2%"></td><td width="32%" align="left" valign="top">
<h6>Restauration</h6>
Bars à vins | Bistrot Gourmand (Label) | Cafés, Bars, Brasseries | Crêperies | Pizza à emporter | Pizzeria | Restaurants | Restaurants / Plages privées | Restaurants à domicile | Restaurants à thèmes | Restauration Rapide | Salon de thé |<br><br>
<h6>Santé & Beauté</h6>
Accessoires Cheveux | Audition | Balnéothérapie | Coiffeurs | Diététique | Esthétique | Opticiens | Orthopédie | Parfumerie | Pédicure | Pharmacies | Piercing | Relaxation | Santé |<br><br>
<h6>Services</h6>
Agences de communication | Agences de voyage | Amicale | Assurance | Assurances Bateaux | Auto-école | Banques | Bureautique | Copie / Photocopie | Cordonneries | Cours de langues | Couture | Crèches / Enfance | Déménagements | Formation | Graineterie | Hygiène - assainissement | Imprimeries | Informatique | Installations portuaires | Laveries | Musique | Nettoyage | Papeteries | Photographes | Piscine | Placements Financiers | Pompes funèbres | Poste | Presse | Pressings | Rachat de crédits | Reprographie | Secrétariat | Sécurité / Surveillance | Serrurerie | Services à la personne | Services aux entreprises | Tabac | Tabac - Journaux | Tabac Cadeaux | Téléphonie | Toilettage | Transports | Travail Temporaire |<br><br>
<h6>Sport</h6>
Accessoires de plongée | Cycles | Equitation | Golf | Magasins de sport | Plongée | Salles de sport |<br><br>
</td></tr>';
echo '</table>'."\n";
// fin du tableau.
?> 
<?php
include ("footer.php");
?>

Page az_categorie.php


<?php
include ("header.php");

include("include/dbconnect.php");
include("include/dbconnect3.php");

$result = mysql_query("SELECT id FROM addressbook
UNION ALL
SELECT id FROM categorie",$db);

echo "<table cellpadding=2 cellspacing=1 border=0>"; 
$resultsnumber = mysql_numrows($result);
$alternate = "2"; 
#echo "Number of results: $resultsnumber";
	while  ($row = mysql_fetch_array($result)) {

	$id = $row["id"]; 
	$name = $row["name"];
	$categorie = $row["categorie"];
	
	if ($alternate == "1") { 
	$color = "#ffffff"; 
	$alternate = "2"; 
	} 
	else { 
	$color = "#D7F784"; 
	$alternate = "1"; 
	} 
	// là il doit y avoir des changements pas encore réalisé pour la balise $categorie
	echo "<tr bgcolor=$color><td>$categorie</td><td><b>$name</b></td><td>$ville</td><td>$pays</td><td>$website</td><td><a href='view.php?id=$id'>Voir détail</a></td></tr>"; 
	
	}
	if ($resultsnumber == "0") {
	echo "Désolé, aucune entrée ne correspond à cette lettre.";
	}
	echo "</table>"; 
echo "<br><br /><a href=\"javascript:history.back()\">Page précédente</a>";
?> 
<?php
include ("footer.php");
?>

Ce qui me pose le plus de problème c’est la page d’ajout et d’édition des entrées de l’annuaire.
Je sais que quelque chose ne fonctionne pas mais je n’ai aucune erreur après validation.
Voici une partie de ma page :
Page edit.php


<?php
include ("head2.php");
?>
<h1>Ajouter et Editer une entrée</h1>
<?php
include("include/dbconnect.php");
include("include/dbconnect3.php");

$result = mysql_query("SELECT id FROM addressbook
UNION ALL
SELECT id FROM categorie",$db);

if($submit)
{

$sql = "INSERT INTO addressbook (id, name, address1, address2, cp, ville, departement, pays, home, fax, email, website) VALUES ('$id','$name','$address1','$address2','$cp','$ville','$departement','$pays','$home','$fax','$email','$website')
UNION ALL
SELECT (id, alimentation, ameublement, artisans_batiment, artisans_dart, auto_moto_bateaux, bijouterie, culture, electromenager, fleurs_kdo, hifi_photo_video, hotel, immo, prêt_a_porter, restau, sante_beaute, services, sport) VALUES ('$id','$alimentation','$ameublement','$artisans_batiment','$artisans_dart','$auto_moto_bateaux','$bijouterie','$culture','$electromenager','$fleurs_kdo','$hifi_photo_video','$hotel','$immo','$prêt_a_porter','$restau','$sante_beaute','$services','$sport') FROM categorie";
$result = mysql_query($sql);
echo "<br><br>Information entré dans l'annuaire.\n";
}
else if($update)
{
$sql = "UPDATE $table SET name='$name',address1='$address1',address2='$address2',cp='$cp',ville='$ville',departement='$departement',pays='$pays',home='$home',fax='$fax',email='$email',website='$website',categorie='$categorie' WHERE id=$id";
$result = mysql_query($sql);
echo "<br><br>Mise à jour de l'annuaire.\n";
}
else if($id)
{
$result = mysql_query("SELECT * FROM $table WHERE id=$id",$db);
$myrow = mysql_fetch_array($result);
?>

Merci d’avance de ton aide.

Simples questions pour ôter un doute :
Sais-tu ce qu’est un serveur de base de données ?
Sais-tu ce qu’est une base de données ?
Sais-tu ce qu’est une table ?
Et les relations entre les trois ?
Edité le 27/08/2009 à 16:24

oui, pourquoi mon travail est si nul que j’ai l’air à côté de mes pompes ?
ou alors mon interrogation paraît si idiote que rien que de connaître la corrélation entre les 3 devrait m’éclairer ?

Ok, je suis novice mais je comprends le principe !
Si tu peux m’aider à apporter des lumières, vas-y !

Non, il est juste “étrange”.[quote=“liloune89”]
Ok, je suis novice mais je comprends le principe !
Si tu peux m’aider à apporter des lumières, vas-y !
[/quote]
OK soit…

Je ne peux t’aider à apporter des “lumières” : soit tu as les tiennes et tu n’as pas besoin de moi pour les apporter, soit je te file les miennes tout seul.

Sinon, au début de “index.php” (et dans les autres fichiers .php), il y a :

include("include/dbconnect.php"); //connexion vers ma base addressbook
include("include/dbconnect3.php") ;//connexion vers ma base categorie

$result = mysql_query("SELECT id FROM addressbook
UNION ALL
SELECT id FROM categorie",$db);

D’où sort $db ? A quelle connexion MySQL correspond-t-il ?
Vu que ta requête (“SELECT id FROM addressbook UNION ALL SELECT id FROM categorie”) ne mentionne nullement un nom de base, je présume que les tables addressbook et categorie sont dans la même base de données.

Ensuite, cette variable/resource $result n’est réellement utile que dans “az_categorie.php” (dans les fichiers elle est soit réinitialisée, soit jamais utilisée).

Pour finir, cette requête est bizarre : emploi de UNION entre des entrées d’un carnet d’adresse (addressbook) et des catégories (categorie).
Son utilisation l’est également :

$row = mysql_fetch_array($result);
$row["id"];
$name = $row["name"];
$categorie = $row["categorie"];

Suite à l’appel à mysql_fetch_array(), le tableau $row n’a qu’un seul élément : celui de clé/index “id”, contenant soit la valeur du champ “id” d’une entrée de carnet d’adresse soit la valeur du champ “id” d’une catégorie.

(c’est questions ne font que me conforter dans l’idée que tu essaie de coder un truc utilisant PHP et MySQL sans t’être documenté sur les bases du langage SQL)
Edité le 27/08/2009 à 18:35

En fait ces lignes :
include(“include/dbconnect.php”); //connexion vers ma base addressbook
include(“include/dbconnect3.php”) ;//connexion vers ma base categorie

renvoie vers des fichiers où se trouve ceci :
page : dbconnect.php

<?php

include("config.php");

$db = mysql_connect("$dbserver", "$dbuser", "$dbpass");
mysql_select_db("$dbname",$db);
  ?>

page : include.php

<?php
  $dbname     = "nom_de_la_base"; 
  $dbserver   = "serveur"; 
  $dbuser     = "login"; 
  $dbpass     = "password"; 
  $table      = "nom_de_la_table"
  ?>

Donc ça t’explique la liaison vers les différentes bases et ce qu’est $db.
J’ai créé ces pages pour mes 2 tables “addressbook” et “categorie”
Dans les 2 un terme est en commun ce qui permet en principe le lien entre les deux.
Il se trouve que ça ne fonctionne pas, je dois voir pourquoi.

Pour finir, il est normal que tu puisses conclure à une telle chose, vu que je suis novice à tout ceci mais que malgré tout un coup de pouce pour comprendre peut toujours aider. Même si je lis des tonnes de doc pour réussir et perdre un temps fou à faire, défaire et refaire vu mon niveau, mon projet est en grande majorité finalisé et je serais fière quand il sera vraiment finit comme je l’ai visualisé dans mon esprit.

Merci à toi d’avoir partagé tes lumières.


Toutefois j'aurais encore une question car au début du topic tu me disais que ça n'était pas utile de faire 2 bases (c normal) mais 2 tables et de les lier. Car visiblement ma solution est caduque. Peux-tu m'expliquer alors, comment je peux procéder afin que ma page "index.php" permette en cliquant sur le lien de chaque catégorie en ouvrant la page "az_categorie.php" et n'afficher que la catégorie choisit ?

Merci d’avance à toi :o)
Edité le 29/08/2009 à 14:51

j’ai trouvé un moyen de lier mes tables :

SELECT addressbook.id, addressbook.id_categorie, categorie.id_categorie 
FROM addressbook, categorie 
WHERE addressbook.id_categorie = categorie.id_categorie

table : addressbook

 CREATE TABLE addressbook(
id INT (11) not null AUTO_INCREMENT, 
   name varchar(255) NOT NULL,
   address1 text NOT NULL,
   address2 text NOT NULL,
   cp text NOT NULL,
   ville text NOT NULL,
   departement text NOT NULL,
   pays text NOT NULL,
   home text NOT NULL,
   fax text NULL,
   email text NOT NULL,
   website text NOT NULL,
   id_categorie text NOT NULL,
PRIMARY KEY (id), 
INDEX (id), 
UNIQUE (id))

table categorie :

CREATE TABLE categorie (
    id_categorie INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id)
)

je me suis servit du site http://www.commentcamarche.net/contents/sql/sqljoint.php3

Par contre je ne sais pas comment exploiter cette trouvaille :etonne2:
Un peu d’aide serait super, merci d’avance

Oui, c’est ainsi qu’il faut faire : une jointure entre tes deux tables.
D’ailleurs, ne manque-t-il pas un champ [i]nom[/i] à ta table [i]catérogie[/i] ?

Par contre, légère remarque par rapport à la liste des champs de ton SELECT :
Tu as les champs addressbook.id, addressbook.id_categorie, categorie.id_categorie or les deux derniers auront la même valeur (normal puisque c’est ton pivot de jointure).
Dans ton cas, je pense que tu veux sélectionner tous les champs des deux tables non ?
Donc :

SELECT 
	`addressbook`.*, 
	`categorie`.* 
FROM 
	`addressbook` 
	JOIN `categorie` 
		ON `categorie`.`id_categorie` = `addressbook`.`id_categorie`

Cette requête, te retourne des lignes contenant toutes les informations de addressbook et de categorie.
L’utilisation PHP reste simple (comme avant) :

$select = mysql_query('SELECT 
	`addressbook`.*, 
	`categorie`.* 
FROM 
	`addressbook` 
	JOIN `categorie` 
		ON `categorie`.`id_categorie` = `addressbook`.`id_categorie`');
while($row = mysql_fetch_assoc($select)) {
	// $row est un tableau contenant :
	// id
	// name
	// address1
	// address2
	// cp
	// ville
	// departement
	// pays
	// home
	// fax
	// email
	// website
	// id_categorie
	// name_categorie (si tu le rajoute dans ta table `categorie`
	echo '	<tr bgcolor="$color">
		<td>', $row['name_categorie'], '</td>
		<td><b>', $row['name'], '</b></td>
		<td>', $row['ville'], '</td>
		<td>', $row['pays'], '</td>
		<td>', $row['website'], '</td>
		<td><a href="view.php?id=', $row['id'], '">Voir détail</a></td>
	</tr>'; 
}

Bonjour Raynor,
merci pour ton aide, en fait cela m’a mit sur la piste comme on dit.
J’ai réussit à faire ce que je voulais en définitive, mais il se trouve que j’ai d’autres questions.

Question 1 :
J’ai un formulaire pour faire les inscriptions des entrées dans ma base, j’utilise $_post pour introduire ces infos.
A un moment j’ai des listes déroulantes, jusque là tout va bien.
Voici l’exemple d’une des listes :

<td>Département :</td>
<td> 
<select name="departement" SIZE=1 
style="color: #000000; font-family: Arial; font-size: 10px; border-style: solid; border-width: 1; 
background-color:#FFFFFF">
<option value="01 Ain">01 Ain</option>
<option value="02 Aisne">02 Aisne</option>
<option value="03 Allier">03 Allier</option>
<option value="04 Alpes-de-Haute-Provence">04 Alpes-de-Haute-Provence</option>
</select>

L’idée est que le champs “departement” soit remplit par l’information sélectionné dans le formulaire.

Ma 2ème liste déroulante par contre est liée à la 3è liste déroulante.
En fait j’aimerais faire la chose suivante :
lorsque je sélectionne une ligne de la liste 2, cela affiche les infos à la 3ème liste.

Exemple :
dans la liste 2 j’ai les catégories : aliment, ameublement, bijouterie …
j’aimerais que lorsque je choisis “aliment” dans la liste 2, s’affiche uniquement les sous-catégorie de “aliment” dans la liste 3.

Est-ce que c’est possible et si oui comment ?
Dois-je dans ce cas là créer une table “categorie” et une table “sous-categorie” afin que les 2 listes utilisent les tables respective lors de l’affichage des données dans les listes ?

Question 2 :
Après la saisie des données par le biais du formulaire, celles-ci sont stockées dans la table “addressbook”.
Si lors de la saisie au niveau des listes les infos sont codés de la façon suivante :

<option value="Artisans / Bâtiments">Artisans / Bâtiments</option>

l’inscription dans la table “addressbook” est écrit ainsi “Artisans / Bâtiments”

Si par contre les infos sont comme ceci :

<option value="artisans_batiment">Artisans / Bâtiments</option>

l’inscription dans la table “addressbook” est écrit ainsi “artisans_batiment”

Ce qui d’une part n’est pas si mauvais car cela me permet sur ma page d’accueil d’effectuer un lien du style :

<a href="az_categorie.php?id_categorie=artisans_batiment">Artisans / Bâtiments</a></option>

et cela affiche sans problème toutes les entrées qui ont comme catégorie “artisans_batiment”

J’aimerais savoir s’il y’a un moyen de garder le lien tel quel mais d’avoir en affichage de catégorie le nom véritable ?

Merci d’avance de la réponse

Oui c’est possible : beaucoup de choses sont réalisables en avec l’HTML, le CSS, le JavaScript, le PHP et MySQL.

Question 1 : JavaScript

Question 2 :
« J’aimerais savoir s’il y’a un moyen de garder le lien tel quel mais d’avoir en affichage de catégorie le nom véritable ? »
Quel lien ?