Forums d'entraide informatique - Les forums de PCW

Version complète : [PHP] Besoin d'aide sur un script de gestion d'offres
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Pages : 1 2
Salut tout le monde,

Aujourd'hui je viens car j'ai besoin de votre aide en php (je suis pas très doué dans ce code).
Voilà mon problème :
J'ai une page "gestion.php" et dessus j'aimerais afficher l'offre du client en fonction de son id
En effet j'ai une table "users" qui contient les clients et dedans une colonne "offre" qui contient le nom de l'offre
Il faudrait que sur cette page j'arrive à afficher l'offre du client connecté.
Ex : Je me connecte avec l'username Cyboulette sur la page j'obtiens l'offre que Cyboulette a.
Je me connecte avec l'username Test sur la page j'obtiens l'offre que Test possède.

Voici la structure :


--
-- Structure de la table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`id` bigint(20) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`avatar` text NOT NULL,
`offre` varchar(255) NOT NULL,
`dir` varchar(255) NOT NULL,
`signup_date` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Et le code de ma page gestion.php :


<?php
//On récupère l'offre de l'utilisateur en fonction de son id
$req = mysql_query('select username, email, offre from users WHERE id=id');
while($dnn = mysql_fetch_assoc($req))
{
?>
Vous disposez de l'offre : <?php echo $dnn['offre']; ?> <br/>

En espérant que vous puissiez m'aider Smile Merci d'avance !

Salut Quentin,

Le code PHP que tu utilises est le bon.

Le problème ici est que, telle que ta base de données est conçue, tu ne peux stocker qu'une seule offre par client.

Je m'explique :

Premièrement, dans ta table "users" il manque une clé primaire. En règle général, il faut une clé primaire dans une table (sauf quelques très rares cas, compliqués à expliquer ici).

En l'occurence, pour une table stockant les utilisateurs, la clé primaire sera logiquement l'identifiant de l'utilisateur car il est unique.

Cependant, une clé primaire est "unique" elle ne peut pas avoir, pour deux lignes différentes de ta base de données, la même valeur.

Ce qui implique de ne pas dupliquer les données, justement... et donc, de ne pouvoir avoir, avec ton schéma actuel, qu'une seule offre par client !

Ce qu'il faut faire c'est :
  • Mettre "id" en clé primaire (accessoirement, en AUTO_INCREMENT ça te facilitera la vie)
  • Retirer la colonne "offre"
  • Créer une table "offres" dans laquelle tu stockes les données relatives aux offres (comme leur prix, etc. ... )
  • Créer une table "clients_offres" par exemple (tu la nommes comme tu veux) qui fera la jointure entre tes offres et tes clients.

Dans cette table clients_offres tu auras :
  • une colonne client_id
  • une colonne offre_id

La clé primaire sera cette fois la combinaison (client_id, offre_id) qui deviendra unique (sauf si un client peut avoir plusieurs fois la même offre, dans ce cas, ne le mets pas en clé primaire).

Ensuite, pour avoir les offres pour un client donné, la requête deviendra :


SELECT * FROM clients_offres WHERE client_id = $id 

Et si tu veux récupérer les données de la table "offres" en même temps (pour avoir son nom par exemple) il faut faire une jointure :


SELECT * FROM clients_offres JOIN offres ON (clients_offres.offre_id = offres.id)


Voilà Smile

Merci de ton aide mais ça ne marche pas Sad

J'ai fais exactement comme tu m'as dis, donc cela viens de mon code php

Je le remets ici :

<?php
//On recupere les identifiants, les pseudos et les emails des utilisateurs
$req = mysql_query('SELECT * FROM clients_offres JOIN offres ON (clients_offres.offre_id = offres.id)');
while($dnn = mysql_fetch_assoc($req))
{
?>
Vous disposez de l'offre : <?php echo $dnn['offre']; ?> <br/>

J'obtiens :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/gestion.php on line 60

C'est que ta requête plante Wink

Mets un "or die(mysql_error())" entre ton mysql_query() et le ";"

Comme ça :

mysql_query(blabla) or die(mysql_error());

J'obtiens maintenant : Unknown column 'offres.id' in 'on clause' Sad
Est-ce que tu as bien créé une table qui s'appelle "offres" et qui contient une colonne "id" ? ^^
Ah non je l'avais appelé offre_id mais je viens de le changer en id mais ça n'affiche toujours pas le nom de l'offre Sad
Ré-envoie la structure SQL de tes tables (les 3, maintenant que y'en a trois) et le code PHP que tu utilises pr afficher...
Voilà les structures :

--
-- Structure de la table `clients_offres`
--

CREATE TABLE IF NOT EXISTS `clients_offres` (
`client_id` int(20) NOT NULL,
`offre_id` int(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Structure de la table `offres`
--

CREATE TABLE IF NOT EXISTS `offres` (
`id` int(20) NOT NULL,
`nom` varchar(255) NOT NULL,
`prix` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Structure de la table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`id` bigint(20) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`avatar` text NOT NULL,
`signup_date` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Et pour afficher j'utilise :

<?php
//On recupere les identifiants, les pseudos et les emails des utilisateurs
$req = mysql_query('SELECT * FROM clients_offres JOIN offres ON (clients_offres.offre_id = offres.id)') or die(mysql_error());
while($dnn = mysql_fetch_assoc($req))
{
?>
Vous disposez de l'offre : <?php echo $dnn['nom']; ?> <br/>

Maintenant ça m'affiche : 1 (Qui est le nom de l'offre 1) et 2 (Qui est le nom de l'offre 2), seulement que j'ai mis l'offre 1 au client 1 et l'offre 2 au client 2. Je me suis connecté sur le client 2 ça m'affiche la même chose :/

C'est normal, tu n'as pas mis de WHERE client_id = '.$id à la fin de ta requête Wink

Donc tu affiches tout, sans restreindre au client actuellement connecté sur la page. Smile
Pages : 1 2
URLs de référence