Probleme de array_unique dans une liste

Eléphant du PHP | 101 Messages

04 sept. 2005, 11:31

voici ma base:

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.6.1 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Dimanche 04 Septembre 2005 à 11:28 -- Version du serveur: 4.1.9 -- Version de PHP: 4.3.10 -- -- Base de données: `ma_base` -- -- -------------------------------------------------------- -- -- Structure de la table `commandes_2005` -- CREATE TABLE `commandes_2005` ( `NumAuto` int(10) NOT NULL default '0', `annonceur` varchar(50) default NULL, `nom` varchar(50) default NULL, `telephone` varchar(30) default NULL, `fax` varchar(30) default NULL, `client` varchar(50) default NULL, `region` varchar(50) default NULL, `commercial` varchar(50) default NULL, `portable` varchar(30) default NULL, PRIMARY KEY (`NumAuto`), UNIQUE KEY `NumAuto_2` (`NumAuto`), KEY `id` (`NumAuto`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `commandes_2005` -- INSERT INTO `commandes_2005` VALUES (1, 'ACMU', 'PATRICK', '06 00 00 00 00', 'NC', 'TOTO', 'PARIS', 'CHRISTELLE', '06 00 00 00 00'); INSERT INTO `commandes_2005` VALUES (2, 'ACTION', 'CHRISTINE', '05 00 00 00 00', '05 00 00 00 00', 'MIMI', 'CHARENTES MARITIMES', 'PASCAL', '05 46 00 00 00'); INSERT INTO `commandes_2005` VALUES (3, 'ACT', 'LAURENT', '03 00 00 00 00', 'NC', 'TITI', 'CENTRE', 'JENNIFER', '06 00 00 00 00'); INSERT INTO `commandes_2005` VALUES (4, 'ACMU', 'DENIS', '05 00 00 00 00', '05 00 00 00 00', 'TITI', 'CASTRES', 'JACQUES', '06 00 00 00 00'); INSERT INTO `commandes_2005` VALUES (5, 'ACOUST', 'PASCAL', '04 00 00 00 00', '[email protected]', 'LULU', 'PACA', 'MARTINE', '03 00 00 00 00'); INSERT INTO `commandes_2005` VALUES (6, 'ACTU', 'THIERRY', '03 00 00 00 00', '03 00 00 00 00', 'TATA', 'NORD EST', 'CHRISTIANE', '06 00 00 00 00'); INSERT INTO `commandes_2005` VALUES (7, 'ACTU', 'THIERRY', '03 00 00 00 00', '03 00 00 00 00', 'TATA', 'NORD EST', 'CHRISTIANE', '06 00 00 00 00'); INSERT INTO `commandes_2005` VALUES (8, 'ACSM', 'ISABELLE', '02 00 00 00 00', 'NC', 'LILI', 'MANCHE', 'GUILLAUME', '06 00 00 00 00'); INSERT INTO `commandes_2005` VALUES (9, 'ACMU', 'PATRICK', '06 00 00 00 00', 'NC', 'TOTO', 'PARIS', 'CHRISTELLE', '06 00 00 00 00');
muriel

Mammouth du PHP | 19672 Messages

04 sept. 2005, 12:21

Ok, c'est excellent, on va pouvoir avancer.

Alors le permière chose que je note, c'est que ta clé primaire n'est pas en auto_increment, ce qui t'oblige à insérer toi-même un numéro, c'est source d'erreurs. D'autre part, tu as un triple index un peu inutile sur ce champ : d'abord en clé primaire et ensuite en clé UNIQUE et en INDEX :

Suggestion de modification :

Code : Tout sélectionner

ALTER TABLE `commandes_2005` DROP INDEX `id` ; ALTER TABLE `commandes_2005` DROP INDEX `NumAuto_2` ; ALTER TABLE `commandes_2005` CHANGE `NumAuto` `NumAuto` INT( 10 ) NOT NULL AUTO_INCREMENT ;
Comme ça, tu auras une clé primaire automatique qui est de toutes façon indexée.

Maintenant, il reste à savoir ce que tu veux obtenir exactement à l'affichage lors de la recherche sur la base du jeu d'essai que tu nous mets là.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 101 Messages

04 sept. 2005, 12:49

je te remercie de ces precisions, j'ai importé une base access dans mysql et par defaut il m'a mis cela je cours le changer.
Pour revenir à ta question (ce que je veux faire) je veux pouvoir faire une recherche par nom ou par client ou en faisant tous les annonceurs ou tous les client ou les deux, cela marche tres bien comme vous avez pu le constater, maintenant le probleme vient au niveau de la page recherche.php et non pas index.php, du fait que si par exemple dans la page index.php tu choisis de faire tous les annonceurs ainsi que tous les client le tableau s'affiche avec les 7 annonceurs et non pas les 9 qu'il y a dans la BD car il a enlevé les doublons (ce qui est parfait jusque là) ainsi que les 7 clients jusque là tous va bien mais si tu regardes ensuite le nom
ainsi que le telephone,fax,commercial,portable lui ne correspond plus regarde bien dans la BD en faisant un trie par annonceur j'ai bien 3 ACMU et ensuite j'ai ACOUST et si tu regarde dans la BD par exemple le nom c'est "PASCAL" et le fax c'est " [email protected]" et maintenant si tu vas sur recherche.php le nom c'est patrick au lieu de "PASCAL" le fax c'est "NC" au lieu de [email protected] etc.....
alors j'ai bien compris que cela venait du "SELECT DISTINCT" dans recherche.php:
$req = 'SELECT DISTINCT annonceur,client FROM commandes_2005 ';
et c'est là que vous intervenez tous comment arriver à faire que les doublons par annonceur ainsi que client soit enlever et que le telephone,fax,commercial,portable lui puisse correspondre au champs annonceur et client ???

en esperant avoir été clair dans mon explication..... sinon n'hesitez pas à me demander d'autres precisions !!!

d'avance merci à vous tous pour votre patience, votre gentillesse ainsi que du temps que vous me consacrez.
muriel

Mammouth du PHP | 19672 Messages

04 sept. 2005, 13:25

Je sens bien venir l'auto-jointure : tes explications ne sont pas vraiment limpides et j'ai l'impression que ta base aurait besoin d'une restructuration pour optimiser.

Pourrais-tu expliquer quels sont les liens entre l'annonceur, le nom et le client : Est-ce que le nom est celui de l'annonceur ? Quel lien entre Client et Annonceur ? Les téléphones sont-ils ceux du client, de l'annonceur ou de Nom ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 101 Messages

04 sept. 2005, 13:35

je veux bien croire que mes explications soit un peu brouillon !!! je suis désolée je fais vraiment de mon mieux....
mais as tu vu cyrano le probleme entre les données de la BD et les données de la page recherche.php quand tu fais "tous" les annonceur et "tous" les clients ? que les champs annonceurs et clients ne coincident pas avec les autres champs.
Si tu as vu cela alors c'est que l'on est sur la bonne voie
muriel

Mammouth du PHP | 19672 Messages

04 sept. 2005, 13:51

Non, je n'ai pas vu parce qu'il me manque des éléments et j'ai l'impression qu'en voulant simplifier, tu t'es considérablement compliqué la vie. À première vue, je vois déjà une seconde table en allégeant un peu la première, et peut-être une troisième en fonction des réponses à ma précédente question. Si c'est ce que je pense quoique je n'en voie pas encore la forme exacte, tu vas voir que ça va être beaucoup plus facile après. Mais il me faut les réponses d'abord pour formulare la mienne ensuite avec des suggestions de modifications.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 101 Messages

04 sept. 2005, 14:15

oki, alors je t'explique les liens cyrano...
c'est une base de données pour une société qui fait des pubs pour les radios, alors l'annonceur c'est le magasin qui veut faire sa pub le nom ainsi que le telephone et le fax correspondent à cette annonceur, exemple:
magasin levis nom du client qui tiens ce magasin avec son tel ainsi que son fax
le client c'est la radio qui demande à faire la pub (à la société qui crée les pubs) avec la region ou est la radio ainsi que le commercial qui a demarché l'annonceur et le portable du commercial

voilà je crois avoir tout dit, du moins je l'espere.... sinon n'hesite pas à me poser d'autres questions je suis rivé à mon PC

et encore merci pour tous.....
muriel

Mammouth du PHP | 19672 Messages

04 sept. 2005, 14:41

Je me demande si tu réalises un truc : ce que tu me décris, ce sont donc deux entités distinctes : l'annonceur d'un coté, le commercial de l'autre : au départ, tu ne peux pas raisonnablement mettre tout ça en vrac dans la même table. Cependant, comme un annonceur peut faire affaire avec plusieurs commerciaux, et qu'un commercial peut s'addresser à plusieurs annonceurs, on va avoir une relation entre les deux qui va devenir une troisième table. À moins qu'un client ne puisse faire affaire qu'à un seul commercial ? (exclusivité ?) De toutes façons, on aura au minimum deux tables. Confirme s'il te plait pour savoir s'il en faut une troisième en intermédiaire.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 101 Messages

04 sept. 2005, 14:48

tu as tout à fait raison cyrano il en faut une troisieme en intermediaire car un annonceur peut faire affaire avec plusieurs commerciaux et qu'un commercial peut s'addresser à plusieurs annonceurs
et un client peux faire affaire avec plusieurs commerciaux (puisque si un commercial part il est remplacé par un autre donc c'est tout à fait possible)
donc je pense que je peux te confirmer qu'il faut une troisieme table cyrano.
Désolée de te faire faire tout ce travail cyrano, merci pour tous
muriel

Mammouth du PHP | 19672 Messages

04 sept. 2005, 14:57

Pas de problème. Donc ta base sommairement modélisée devrait ressembler à une structure dans ce genre : Regarde si tu y vois plus de cohérence et éventuellement s'il manque des éléments ?

Code : Tout sélectionner

+-------------------------------------------+ | annonceur | +-------------------------------------------+ |ann_id INT NOT NULL Auto_increment <PK> | |ann_nom VARCHAR(32) | |ann_telephone VARCHAR(16) | |ann_fax VARCHAR(16) | |ann_region VARCHAR(32) | +-------------------------------------------+ +-------------------------------------------+ | commandes_2005 | +-------------------------------------------+ |cmd_id INT NOT NULL Auto_increment <PK> | |ann_id INT NOT NULL <FK> | |com_id INT NOT NULL <FK> | +-------------------------------------------+ +-------------------------------------------+ | commercial | +-------------------------------------------+ |com_id INT NOT NULL Auto_increment <PK> | |com_portable VARCHAR(16) | +-------------------------------------------+
La seule chose qui fait défaut dans l'histoire et qui m'a obligé à ajouter une clé primaire supplémentaire dans la table commandes_2005, c'est l'absence de la nature de la commande dont les détails sont, je suppose, décris dans une autre table, auquel cas, ce qui devrait remplacer cette clé primaire est une clé étrangère qui serait la clé primaire de la table détail_commande. Et la table commande_2005 aura donc en clé primaire une clé composite faite avec les trois clés étrangères.

Est-ce que tu t'y retrouves à peu près quand même dans ces explications (je conçois que ce n'est pas forcément évident à visualiser) ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 101 Messages

04 sept. 2005, 15:52

oki cyrano j'ai crée mes 3 tables j'ai fais quelques changements donc je te mets mes 3 tables pour que tu puisses me dire si c'est bon:

Code : Tout sélectionner

- Structure de la table `annonceur ` -- CREATE TABLE `annonceur` ( `ann_id` int(11) NOT NULL Auto_increment, `ann_annonceur` VARCHAR(32) default NULL, `ann_nom` VARCHAR(32) default NULL, `ann_telephone` VARCHAR(16) default NULL, `ann_fax` VARCHAR(16) default NULL, PRIMARY KEY (`ann_id`), UNIQUE KEY `ann_id_2` (`ann_id`), KEY `id` (`ann_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Code : Tout sélectionner

-- Structure de la table `commandes_2005` -- CREATE TABLE `commandes_2005` ( `cmd_id` int(11) NOT NULL Auto_increment, `ann_id` VARCHAR(32) default NULL, `com_id` VARCHAR(16) default NULL, PRIMARY KEY (`cmd_id`), UNIQUE KEY `cmd_id_2` (`cmd_id`), KEY `id` (`cmd_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Code : Tout sélectionner

-- Structure de la table `client` -- CREATE TABLE `client` ( `com_id` int(11) NOT NULL Auto_increment, `com_client` VARCHAR(32) default NULL, `com_region` VARCHAR(32) default NULL, `com_commercial` VARCHAR(32) default NULL, `com_portable` VARCHAR(16) default NULL, PRIMARY KEY (`com_id`), UNIQUE KEY `com_id_2` (`com_id`), KEY `id` (`com_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
comme tu peux le constater j'ai changé la table commercial en table client car dans access j'ai une table annonceur qui correspond à la premiere, ensuite j'ai une table commandes_2005 et pour terminer une table client.
En esperant avoir bien fait. Si ce n'etait pas le cas n'hesite pas à me le dire.
muriel

Mammouth du PHP | 19672 Messages

04 sept. 2005, 16:40

Voudrais-tu m'Expliquer avec quoi tu crées tes tables : c'est quoi ces index triples à chaque fois ?
Et seconde question : pourquoi as-tu mis dans la table intermédiaire les clés étrangères en VARCHAR En champ NULL en plus ?

Je veux bien t'aider, mais si tu ne comprends pas un truc, on ira plus rapidement si tu me le dis au lieu d'interpréter de travers. J'ai l'impression que tu n'as pas saisi le tôle de la table commandes_2005 dans ce schéma:

Code : Tout sélectionner

CREATE TABLE `annonceur` ( `ann_id` int(11) NOT NULL Auto_increment, `ann_annonceur` VARCHAR(32) default NULL, `ann_nom` VARCHAR(32) default NULL, `ann_telephone` VARCHAR(16) default NULL, `ann_fax` VARCHAR(16) default NULL, PRIMARY KEY (`ann_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `commandes_2005` ( `cmd_id` int(11) NOT NULL Auto_increment, `ann_id` int(11) NOT NULL , `com_id` int(11) NOT NULL , PRIMARY KEY (`cmd_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `client` ( `com_id` int(11) NOT NULL Auto_increment, `com_client` VARCHAR(32) default NULL, `com_region` VARCHAR(32) default NULL, `com_commercial` VARCHAR(32) default NULL, `com_portable` VARCHAR(16) default NULL, PRIMARY KEY (`com_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 101 Messages

04 sept. 2005, 16:56

Y am simple and stupid !!!!

j'ai tout simplement mon exemple de base qui est basé sur l'exportation de easyphp, c'est exactement comme cela qu'il me les exporte ensuite je vais dans mon bloc-notes et je fais mes changements (mais si je dois travailler avec un editeur en particulier dites le moi et je cours le telecharger) . Je crois que vous allez vous arracher les cheveux avec moi... je suis désolée de vous faire autant de soucis !!!!
pour la table intermediaire c'est une erreur de ma part je n'ai pas fais attention je le change de suite, et pour les clès en triple je fais la modif de suite aussi, lolll !!! je suis en train de prendre un cours privé de PHP...

encore merci pour tous cyrano j'espere juste que tu ne vas pas craquer à force !!!
muriel

Mammouth du PHP | 19672 Messages

04 sept. 2005, 17:05

Comme éditeur, pourquoi ne pas créer les tables directement via phpMyAdmin ? Sinon, l'éditeur d'apprentissage par excellence, c'est le bloc-notes. ;)

Mais je voudrais être sûr que tu as bien saisi le schéma et le pourquoi des trois tables, et par exemple pourquoi mettre les clés étrangères de la table commandes_2005 en INT plutôt qu'en VARCHAR :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 101 Messages

04 sept. 2005, 17:41

phpMyAdmin j'avoue que je n'y avait pas pensé je devrais peut etre m'y pencher serieusement vu mes erreurs !!!
alors pour les 3 tables, voici ce que j'ai compris (se sera plus rapide comme cela, je pense !!!) c'est pour que chacune des tables et des key differentes ??? que les informations soit mieux repartis par groupes et non pas tous dans la meme table (ça c'est ce que j'ai compris) chaque groupe a son id.
Par contre j'avoue que pour la table commandes_2005 je n'ai stritement rien compris, et je veux bien que tu m'expliques d'abord à quoi elle sert à part y mettre mes commandes mais alors comment ensuite faire le lien entre les annonceurs et les clients ??? ça c'est vrai que je ne comprend pas tres bien comment je vais faire ???
mais je te fais confiance cyrano je crois bien que tu as une idée derrière la tete ???

@++
muriel