8791 sujets

Développement web côté serveur, CMS

Salut,

J'ai un code JavaScript dans laquel je créé une Array de la manière suivante:


var myArray = new Array();
...
myArray'['key']'= {'att_01': val_01, 'att_02': val_02};

NB: La clé est un String.

Puis je la passe en POST vers une page Php mais je n'arrive pas a parcourir les clés et attributs de celle-ci. Smiley ohwell


    if (isset($_POST['myArray']))
    {
         $myArray = $_POST['myArray'];

         foreach ($myArray as $key)
         {
              echo $key.'<br>';
         } 
    }



Le if est bien passé mais le foreach n'accepte pas $myArray >>
<b>Warning</b>: Invalid argument supplied for foreach()

Comment je peux faire pour la parcourir?
Modifié par Glopp (25 May 2009 - 10:56)

echo $myArray['PIERRE'].' <br>';

--> <b>Notice</b>:  Uninitialized string offset:  0


Pourtant la clé 'PIERRE' existe bien côté JavaScript .
Salut,

A mon avis ton tableau Javascript est devenu une simple chaine quand tu l'as envoyé en POST.

Juste pour savoir, tu l'envoies comment en POST ? Tu mets myArray dans un champ texte que tu soumets ?
Pour envoyer l'array je passe par un Ajax.Request de la librairie Prototype ( permet de traiter un page php en arrière plan).

Voila a quoi cela ressemble:

var myArray = new Array();
...
remplissage de l'array
...
var url = './test.php';
var param = 'myArray='+myArray;

    var AjaxRequest = new Ajax.Request(
       url,
       {
       method:	'post',
       parameters:	param,
       onSuccess:	function(response){}.bind(this),
       onfaillure: function(){Console.log('Error: request Failure!')}
	});


Sinon j'envoie bien en POST mais en paramètre je mets directement l'objet Array.
Et à parement c'est que mon Array javascript n'est pas reconnue par php.

Il y a bien ça:
http://www.php.net/manual/en/ref.json.php
Donc peut être que la solution serait de créer mon Array au format json (car il me semble reconnu en javascript) puis une fois envoyer à la page php et faire un json_decode($myArray).
masseuro:

["myArray"]=>
string(0) ""

Smiley sweatdrop
Dans la firebug je n'avais rien d affiché non plus pour ma variable lors des requests, je pensais que c'était du fait que c'était une Array Smiley confus
Heu ... Je ne sais pas où tu as pris l'exemple d'envoyer les paramètres comme ça à la librairie Prototype, mais c'est totalement faux. La clé parameters doit elle aussi contenir un objet de la forme :

{ 'key1' : 'valeur1', 'key2' : 'valeur2' }

Donc pour récupérer ta variable comme tu le souhaites, je pense que la bonne syntaxe est :

var param = { 'myArray' : myArray };
Pour ma pars j'ai toujours initialisé les paramètres de mes Ajax.Request de cette manière:

var param = 'arg_1='+val_1+ '&arg_2='+val_2+...+'&arg_N='+val_N;

Jusqu'à présent jamais de soucis. Smiley ohwell

En initialisant param comme tu m'as dit j'obtiens sur l'appel de var_dump($_POST):

array(0) {
}

Et l'onglet post dans la console Firebug est vide.
Modifié par Glopp (19 May 2009 - 15:02)
On pourrait peut-être voir un peu plus de code ? Comme ta variable myArray avant qu'elle ne soit envoyée.
Si je remplace l'Array par un String, l'argument myArray passe bien (avec les deux méthodes)

array(1) {
  ["myArray"]=>
  string(3) "ici"
}
Merci pour ton aide Agylus.

Pour ma variable myArray, je l'initialise comme expliqué en début de post.
Tu veux quelles autres informations?

Par contre à chaque clés je créé quatre attributs dont deux stockant des pointeurs sur des éléments de DOM (utilisé pour d'autre traitement).

Mais peut être que c'est ça qui plante.
Glopp a écrit :
Pour ma variable myArray, je l'initialise comme expliqué en début de post.
Tu veux quelles autres informations?

Justement, tu viens de changer ce premier post.

Et la syntaxe est encore fausse. D'autant plus que tu ne peux pas passer de tableau associatif il me semble avec Prototype, tu es obligé de passer un objet :

myArray = {
   'key1' : {'att_01': val_01, 'att_02': val_02},
   'key2' : {'att_03': val_03, 'att_04': val_04},
   ...
}
Oui j'ai changer le premier post car les crochets pour myArray Smiley key n'apparaissaient pas, j'ai donc juste mis des quotes.

En fait mon tableau est remplis dynamiquement, je ne peux donc pas l'initialiser comme tu le propose.


var myArray = {

   'key1' : {'att_01': val_01, 'att_02': val_02},
   'key2' : {'att_03': val_03, 'att_04': val_04},
}


N'est pas équivalent à :


var myArray = new Array();

   myArray['key1'] = {'att_01': val_01, 'att_02': val_02};
   myArray['key2'] = {'att_03': val_03, 'att_04': val_04};
}

Smiley sweatdrop Smiley sweatdrop
Tu peux essayer, au lieu de mettre new Array, de l'initialiser comme ça :

var myArray = {};

Et après tu affectes les couples clés/valeurs normalement.
Normalement? pas comme je fais?

je viens de tester sans passer par new Array():

array(1) {
  ["myArray"]=>
  string(15) "[object Object]"
}


Par contre ca passe toujours pas avec le for each

<b>Warning</b>:  Invalid argument supplied for foreach()
Glopp a écrit :
pas comme je fais?

Si si.

var myArray = {};
myArray['key1'] = {'att_01': val_01, 'att_02': val_02};
myArray['key2'] = {'att_03': val_03, 'att_04': val_04};

var param = {'myArray' : myArray};
Finalement je passe par encodage JSON , le tableau est bien visible dans les paramètres de $_POST.


var myArray = {};

myArray['key1'] = {'att_01': val_01, 'att_02': val_02};
myArray['key2'] = {'att_03': val_03, 'att_04': val_04};
...

var param = {'myArray' : $H(myArray).toJSON()};


reste à décoder correctement le JSON en réception.
Je vais finir par ne pas aimer les array, Smiley decu

Au moment de l'envoi de tableau json vers la page php, j'ai bien quelque chose de cohérent:

{"BATIMENT": {"id": "1", "amount": "121221"}, "EIA": {"id": "2", "amount": "1212121221"}}


Une fois du côté php:

$provisions =  $_POST['provisions'];

echo $provisions; [b]// {\"BATIMENT\": {\"id\": \"1\", \"amount\": \"121221\"}, \"EIA\": {\"id\":\"2\", \"amount\": \"1212121221\"}}[/b]

$provisions = json_decode($provisions, true);
			
echo $provisions; [b]// rien[/b]

var_dump($provisions); [b]// NULL[/b]				


Ya -til des includes a insérer pour utiliser les fonctions JSON de php? (je suis sur EasyPhp 3 avec php 5.2.8) Smiley decu
Pour m'en sortir j'ai supprimé les anti-slash du tableau JSON avant décodage:

$provisions = str_replace('\"','"',$_POST['provisions']);
$provisions = json_decode($provisions, true);


Cela marche pour mon cas car j'envoies des données sans caractères spéciaux, sinon je pense qu'il faut mettre ces fichiers en utf-8.