Page 1 sur 1

tableau à deux dimensions

Posté : 23 mai 2008, 11:41
par animithra
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.

Posté : 23 mai 2008, 13:11
par guilt92
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...)

Posté : 23 mai 2008, 13:18
par animithra

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>

Posté : 23 mai 2008, 14:58
par Ryle
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 ;)

Posté : 23 mai 2008, 15:14
par animithra
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...

Posté : 23 mai 2008, 16:27
par steph29
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();

Posté : 23 mai 2008, 16:53
par animithra
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 :)