1
votes

Passer Array de JS à PHP et créer une variable SESSION

Je veux passer un tableau de JS à PHP puis l'utiliser là-bas, je rassemble les valeurs dans JS et les envoie dans un autre fichier où j'essaye de le transformer en une variable $ _SESSION mais quand je fais un var_dump sur ce cela me donne une chaîne avec des valeurs séparées par des virgules. Y a-t-il une meilleure façon de faire cela?

Mon JS:

if(isset($_POST['values'])){
    $_SESSION['values'] = $_POST['values'];
}

PHP:

var value_1 = document.getElementById("value_1").value;
var value_2 = document.getElementById("value_2").value;
var value_3 = document.getElementById("value_3").value;
var value_4 = document.getElementById("value_4").value;
var value_5 = document.getElementById("value_5").value;

var values = [];
values.push(value_1);
values.push(value_2);
values.push(value_3);
values.push(value_4);
values.push(value_5);

var formData = new FormData();
formData.append("values", values);
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
    if(this.readyState == 4 && this.status == 200){
        // success
    }
};
xmlhttp.open("POST", "myfile.php", true);
xmlhttp.send(formData);


7 commentaires

Êtes-vous sûr qu'il vous donne une chaîne avec des valeurs séparées par des virgules, ou est-ce plutôt comme ["value_1", "value_2", "value_3"] ?


ouais je fais var_dump ($ _ SESSION ['values']); et il renvoie C: \ wamp64 \ www \ \ : : string 'value1, valeur2, valeur3, valeur4, valeur5


Vous pouvez stringifier le tableau en une chaîne json que vous publiez sur PHP, que vous décoderez ensuite en PHP.


Quelqu'un peut-il me dire ce qui le convertit en chaîne, est-ce le JS qui l'envoie ou le définit-il en session? Comme est-il déjà converti en chaîne lorsque le fichier PHP le récupère en tant que message?


Copie possible de Envoi de tableaux via Ajax / JSON sans JQuery


@executable Je n'obtiens pas votre signalement comme une possible duplication et une réponse. Je pense que le drapeau devrait être retiré. Ce n'est pas juste pour les autres qui voudront peut-être publier plus de réponses ultérieurement.


Pardon, comment puis-je le supprimer?


3 Réponses :


-3
votes

La meilleure façon est d'utiliser la fonction jQuery $ .ajax ():

_this.sendAjaxRequest = function (url, data, callback, errorCallback) {

    var _type = $.inArray($.type(data), ['string', 'object']) > -1 ? 'post' : 'get';

    var request  = $.ajax({
        'url'      : url,
        'type'     : _type,
        'dataType' : 'json',
        'data'     : data,
        'cache'    : false,
        'success'  : function(response) {
            if (typeof callback != 'undefined' && callback) {
                callback.call(_this, response);
                return;
            }
        },
        'error'    : function(response) {
            if (typeof errorCallback != 'undefined' && errorCallback) {
                errorCallback.call(_this, response);
                return;
            }
        }
    });
};

Vous pouvez utiliser un objet JSON comme variable de données.


6 commentaires

Il n'utilise pas jQuery


"La meilleure façon est d'utiliser jQuery $ .ajax ()" - Pourquoi inclure une bibliothèque js gonflée de 100 Ko serait une "meilleure" façon?


Pourquoi est-ce «meilleur»? Inclure une dépendance externe lorsqu'elle n'est utilisée nulle part ailleurs?


Salut merci pour votre réponse, je reviendrai peut-être utiliser jQuery.


@PaddyHallihan - Si vous voulez apprendre le développement approprié, je m'en tiendrai à ce que vous avez maintenant et je réglerai les problèmes à la place. Vous ne voulez pas être un développeur de "bibliothèque" (un développeur qui ne connaît pas réellement le langage, mais seulement quelques bibliothèques). Il n'y a rien de mal à utiliser des outils et des bibliothèques, mais inclure une bibliothèque de 100 Ko juste pour cela est excessif et mauvais pour l'utilisateur final (qui a besoin de télécharger tout ce surplus de volume).


Mieux - parce que cela fait gagner du temps et simplifie le code et que vous n'avez pas à développer et à prendre en charge vos propres wrappers sur XMLHttpRequest. À des fins éducatives, il est bon d'apprendre plus profondément, bien sûr.



1
votes

Vous devez convertir votre tableau en JSON, comme:

<?php
session_start();
if(isset($_POST['values'])){
    $_SESSION['values'] = $_POST['values'];
}

PHP

var value_1 = document.getElementById("value_1").value;
var value_2 = document.getElementById("value_2").value;
var value_3 = document.getElementById("value_3").value;
var value_4 = document.getElementById("value_4").value;
var value_5 = document.getElementById("value_5").value;

var values = [];
values.push(value_1);
values.push(value_2);
values.push(value_3);
values.push(value_4);
values.push(value_5);

var json_upload = "values=" + JSON.stringify({values});
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "myfile.php");
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(json_upload);


1 commentaires

Je l'ai fait et je viens de changer une ligne $ _SESSION ['values'] = json_decode ($ _ POST ['values']); et j'ai obtenu le résultat souhaité



0
votes

Votre problème avec votre code d'origine était l'utilisation d'un tableau comme argument de valeur pour FormData.append () (doit être une chaîne dans laquelle le moteur JavaScript a transtypé votre tableau dans votre cas).

Si vous ajoutez à la place chaque valeur avec le même nom de clé avec le suffixe d'une paire vide de crochets (par exemple, valeurs [] ), PHP les formera automatiquement dans un tableau numérique pour vous.

/ p>

JavaScript:

<?php
session_start();
if(isset($_POST['values'])){
    $_SESSION['values'] = $_POST['values'];
}

PHP:

var formData = new FormData();
for(var i = 1; i <= 5; i++) {
    formData.append("values[]", document.getElementById("value_" + i).value);
}
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
    if(this.readyState == 4 && this.status == 200){
        // success
    }
};
xmlhttp.open("POST", "myfile.php", true);
xmlhttp.send(formData);


0 commentaires