PHP|Débutant :: Forums

Advertisement

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

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

#26 26-11-2009 12:21:53

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Menu déroulant connecté à 3 tables

Pierrot a écrit :

Elle n'est pas supposée mais affirmée big_smile:D
a++

En tout cas je ne saurais la confirmer, ni la cautionner.
Présomption d'innocence, tout de même.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#27 26-11-2009 12:24:27

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Menu déroulant connecté à 3 tables

alariclefou a écrit :

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?

http://fr2.php.net/manual/fr/language.t … source.php


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#28 26-11-2009 12:38:19

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Menu déroulant connecté à 3 tables

Je pense déjà qu'ici

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

On utilise dans la deuxième requête $fct, qui est une ressource php issue de la requête précédente, au lieu d'utiliser son contenu.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#29 26-11-2009 15:06:07

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Menu déroulant connecté à 3 tables

Et voila !!! Je mange sur le pouce, me creuse [un peu] la tete... ponds un code qui semble au demeurant assez propre... et me voila la proie de vos invectives....

Effectivement, concentré sur le 'détaillage' de fonction [pour ne pas mettre une jointure : fin pédagogique], je n'ai pas porté attention au fait que pour la 2eme requete, j'utilisais la requete elle même et non son résultat...

Bon, pour un code pondu en 15min, j'avais prévenu tongue pas eu le temps de le tester... ni même de finir mon repas ^^

P.S :
@ Pierrot : Rhouuudoudiou !!! Nanmého !!!!! Ajaxeur va ^^
@ MK : je vous remercie, Maitre, pour votre complaisance big_smilewink

Correction pour Alariclefou :

<?php
// REMPLACE :
$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'];
?>

MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#30 26-11-2009 15:31:53

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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.
@+

Hors ligne

#31 26-11-2009 15:58:41

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Menu déroulant connecté à 3 tables

Re,

Normal pour le 'vous avez choisi', vu que c'est le même soucis


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

Par contre, pour ce qui est de la création, NORMAL que ça ne fonctionne pas : j'ai bien mis l'avertissement comme quoi

// on cherche la fonction existante du nom selectionné [en disant par défaut que TT les noms ont déjà une fonction définie]

Si tu regardes attentivement le code, tu verras qu'il n'existe AUCUN INSERT INTO (donc aucune création)

Si tu souhaites avoir ce genre de chose, tu peux le faire aisément dans la partie

<?php
//---Et enfin, si les 2 champs sont renseignées, on update la table de correspondance
if (($choix1 != 'vide') AND ($choix2 != 'vide')) {
mysql_query("UPDATE egw_fonction_accounts SET fonction_id='".$choix2."' WHERE account_id = '".$choix1."'");
echo 'La fonction est mise a jour';}?>

Pour cela, il suffit d'interroger la présence d'un account_id dans ta table egw_fonction_accounts à savoir :

<?php
//---Et enfin, si les 2 champs sont renseignées, on update la table de correspondance
if (($choix1 != 'vide') AND ($choix2 != 'vide')) { // on garde la conditionnelle générale
// on teste la présence de l'enregistrement dans la table
$row= mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS cpt FROM egw_fonction_accounts WHERE account_id='".$choix1."'"));
if ($row['cpt']==0) { // si le nom n'existe pas encore dans ta table de correspondance -> ON CREE
mysql_query("INSERT INTO egw_fonction_accounts(account_id, fonction_id) VALUES ('".$choix1."','".$choix2."')");
echo 'La fonction a ete creee';}  // fin de l'insert
else { // sinon, c'est qu'il existe deja -> ON UPDATE
mysql_query("UPDATE egw_fonction_accounts SET fonction_id='".$choix2."' WHERE account_id = '".$choix1."'");
echo 'La fonction est mise a jour';} // fin de l'update
} // fin de la conditionnelle générale
?>
 

MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#32 26-11-2009 16:41:23

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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.

Hors ligne

#33 26-11-2009 17:12:28

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Menu déroulant connecté à 3 tables

tu peux me poster ta ligne [ta correction] ?


MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#34 26-11-2009 17:31:16

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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;

Hors ligne

#35 26-11-2009 17:38:59

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Menu déroulant connecté à 3 tables

Pour la requete, avec le  mysql_fetch_object(), ca devrait mieux marcher wink :

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

MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#36 26-11-2009 17:53:41

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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.

Hors ligne

#37 26-11-2009 17:55:02

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Menu déroulant connecté à 3 tables

VIDE LE CACHE de ton navigateur web !!!!!!


MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#38 27-11-2009 09:19:40

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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?

Hors ligne

#39 27-11-2009 09:42:38

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Menu déroulant connecté à 3 tables

Mon pauvre Alnoss, dans quoi te voilà embarqué.:/
Je répète, on ne doit pas utiliser directement la ressource issue d'un mysql_query il faut la parcourir (anglais to fetch) avec une une fonction de la famille mysql_fetch_


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#40 27-11-2009 10:50:36

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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.

Hors ligne

#41 27-11-2009 11:49:39

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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.

Hors ligne

#42 27-11-2009 13:02:28

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Menu déroulant connecté à 3 tables

$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."'") or die (mysql_error());

devrait te donner une indication de ce qui le dérange.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#43 27-11-2009 14:08:05

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Menu déroulant connecté à 3 tables

Ben alors, j'avais corrigé l'absence de fetch dans mon post d'hier 17:38:59...

C'est là tout le soucis de faire 50 trucs à la fois.. on en oublie les évidences wink

Je vois que vous en êtes à bosser les jointures... j'en conclu donc que ca avance bien ^^


MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#44 01-12-2009 16:08:17

alariclefou
Membre
Inscription : 20-11-2009
Messages : 19

Re : Menu déroulant connecté à 3 tables

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.

Hors ligne

Pied de page des forums