PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Bonjour, désolé pour ne pas avoir répondu avant.
En fait, tu avais bien corrigé l'absence de fetch dans ton post du 26/11/09 à 17:38:59,
j'ai simplement changé le mysql_fetch_object par un mysql_fetch_array et ça fonction très bien.

Pour mon problème de requête, j'ai toujours pas trouvé pourquoi elle ne marche pas dans phpmyadmin sous easyphp.
J'ai donc essayé d'avancer en passant directement à ma base en ligne et ai pu confirmer que ma requête renvoi vient le titre et non pas le fonction_id.
En revanche je me trouve confronté à un autre problème que je n'explique pas.

Si ma table egw_fonction_accounts est vide, ou ne contient pas l'account_id correspondant

par exemple à un nouveau membre: account_id 10 = toto

une fois ce toto sélectionné dans le menu, on obtient juste

Vous avez choisi : toto

Le second menu n'apparait pas. Je ne peux donc pas aller jusqu'à l'update ou la mise à jour de cette entrée.

J'ai donc créé une fonction qui compare les account_id dans les tables egw_accounts et egw_fonction accounts et si besoin est, va mettre à jour la seconde table.
Comme ça, l'account_id existe bien et on passer à la suite.


//----Verifier contenu de account_id
 
$maj= mysql_fetch_assoc(mysql_query("SELECT egw_accounts.account_id, egw_fonction_accounts.account_id
AS id FROM egw_accounts
LEFT JOIN egw_fonction_accounts ON egw_accounts.account_id = egw_fonction_accounts.account_id
WHERE egw_fonction_accounts.account_id IS NULL"
));

  if ($maj['id']==NULL) { // si l'account_id n'existe pas encore dans ta table de correspondance -> ON CREE

mysql_query("INSERT INTO egw_fonction_accounts( account_id )
SELECT egw_accounts.account_id
FROM egw_accounts
LEFT JOIN egw_fonction_accounts ON egw_accounts.account_id = egw_fonction_accounts.account_id
WHERE egw_fonction_accounts.account_id IS NULL "
);

echo 'La liste a ete mise a jour';}  // fin de l'insert
  else { // sinon, c'est qu'il existe deja -> ON NE FAIT RIEN

echo 'La liste a ete verifie';} // fin de l'update
 // fin de la conditionnelle générale
 

Cela fonctionne bien, mais m'affiche toujours:

La liste a ete mise a jour, qu'il manque des entrées ou non.

Plus embêtant, une fois que l'account_id existe,

fonction_id   |   account_id 
      1                     10

on accède donc au second menu.
Si on sélectionne un autre titre que celui validé précédemment, il crée une nouvelle ligne avec le même account_id et non pas une simple mise à jour de celle existante.

fonction_id   |   account_id 
      1                    10
      3                    10

Voilà ou j'en suis pour le moment.
Comme je n'avance plus, je vais passer à la deuxième étape de mon projet: la transformation de ce script en plugin.
Je vous tiens au courant des évolutions.

