tableau à deux dimensions

Eléphant du PHP | 174 Messages

23 mai 2008, 11:41

Bonjour à tous et toutes.

Adepte de php mais pas du JavaScript, j'ai une petite question concernant une fonction php/javascript (je sais ce n'est pas commun mais bon...).

Voici une fonction php utilisée par le système informatisé :
function creerUtilisateurEspace() {
  print("<script type='text/javascript'>
  var idUtilisateur = new Array();
  var nbUtilisateur = new Array();
  </script>
  ");
  $sql = "SELECT * FROM espace";
  $req = mysql_query($sql);
  $nbEspace = mysql_num_rows($req);
  if($nbEspace!=0){
    while($data = mysql_fetch_assoc($req)){
      $j = 1;
      $sql2 = "SELECT utilisateur FROM espaceUtilisateur WHERE espace='".$data['id']."' and associe LIKE 'oui'";
      $req2 = mysql_query($sql2);
      $nb_result2 = mysql_num_rows($req2);
      if($nb_result2!=0){
        while($data2 = mysql_fetch_assoc($req2)){
          print("<script type='text/javascript'>
          nbUtilisateur[".$data['id']."] = ".$nb_result2.";
          idUtilisateur[".$data['id'].",".$j."] = ".$data2['utilisateur'].";
          </script>
          ");
          $j++;
        }
      }
    }
  }
}
Ce code s'appuie sur les tables suivantes :

Code : Tout sélectionner

CREATE TABLE espace ( id int unsigned auto_increment, libelle varchar(255) not null, primary key(id) )type=InnoDB; CREATE TABLE utilisateur ( id int unsigned auto_increment, pseudo varchar(255) not null unique, pwd varchar(255) not null, rang set('bronze','argent','or') not null default 'bronze', tel varchar(255) not null, email varchar(255) not null, primary key(id) )type=InnoDB; CREATE TABLE espaceUtilisateur ( espace int unsigned, utilisateur int unsigned, associe set('oui','non'), primary key(espace,utilisateur), foreign key(espace) references espace(id), foreign key(utilisateur) references utilisateur(id) )type=InnoDB;
Les enregistrements contenus dans la table espace :

1,admin
2,GEH

Les enregistrements contenu dans la table utilisateur(id,pseudo) :

1,useror
2,userargent
3,userbronze
4,toto

Les enregistrements contenu dans la table espaceUtilisateur :

1,1,oui
1,2,oui
1,3,oui
2,4,oui

Lors de l'exécution de cette fonction php, j'ai testé la valeur des différents paramètres :

idUtilisateur[".$data['id'].",".$j."] = ".$data2['utilisateur'].";
$data['id']
$j
$data2['utilisateur']

Au sein de la seconde boucle while, si je fais un alert(idUtilisateur[1,1]) il me retourne bien 1.
Pourtant si je fais le même alert à la fin de la fonction php, il me retourne 4.

Donc je me retrouve avec :
idUtilisateur[1,1] = 4
idUtilisateur[1,2] = 2
idUtilisateur[1,3] = 3
idUtilisateur[2,4] = 4

D'où peut provenir cette erreur, et qu'elle pourrait être la méthode la plus adaptée pour ce genre de fonction ?

Merci de votre lecture et de votre patience.
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Mammouth du PHP | 1353 Messages

23 mai 2008, 13:11

Quand tu affiches le code source généré de ta page, tu as quoi comme lignes écrites ? (sur les parties <script type='text/javascript'> bien sur...)
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 174 Messages

23 mai 2008, 13:18

Code : Tout sélectionner

<script type='text/javascript'> nbUtilisateur[1] = 3; idUtilisateur[1,1] = 1; </script> <script type='text/javascript'> nbUtilisateur[1] = 3; idUtilisateur[1,2] = 2; </script> <script type='text/javascript'> nbUtilisateur[1] = 3; idUtilisateur[1,3] = 3; </script> <script type='text/javascript'> nbUtilisateur[2] = 1; idUtilisateur[2,1] = 4; </script>
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mai 2008, 14:58

Il manque les déclaration de tableau pour dire que nbUtilisateur et idUtilisateur sont des Array().

Par ailleurs, un tableau à deux dimensions n'est rien de plus qu'un tableau de tableaux. Pour accéder au 2ème élément du premier tableau on utilise : idUtilisateur[0][1] et non pas idUtilisateur[0,1] dont l'interprétation de la valeur de l'index est laissée aux bonnes graces de Javascript :)

Ps : colle les balises <script> en dehors de la boucle, ca sera plus léger et plus lisible ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 174 Messages

23 mai 2008, 15:14

Les déclarations du tableau sont faites un peu plus haut.

Oui, effectivement je viens de sortir les balises <script> ainsi que les nbUtilisateur[] qui étaient initialisés plus de fois que nécessaires.

Je teste si idUtilisateur[1][1] me fournit le bon résultat et je tag en résolu le cas échéant.

Merci de vos réponses en tous cas :)

