通过AJAX将数据从PHP返回给JavaScript - 数据类型错误?

3

我将使用AJAX返回一个查询到我的JavaScript函数,但我在返回json_encode时遇到了问题。可能是数据类型出现了错误,但我想在此处寻求一些建议。

这是我的AJAX请求:

$.ajax({
            url: 'testajax.php',
            method: 'POST',
            data: {value},
            dataType:'json',
            success: function(data){
                console.log(data);}
});

这是我的PHP脚本:

<?php
require 'login.php';
$connection = new mysqli($host, $user, $pword, $database, 3306);
$insertquery = $connection->prepare("SELECT tracking_type, tracking_change_date, vessel_fcm_new, vessel_hull_id_new, vessel_name_new, vessel_length_new, vessel_manufacturer_new, vessel_manufacturer_id_new, vessel_year_new, vessel_value_new, owner_id_new, loss_payee_id_new, policy_id_new, policy_start_date_new, policy_end_date_new FROM tracking WHERE tracking_type = ?");
$insertquery->bind_param("i", $trackingtype);
//$trackingtype = $_POST['value'];
$trackingtype = 1;
$insertquery->execute();
$insertquery->bind_result($tracking_type, $tracking_change_date, $vessel_fcm_new, $vessel_hull_id_new, $vessel_name_new, $vessel_length_new, $vessel_manufacturer_new, $vessel_manufacturer_id_new, $vessel_year_new, $vessel_value_new, $owner_id_new, $loss_payee_id_new, $policy_id_new, $policy_start_date_new, $policy_end_date_new);
while ($insertquery->fetch()){
    $data = array($tracking_type, $tracking_change_date, $vessel_fcm_new, $vessel_hull_id_new, $vessel_name_new, $vessel_length_new, $vessel_manufacturer_new, $vessel_manufacturer_id_new, $vessel_year_new, $vessel_value_new, $owner_id_new, $loss_payee_id_new, $policy_id_new, $policy_start_date_new, $policy_end_date_new);
    echo json_encode($data);
}

如果查询结果只有1行,那么它可以正常工作。但是一旦添加了另一行匹配的查询结果,它就不能正确返回到JavaScript函数,但在浏览器中显示正常(如果您访问testajax.php)。
目前数据返回的方式如下。也许我使用的数据类型有误:
["Insert","2018-05-26","JBL5693",null,"Makers Mark","22","sdgfsg3","256632asdasd",2014,263,"217","11",null,null,null]["Insert","2018-05-27","fFH465","FDDEE453","GIIGE","22","Shippers","2432465we",2014,205222,"Smith Jones","Capital One",null,null,null]
4个回答

1
这一段可能已经给了你提示:如果查询只有一行匹配,那么它可以正常工作 所以将您的行保存在一个数组中,然后像这样发送整个数组。
while ($insertquery->fetch()){
    $data[] = array($tracking_type, $tracking_change_date, $vessel_fcm_new, 
                $vessel_hull_id_new, $vessel_name_new, $vessel_length_new, 
                $vessel_manufacturer_new, $vessel_manufacturer_id_new, 
                $vessel_year_new, $vessel_value_new, $owner_id_new,     
                $loss_payee_id_new, $policy_id_new, $policy_start_date_new, 
                $policy_end_date_new);
}
echo json_encode($data);

这段代码的简单测试如下:

EDIT:

$data[] = array('Insert','2018-05-26', 1);
$data[] = array('Insert','2018-05-26', 2);

echo json_encode($data);

这将生成


[
 ["Insert","2018-05-26",1],
 ["Insert","2018-05-26",2]
]

并非您建议的示例输出。

这是我之前尝试过的东西,所以现在返回的数据看起来像这样:[["Insert","2018-05-26","JBL5693",null,"Makers Mark","22","sdgfsg3","256632asdasd",2014,263,"217","11",null,null,null]][["Insert","2018-05-26","JBL5693",null,"Makers Mark","22","sdgfsg3","256632asdasd",2014,263,"217","11",null,null,null],["Insert","2018-05-27","fFH465","FDDEE453","GIIGE","22","Shippers","2432465we",2014,205222,"Smith Jones","Capital One",null,null,null]] 然而,console.log(data[0]); 或 data[1] 不起作用。 - dataviews
我不明白这段代码怎么会生成那个JSON字符串。 - RiggsFolly
那你没有完全按照我的建议去做。请看我的编辑。 - RiggsFolly
我现在很自责....我忘记把编码移到循环外面了 ;) --- 我想那可能是我的问题所在,哈哈.. 感谢您的建议! - dataviews
没问题,我们都曾经历过这个。 - RiggsFolly

0
你应该返回一个对象数组,而不是多个对象。
$to_return = [];
while ($insertquery->fetch()){
    $data = array($tracking_type, $tracking_change_date, $vessel_fcm_new, $vessel_hull_id_new, $vessel_name_new, $vessel_length_new, $vessel_manufacturer_new, $vessel_manufacturer_id_new, $vessel_year_new, $vessel_value_new, $owner_id_new, $loss_payee_id_new, $policy_id_new, $policy_start_date_new, $policy_end_date_new);
    $to_return[] = $data;
}

echo json_encode($to_return);

这是我之前尝试过的东西,所以现在返回的数据看起来像这样:[["插入","2018-05-26","JBL5693",null,"制造商标记","22","sdgfsg3","256632asdasd",2014,263,"217","11",null,null,null]][["插入","2018-05-26","JBL5693",null,"制造商标记","22","sdgfsg3","256632asdasd",2014,263,"217","11",null,null,null],["插入","2018-05-27","fFH465","FDDEE453","GIIGE","22","托运人","2432465we",2014,205222,"史密斯琼斯","Capital One",null,null,null]]然而,console.log(data[0]); 或 data[1] 不起作用。 - dataviews
@dataviews 更新了我的回答。 - Rusty
1
不要忘记将其解析为JSON。当使用dataType:'json'时,这是不必要的。 - RiggsFolly

0
问题在于您在每次循环通过打印列数组,并因此导致JSON未正确编码为数组的数组; 您可以按以下方式修改您的代码:
$results = array();
while ($insertquery->fetch()) {
  $newResult = array($tracking_type, $tracking_change_date, ...);
  array_push($results, $newResult);
}
$encoded = json_encode($results);
echo $encoded;

将会打印出类似于这样的内容:

[
    ["Insert","2018-05-26","JBL5693", ...],
    ["Insert","2018-05-27","JBL5694", ...],
    ...
]

请注意最好设计一个客户端<>服务器接口来使用对象数组,类似于以下内容:
[
    {"tracking_type": "Insert", "tracking_change_date": "2018-05-26", "vessel_fcm_new": "JBL5693", ...},
    {"tracking_type": "Insert", "tracking_change_date": "2018-05-26", "vessel_fcm_new": "JBL5693", ...},
    ...
]

这种方法的优点在于客户端不需要知道列的顺序,而是可以直接访问它关心的属性。


0

请确保保留

echo json_encode($data);

while循环之外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接