#2 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Lorsque je met ça:
[c]$row = mysql_query("SELECT titre AS fct FROM `egw_fonction_accounts` AS `t1`
        LEFT JOIN `egw_accounts` AS `t2` USING(`account_id`)
        LEFT JOIN `egw_fonction` AS `t3` USING(`fonction_id`)
        WHERE account_id='".$choix1."'");
        echo ', ça fonction actuelle est : '.$row['fct'];
        while ($result = mysql_fetch_array($row)) {echo "<OPTION VALUE='$result[0]'>$result[0]</OPTION>\n";}
        $fct = $row['fct'];[/c]

j'obtien le message d'erreur suivant:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource pour la ligne
[c]while ($result = mysql_fetch_array($row)) {echo "<OPTION VALUE='$result[0]'>$result[0]</OPTION>\n";}[/c]
je ne vois pas ce qui le derange.

#3 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Merci Maljuna Kris, grâce à ton conseil, j'ai résolut le problème de l'affichage du nom dans la seconde page. Voici le code:

REMPLACER
[c]$row = mysql_fetch_object(mysql_query("SELECT account_lid AS nom FROM egw_accounts WHERE account_id='".$choix1."'"));
echo 'Vous avez choisi : '.$row['nom'];[/c]

PAR
[c]$row = mysql_query("SELECT account_lid AS nom FROM egw_accounts WHERE account_id='".$choix1."'");
        echo 'Vous avez choisi : '.$row['nom'];
        while ($result = mysql_fetch_array($row)) {echo "<OPTION VALUE='$result[0]'>$result[0]</OPTION>\n";}[/c]

J'ai tenté la même chose sur l'affichage du titre déjà attribué, c'est-à-dire le titre sélectionné précédemment pour une personne et qui doit apparaitre par défaut dans le menu si il existe.
Cela fonctionne. J'ai bien l'info qui s'affiche mais c'est pas le titre (webmaster...) mais le fonction_id (3...) qui s'affiche.
J'ai tenté de reformuler ma requête, mais je me confronte à un nouveau problème, à savoir que ma requête fonctionne sur ma base en ligne, maisn pas sur ma la base en local sur laquelle je travail pour l'instant.
Pourtant ce sont les mêmes tables, j'ai fait un exportation donc même structure.
Voici la requête que j'imaginais

[c]SELECT account_lid, titre FROM `egw_fonction_accounts` AS `t1`
        LEFT JOIN `egw_accounts` AS `t2` USING(`account_id`)
        LEFT JOIN `egw_fonction` AS `t3` USING(`fonction_id`)
        where account_lid = 'lopez'[/c]

ce qui donnerait en php
[c]$fct = mysql_query("SELECT titre AS fct FROM `egw_fonction_accounts` AS `t1`
        LEFT JOIN `egw_accounts` AS `t2` USING(`account_id`)
        LEFT JOIN `egw_fonction` AS `t3` USING(`fonction_id`)
        WHERE account_id='".$choix1."'");
       
        echo ', ça fonction actuelle est : '.$row['fct'];
        while ($result = mysql_fetch_array($fct)) {echo "<OPTION VALUE='$result[0]'>$result[0]</OPTION>\n";}[/c]

Pour en revenir à ma requete, sur ma base en ligne cela me donne le nom et le titre alors que sur ma base en local j'obtiens:7
#1054 - Champ 'egroupware_test.t2.fonction_id' inconnu dans on clause.
C'est rageant de toujours avoir à demander, mais ça doit être le métier qui rentre.
Si quelqu'un peut m'expliquer ce qui cause ce problème, d'avance merci.

#4 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Bonjour, je viens donc de tester ta correction et mal heureusement ça n'a pas résolu le problème.
Pour info, la première correction, à savoir:

[c]
$fct = mysql_query("SELECT fonction_id FROM egw_fonction_accounts WHERE account_id='".$choix1."'");

//PAR :

$row = mysql_query("SELECT fonction_id AS fct FROM egw_fonction_accounts WHERE account_id='".$choix1."'");

$fct = $row['fct'];[/c]

a fait la même chose. Je m'explique.
Avant la correction j'avais:

Vous avez choisi : Resource #5

puis Resource #6 affiché dans le menu déroulant avant de l'ouvrir. Une fois ouvert j'avais Resource #6 , directeur, agent accueil, webmaster.

La correction n'a fait que supprimer l'affichage de Resource #6, c'est a dire que lorsque j'arrive sur la seconde page, rien n'est affiché dans le menu déroulant, il faut l'ouvrir pour voir apparaitre les options.
Ce qui me fait dire que ça ne corrige pas l'info, elle n'apparait toujours pas, mais son message d'erreur non plus.
ça pourrait venir de quoi?

#5 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Je crois que j'ai un gros bug avec easyphp vu que tout à l'air de fonctionner alors que je suis revenu à la version qui n'était pas encore corrigé.
De plus il m'affiche un bouton de retour à la page principal que je viens seulement d'installer sur la dernière version corrigé.
De toute façon j'ai plus le temps de voir ça aujourd'hui, je te tiens au courant dès demain.
Merci pour tout ça, bonne soirée.

#6 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Voici ma ligne corrigé, mais ça donne la même chose que toi, c'est-à-dire qu'il n'affiche pas le nom

$row  = mysql_query("SELECT account_lid AS nom FROM egw_accounts WHERE account_id='".$choix1."'");
$nom = $row['nom']
echo 'Vous avez choisi : '.$nom;

#7 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Pour la création j'étais déjà dessus, mais tu code beaucoup plus vite que moi. J'y serais peut-être arrivé mais pas avant demain au moins.
En revanche pour le 'vous avez choisi', ça ne fonctionne pas, j'obtiens le même résultat qu'avec ma correction, à savoir pas de nom.

Ce qui ne me semble pas logique vu qu'effectivement on dirait bien que c'est le même problème que pour le menu déroulant.

#8 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Bonjour Alnoss,
je vois qu'en plus tu assure le SAV...
ta correction fonctionne, mais ne corrige que l'erreur Ressource #6 qui se trouvait dans le menu déroulant.
J'ai tenté de corrigé l'erreur Ressource #5 qui correspond à l'affichage du nom (choix1) dans la seconde page en m'inspirant de cette méthode.
Je n'ai effectivement plus le message d'erreur puisque je n'ai plus de message du tout.
C'est à dire que je me retrouve avec

Vous avez choisi : puis le menu déroulant en dessous.

En revanche, l'update fonctionne bel et bien. C'est la création qui ne marche pas.
@+

#9 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

indique typiquement que l'on a confondu une ressource PHP (recordset retourné par MYSQL) avec le contenu de ladite ressource.

Bonjour, je ne comprend pas ce que ça veux dire, je dois chercher quoi pour corriger l'erreur. Il faut convertir les données?

#10 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Bonjour, j'ai réussi à me connecter à ma base en local.
J'ai donc pu test ton code. ça fonctionne sauf que:
après avoir sélectionné le nom qui renvoi vers une autre page, j'obtiens le message:

[large]Vous avez choisi : Resource id #5[/large] et [large]Resource id #6[/large] dans le menu déroulant.

Malgré ça, je peux tout de même sélectionner le titre qui me renvoi à la 3ème page affichant:

[large]La fonction est mise a jour[/large]

sauf que quand je vérifie ma bdd, rien n'a changé, que l'enregistrement existe déjà ou non.

Je me demande si ça ne viendrais pas de la structure de ma base.
Qu'en pense tu?

#11 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Whoaaaa
Merci beaucoup. C'est incroyable. T'as réussi à coder ça en quelques heures seulement. J'en suis encore à chercher comment affiche le second menu après avoir validé le premier.
J'ai pas encore testé ton code mais à le lire comme ça, je pense que c'est tout bon.
Comme j'ai un souci de connexion à ma base en local, je pourrai pas te faire de feedback tout de suite, mais bientôt.
En tout cas, y a pas mal de chose qui me sont inconnu. Je vais bosser dessus pour essayer de tout comprendre.
Merci encore.

#13 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Je viens de trouver comment faire pour l'update, enfin je crois:

    [c] UPDATE `groupware_resurgences2`.`egw_fonction_accounts`  SET `fonction_id` = ( SELECT fonction_id
         FROM egw_fonction
         WHERE titre = 'webmaster' )
         WHERE (`egw_fonction_accounts`.`fonction_id`) = (SELECT fonction_id FROM egw_fonction WHERE titre = 'directeur' )
         AND (`egw_fonction_accounts`.`account_id`) = (SELECT account_id FROM egw_accounts WHERE account_lid = 'nagele' )[/c]

Il ne me reste plus qu'a trouver comment écrire une fonction en php pour faire remplacer 'webmaster', 'directeur' et 'nagele' par les valeurs sélectionné dans les menu.
Mais je suis toujours bloqué sur cette histoire de validation qui me fait passer au menu suivant.
Est-ce que je dois utiliser du javascript, parce que là je n'y connais rien du tout.

#14 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Voilà, j'ai une première table egw_accounts qui contient account_id(PK) et account_lid (avec les noms).
Ensuite j'ai egw_fonction qui contient fonction_id(PK) , titre (avec les fonctions occupé: directeur, webmaster, agent d'accueil) et poste (poste1, poste2, poste3).
Il s'agit là d'un jeu d'essai.
Enfin, j'ai une table egw_fonction_accounts qui contient fonction_id et account_id

egw_accounts:                                     egw_fonction:                                                           egw_fonction_accounts

account_id  | account_lid                       fonction_id    |     titre               |    poste                    fonction_id       |       account_id

10              |      toto                                    1          |  directeur          |    poste1                        1                            10
20              |      tata                                    2          |  agent d'accueil  |    poste2                        2                            20
30              |      titi                                      3          |  webmaster       |     poste3                        3                            30
40              |      tete                                    3          |  webmaster       |     poste3                        3                            40     

Pour le moment, ma page s'appelle test.php
Ce que je veux faire c'est, en partant du principe que egw_fonction_account est vide:
afficher dans le menu: toto
                                 tata
                                 titit
                                 tete
une fois toto selectionné, afficher un autre menu avec directeur
                                                                              agent d'accueil
                                                                              webmaster
si je valide directeur, je dois enregister dans egw_fonction_account
                       
                                                                   fonction_id     |       account_id

                                                                        1                          10
si je reviens et re-sélectionne  toto, il doit m'afficher le menu avec directeur sélectionné.
si je veux changer directeur par webmaster, il devra faire un update dans egw_fonction_account pour afficher

                                                                                           fonction_id     |       account_id

                                                                                               3                          10
Voilà très clairement ce que je cherche à faire.
Je suis vraiment débutant alors merci d'avance pour ton aide.

#15 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Merci pour ta réponse, mais ce n'est pas exactement ce que je demandais.
J'ai un peu de mal à formuler mon problème, ça viens de moi.
En fait, sur une page en php, je dois afficher un menu déroulant comportant des noms.
Une fois validé, je veux afficher un second menu déroulant comportant des fonctions (webmaster, agent d'accueil, ...).
Si je valide, cela dois updater le fonction_id de la table egw_fonction_accounts.

Dans la requete
       [c]UPDATE `egw_fonction_accounts`
           SET `fonction_id` = '3'
           WHERE `fonction_id`= '2'[/c]

je change 2 par 3. Mais en réalité, à l'écran , je veux changer agent d'accueil par webmaster.
Il faut donc que ma requete face le lien entre webmaster et 3, et agent d'accueil et 2.
Tu comprends?

#16 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Bonjour, je reviens vers vous car je suis bloqué.
J'ai trouver comment formuler certaine requêtes pour afficher le titre (ex:webmaster) correspondant au nom (account_lid) à l'aide d'une jointure:

[c]SELECT titre FROM `egw_fonction_accounts` AS `t1`
        LEFT JOIN `egw_accounts` AS `t2` USING(`account_id`)
        LEFT JOIN `egw_fonction` AS `t3` USING(`fonction_id`)
        where account_lid = 'blablabla'[/c]

Cela ne fonctionne que si les enregistrement existent déjà.
S'il n'existe pas il faut le créer.
Ce qu'il faudrait c'est que le titre sélectionné (ex: agent d'accueil) update la fonction_id dans la table egw_fonction_accounts lorsque l'account_id correspond au nom sélectionné.

J'ai trouvé ici comment faire un update dans phpmyadmin, mais je ne trouve pas comment modifier la requetes pour obtenir ce que je veux:
           [c]UPDATE `groupware_resurgences2`.`egw_fonction_accounts`
               SET `fonction_id` = '3'
               WHERE CONVERT( `egw_fonction_accounts`.`fonction_id` USING utf8 ) = '2'
               AND CONVERT( `egw_fonction_accounts`.`account_id` USING utf8 ) = '23' LIMIT 1 [/c]
avec ça je fait passer blablabla du statut de webmaster à celui d'agent d'accueil.

Si quelqu'un à une idée...
Merci d'avance

#17 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Encore une fois désolé Alnoss, c'est vrai que dans la précipitation j'ai écrit deux fois le même nom de table. Il fallait lire egw_accounts pour la seconde table.

C'est super, ça fonctionne.
J'ai réussi à rentrer deux account_id pour le même fonction_id dans la table egw_fonction_accounts.

Donc maintenant je peux élaborer des requêtes pour vérifier l'existence d'une valeur dans le champ fonction_id.
Merci beaucoup.
Je vais plancher un peu dessus et reviendrai vous faire part de mes avancées.

#18 Re : MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

Désolé, comme je le disais, je suis débutant y compris sur les forums. Merci d'avoir rectifié la présentation de mon message.

En effet, je pense que c'est la bonne démarche.

Disons qu'avant de faire mon interface graphique, je veux déjà faire fonctionner les requêtes directement dans la bdd, mais je ne sais pas comment faire avec cette 3ème table.
Je l'ai appelé egw_fonction_accounts avec fonction_id et account_id pour reprendre les PK de chaque table utilisé, mais quand je rentre mon jeu d'essai, je me rend compte que ça va pas.
Dans la table egw_fonction j'ai fonction_id:1 - titre:directeur - poste: poste 1
                                            fonction_id:2 - titre:agent d'accueil - poste: poste 2
                                            fonction_id:3 - titre:webmaster - poste: poste 3

dans la table egw_fonction je rentre account_id: 10 fonction_id:1
                                                    account_id: 23 fonction_id:2
                                                    account_id: 24 fonction_id:3
mais dès que je veux faire             account_id: 25 fonction_id:3, j'ai une erreur vu que les id doivent être unique.
Comment faire alors pour que plusieurs personnes occupe la même fonction?

#19 MySQL, PostgreSQL, etc... » Menu déroulant connecté à 3 tables » 01-12-2009 16:08:17

alariclefou
Réponses : 43

Bonjour, je suis en stage et complètement novice dans le domaine et je ne sais pas trop comment faire.

Voilà mon problème:

Toutes les informations proviennent d'une base géré par phpmyadmin.
Je dois créer une interface graphique en php qui va proposer dans un menu déroulant, les noms des membres.
Un fois sélectionné, un autre menu déroulant doit, soit m'afficher la fonction occupé (si elle existe déjà), soit me permettre de la sélectionné et de la valider pour la prochaine visite de cette page. Sachant que plusieurs personne peuvent occuper la même fonction.

Pour cela, j'ai: - une table accounts avec : account_id et account_lid (qui contient le nom des membres)
                      - une table fonction avec fonction_id, titre (qui contient la fonction occupé) et poste (qui contient le numéro du poste informatique).

J'ai trouvé comment faire pour afficher les menu et leur contenu, mais sans aucune interaction entre.

Je pense qu'il faudrait créer une 3ème table qui contiendra le fonction_id et account_id pour y enregistrer les valeurs sélectionné ci-dessus.
Le problème étant que plusieurs personnes peuvent occuper la même fonction.
Je ne sais pas par quoi commencer.

Voici mon code provisoire:


<label for="account_lid">nom : </label>
<label for="account_lid">fonction : </label>
<?php
$host = "blablabla";
$user = "blablabla";
$bdd = "blablabla";
$passwd  = "blablabla";
// Connexion au serveur & bdd
mysql_select_db($db,mysql_connect($host,$user,$passwd));
// Les Requetes
$req = mysql_query("SELECT account_lid FROM egw_accounts ORDER BY account_id") or die(" Erreur lors de la requête : " . mysql_error());
$req2 = mysql_query("SELECT titre FROM egw_fonction") or die("Erreur lors de la requête 2:".mysql_error());
// Les Select
echo "<SELECT NAME='account_id' onChange='FocusObjet()'>";
  while ($result = mysql_fetch_array($req)) {echo "<OPTION VALUE='$result[0]'>$result[0]</OPTION>\n";}
echo "<SELECT NAME='titre' onChange='FocusObjet()'>";
  while ($result2 = mysql_fetch_array($req2)) {echo "<OPTION VALUE='$result2[0]'>$result2[0]</OPTION>\n";}
echo "</SELECT>";
mysql_close();
?>

En plus celui-ci affiche nom: fonction: suivi des menu déroulant respectifs. Je ne sais pas comment les afficher correctement.

Merci d'avance pour votre aide.

Pied de page des forums

Propulsé par FluxBB