[EDIT 1] :
je viens de tester et arf, ça ne vas pas.
Si j'utilise un appel à idUtilisateur[1][1], il me dit qu'il ne connaît pas.
Si j'initialise en faisant idUtilisateur[1][1] = 1 il me dit qu'il ne connaît pas les propriétés de idUtilisateur[1] :s

Je vous avais prévenu que le JavaScript n'était pas trop mon truc ? :D
Sinon si vous avez un bon tutoriel sur les tableaux à deux dimensions je chercherai comment faire (personnellement ceux que j'ai trouvé jusqu'à présent se contentaient de survoler le sujet sans vraiment expliquer la démarche...)

[EDIT 2]
je pense pas que ça vienne de la méthode d'appel, Ryle, puisqu'en dehors d'idUtilisateur[1,1] les autres valeurs sont correctement retournées...
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Eléphant du PHP | 175 Messages

23 mai 2008, 16:27

Si j'utilise un appel à idUtilisateur[1][1], il me dit qu'il ne connaît pas.
Si j'initialise en faisant idUtilisateur[1][1] = 1 il me dit qu'il ne connaît pas les propriétés de idUtilisateur[1] :s
logique javascript est moins permissif que php :twisted:

il me semble qu'avant de declarer idUtilisateur[1][1] il faut declarer idUtilisateur[1]

Code : Tout sélectionner

soit idUtilisateur[1]=true; ou idUtilisateur[1]=Array();
et j'irais meme plus loin en faisant des le depart un

Code : Tout sélectionner

var idUtilisateur=Array();

Eléphant du PHP | 174 Messages

23 mai 2008, 16:53

J'avais bien le idUtilisateur = Array() en début de code mais effectivement il fallait ajouter un idUtilisateur[1].

Pour ceux qui seraient intéressés par le code corrigé, le voici :
function creerUtilisateurEspace() {
  print("<script type='text/javascript'>
  var idUtilisateur = new Array();
  var nbUtilisateur = new Array();
  </script>
  ");
  $sql = "SELECT * FROM espace";
  $req = mysql_query($sql);
  $nbEspace = mysql_num_rows($req);
  if($nbEspace!=0){
    while($data = mysql_fetch_assoc($req)){
      $j = 1;
      $sql2 = "SELECT utilisateur FROM espaceUtilisateur WHERE espace='".$data['id']."' and associe LIKE 'oui'";
      $req2 = mysql_query($sql2);
      $nb_result2 = mysql_num_rows($req2);
      if($nb_result2!=0){
        print("<script type='text/javascript'>
        idUtilisateur[".$data['id']."] = new Array();
        </script>
        ");
        while($data2 = mysql_fetch_assoc($req2)){
          print("<script type='text/javascript'>
          nbUtilisateur[".$data['id']."] = ".$nb_result2.";
          idUtilisateur[".$data['id']."][".$j."] = ".$data2['utilisateur'].";
          </script>
          ");
          $j++;
        }
      }
    }
  }
}
Merci beaucoup de votre aide à tous, et bon développement :)
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)