【问题标题】:PHP Can't Read Array Sent by AJAX [duplicate]PHP无法读取AJAX发送的数组[重复]
【发布时间】:2012-12-16 09:15:27
【问题描述】:

可能重复:
send arrays of data from php to javascript

我正在将一个带有 ajax 的数组发送到一个 php 文件。数组是应存储在数据库中的名称列表。为了仔细检查这一点,我尝试回显在 php 文件中创建的sql_query。但响应总是

为 foreach() 提供的参数无效...

所以我在 SO 中搜索了一些解决方案,答案通常是“你的 'Array' 不是 Array”。所以我回应了提交给 php 的数组,它在一行上返回所有传递的名称(我认为这意味着数组到达 php 文件中)。

这是我的 JS...

var tourneyData = {
    tName : tourneyName,
    tNum : number,
    tNames : names, // this is an array
    tInt : international,
    tLig : liga,
    tStars : stars
};

$.ajax({
    type: "POST",
    url: "php/storeTourney.php",
    data: tourneyData,
    datatype: "json",
    success: function(response){
        alert("response " + response);
    }
});

...和 ​​PHP 代码

$tName = $_POST['tName'];
$tNum = $_POST['tNum'];
$tNames = $_POST['tNames'];
$tInt = $_POST['tInt'];
$tLig = $_POST['tLig'];

$insert = "";
foreach($tNames as $d){ // line pointed in the error message
    $insert += "INSERT INTO NAMES VALUES('test', '".$d."');";
}

echo $insert;

我不完全理解代码中有什么问题。如果$tNames 显然是一个数组,那么foreach() 语句中可能有什么问题?

【问题讨论】:

  • 你确定是数组吗?你有var_dump它来验证是这样吗?如果是数组就不会报错。
  • $tNames = (array)$_POST['tNames'];
  • 我同意 jMax,在您的 PHP 文件顶部添加一些测试数据,并确保在使用 JavaScript 发送之前逻辑正常
  • 在这种情况下,PHP 只看到格式化为 Javascript 数组的字符串。你得想办法把js数组转成PHP数组。
  • 这可能是另一个问题的类似副本,但它不是提议的副本的完全相同的副本。是相反的问题,从 JS 到 PHP,而不是从 PHP 到 JS。

标签: php javascript ajax arrays json


【解决方案1】:

您需要向 php 提示您要将数据作为数组获取。将 tNames 命名为 tNames[]

var tourneyData = {
    tName : tourneyName,
    tNum : number,
    'tNames[]' : names, // this is an array
    tInt : international,
    tLig : liga,
    tStars : stars
};

在此处找到的示例: http://api.jquery.com/jQuery.post/

如果您要发送更复杂的对象或 n 维数组,则需要考虑使用 JSON。你可以在JS端使用{object: JSON.stringify(object)},在PHP端使用json_parse($_POST['object'])

【讨论】:

  • 这是唯一不会引发错误的解决方案。但是,现在返回插入语句会导致警报“响应 0”。现在,在返回 var_dump($tNames) 时,它不会返回 NULL,而是返回表明该变量是一个数组的信息。但我刚刚发现我以错误的方式连接了 php 文件中的字符串 (+=)
  • 啊,是的!不要把你的 PHP 和 JS 混在一起(用 . vs + 连接)。有时来回切换可能很困难。我通常会在我的 JS 中添加 $ 符号……那是偶然的。
  • 现在唯一的问题是,它在php中被识别为数组,但是这个数组只包含一个元素。假设我在 JS 中有一个数组,例如 ['one','two','three'],在 php 中我得到了数组 ['onetwothree'],因为它返回“插入名称值('test','onetwothree' '). 抱歉发布一个新问题...
  • (这是 echo var_dump() 时的响应:response array(1){[0]=>string(11) "onetwothree"})
  • 我唯一的怀疑是您的 javascript 在执行帖子之前以某种方式使 tNames 成为字符串。尝试将 tNames 硬编码到一个数组中,看看会发生什么。或者,如果您使用 firebug 或等效的,您可以检查网络选项卡并确保请求作为数组正确发送(应为 tNames[]=one & tNames[]=two & tNames[]=three
【解决方案2】:

除了格式错误的请求外,您还提交了一个 javascript 数组,PHP 将其解释为字符串。从另一个 SO 线程复制的解决方案。

加雷斯在Pass Javascript Array -> PHP

您可以使用 JSON.stringify(array) 在 JavaScript 中对数组进行编码,然后使用 $array=json_decode($_POST['jsondata']);在您的 PHP 脚本中检索它。

【讨论】:

    【解决方案3】:

    由于您正在尝试对字符串进行 foreach,因此您需要使用 json_decode 将其转换为对象以对其进行迭代。

    $tNames = json_decode($_POST['tNames']);
    

    见:http://php.net/manual/en/function.json-decode.php

    【讨论】:

      【解决方案4】:

      您的 JavaScript 中缺少 POST 变量名称:

      (...)
      
      $.ajax({
          type: "POST",
          url: "php/storeTourney.php",
          data: {"data":tourneyData},
          datatype: "json",
          success: function(response){
              alert("response " + response);
          }
      });
      

      现在在 POST 后的数据上尝试 var_dump:

      var_dump($_POST['data']);
      

      【讨论】:

      • 您所做的只是将他的各个帖子变量封装到一个对象中。
      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 2018-01-18
      • 2019-03-29
      • 2015-10-11
      • 2014-05-13
      相关资源
      最近更新 更多