【问题标题】:Pass Array from JS to PHP and create SESSION variable将数组从 JS 传递到 PHP 并创建 SESSION 变量
【发布时间】:2019-05-31 03:29:15
【问题描述】:

我想将一个数组从 JS 传递到 PHP,然后在那里使用它,我收集 JS 中的值并将它们发送到另一个文件,在那里我尝试将其转换为 $_SESSION 变量,但是当我对此执行 var_dump它给了我一个带有逗号分隔值的字符串。有更好的方法吗?

我的 JS:

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);

PHP:

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

【问题讨论】:

  • 你确定它给你一个逗号分隔值的字符串,还是更像["value_1", "value_2", "value_3"]
  • 是的,我做var_dump($_SESSION['values']);,它返回C:\wamp64\www\<directory>\<file>:<line>:string 'value1,value2,value3,value4,value5
  • 您可以将数组字符串化为您发布到 PHP 的 json 字符串,然后在 PHP 中对其进行解码。
  • @executable 我没有得到您的标记作为可能的重复答案。我觉得旗帜应该被移除。这对于以后可能想要发布更多答案的其他人来说是不公平的。

标签: javascript php arrays session


【解决方案1】:

更好的方法是使用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;
            }
        }
    });
};

您可以使用 JSON 对象作为数据变量。

【讨论】:

  • 他不会使用 jQuery
  • “更好的方法是使用 jQuery $.ajax()” - 为什么包含一个 100kb 臃肿的 js 库会是一种“更好”的方法?
  • 为什么这个“更好”?在其他地方不使用外部依赖项时包含它吗?
  • 您好,感谢您的回答,我可能会回来使用 jQuery。
  • @PaddyHallihan - 如果你想学习正确的开发,我会坚持你现在得到的,而不是解决问题。您不想成为“库”开发人员(实际上并不了解该语言的开发人员,但只了解少数库)。使用工具和库并没有什么问题,但是仅仅为此包含一个 100kb 的库对于最终用户来说是多余的和不利的(需要下载所有额外的膨胀)。
【解决方案2】:

您应该将您的数组转换为 JSON,例如:

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);

PHP

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

【讨论】:

  • 我这样做了,只是更改了一行$_SESSION['values'] = json_decode($_POST['values']); 并得到了想要的结果
【解决方案3】:

您的原始代码的问题是使用数组作为FormData.append() 的值参数(应该是一个字符串,JavaScript 引擎已将您的数组类型转换为您的情况)。

如果您改为使用相同的键名和一对空方括号(例如values[])附加每个值,PHP 会自动为您将它们组成一个数字数组。

JavaScript:

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);

PHP:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2011-07-14
    • 2011-10-29
    • 2018-08-05
    相关资源
    最近更新 更多