如何在 PHP 中获取 JSON 数组并打印其值?

Posted

技术标签:

【中文标题】如何在 PHP 中获取 JSON 数组并打印其值?【英文标题】:How to get JSON array in PHP and print its value? 【发布时间】:2017-10-20 09:49:46 【问题描述】:

实际上我已经创建了一个包含表行值的数组,我想使用 jQuery 将数组传递给 php 文件,并且我想将它存储在 mysql 数据库中。

我的做法是:

var myTableArray = [];

$("table#tbl-nitem tr").each(function() 
    var arrayOfThisRow = [];
    var tableData = $(this).find('td');
    if (tableData.length > 0) 
        tableData.each(function() 
            arrayOfThisRow.push($(this).text());
        );

        alert(arrayOfThisRow);
        arrayOfThisRow.shift();
        myTableArray.push(arrayOfThisRow);
    
);
//myTableArray.shift();
alert(myTableArray);

var jsonString = JSON.stringify(myTableArray);
$.ajax(
    type: "GET",
    url: "script_expenses.php",
    data: 
        data: jsonString
    ,
    cache: false,

    success: function(response) 
        if (response == "ok") 
            alert("OK");
         else 
            alert(response);
        
    
);

上面的代码将创建、存储数组并将其传递给 .php 文件

$conn = require_once 'db_connection.php';
//echo $conn;
session_start();
$data = $_GET['data'];
json_encode($data);

//  $sql = "INSERT INTO my_table ( fname, lname ) VALUES ( ?,? )"; 
//$ins = 

$sql = "INSERT INTO expenses_list VALUES (?, ?, ?, ?, ?, ?)";
$stmt = mysqli_prepare($conn, $sql);

foreach($data as $row) 
    mysqli_stmt_bind_param('ss', 'TEA');
    mysqli_stmt_bind_param('ss', $row['Purpose']);
    mysqli_stmt_bind_param('ss', $row['UnitPrice']);
    mysqli_stmt_bind_param('ss', $row['Qty']);
    mysqli_stmt_bind_param('ss', $row['DTime']);
    mysqli_stmt_bind_param('ss', $row['Description']);
    $result = mysqli_stmt_execute($stmt);


flush();

上面的代码将接收数组并尝试存储在数据库中。 但我在 foreach 语句中遇到错误: 为每个提供的参数无效

我搜索了一下,才知道接收值不是数组。 怎么解决???

【问题讨论】:

您应该使用json_decode($data) 而不是json_encode($data) 你应该使用$data = json_decode($_GET['data']); $data = json_decode($_GET['data'],true); 变量个数和字符串类型的长度必须与语句中的参数相匹配。 嗨,该错误现已解决,但我收到更多错误,因为 mysqli_stmt_bind_param 预计参数 1 为 mysqli_stmt,字符串 【参考方案1】:

只是做

$data = $_GET['data'];

$data = json_decode($data,true);

现在你可以在 foreach 循环中使用 $data 更新 1

$conn =  require_once'db_connection.php';
session_start();
$data = $_GET['data'];
$data = json_decode($data,true);

$sql    = "INSERT INTO expenses_list VALUES (?, ?, ?, ?, ?, ?)";
$stmt   = mysqli_prepare($conn,$sql);

foreach($data as $row)
    mysqli_stmt_bind_param('s', 'TEA');
    mysqli_stmt_bind_param('s', $row['Purpose']);

    //mysqli_stmt_bind_param('s', $row['UnitPrice']);
    //if UnitPrice is double values then use
    mysqli_stmt_bind_param('d', $row['UnitPrice']);

    //mysqli_stmt_bind_param('s', $row['Qty']);
    //if Qty is integer then use
    mysqli_stmt_bind_param('i', $row['Qty']);
    mysqli_stmt_bind_param('s', $row['DTime']);
    mysqli_stmt_bind_param('s', $row['Description']);
    $result = mysqli_stmt_execute($stmt);

在 mysqli_stmt_bind_param 请使用以下类型

i 对应变量的类型为整数

d 对应变量的类型为 double

对应的变量是字符串类型

b 对应的变量是一个 blob,会以数据包的形式发送

更多参考请查看http://php.net/manual/en/mysqli-stmt.bind-param.php

【讨论】:

嗨,试过了,但错误的性质与 mysqli_stmt_bind_param 期望参数 1 为 mysqli_stmt, 字符串相同 嘿 J Salaria,我认为您没有添加正确的类型,请检查更新 1 个答案 你是对的,我已经浏览了链接并更新了我的代码,但仍然遇到同样的错误 好的 echo $_GET['data']; 让我知道输出是什么 作为,我正在添加... TEA,OFFICE,1, 3, 20/MAY/2017-14:46, EVENING, 3 我得到 [["TEA","OFFICE ","1","3","20/MAY/2017-14:46","晚上","3"]]【参考方案2】:

使用json_decode()设置第二个参数true当为TRUE时,返回的对象会被转换成关联数组。

$data = json_decode($_GET['data'],true);

注意:阅读文档你的代码有很多错误prepared statement

1) 变量的数量和字符串类型的长度必须与语句中的参数相匹配。您为每个变量添加了双 ss

mysqli_stmt_bind_param('s', $row['Purpose']); //remove one s because your binding one variable only 

2) 将 variables 绑定到准备好的语句,作为不接受 string

的参数

$tea ='TEA'; mysqli_stmt_bind_param('s', $tea);

变量应该通过引用传递给绑定参数。不接受字符串。

3) mysqli_stmt_bind_param 第一个参数是 $stmt 。你错过了。添加它。

4) (?) 问号的数量与数字绑定变量匹配,否则会出错。

5)

i   corresponding variable has type integer

d   corresponding variable has type double

s   corresponding variable has type string

b   corresponding variable is a blob and will be sent in packets

更新 1:

        $tea ='TEA';
    foreach($data as $row)
        mysqli_stmt_bind_param($stmt,'s', $tea); // s denotes   corresponding variable has type string
        mysqli_stmt_bind_param($stmt,'s', $row['Purpose']);
        mysqli_stmt_bind_param($stmt,'s', $row['UnitPrice']);
        mysqli_stmt_bind_param($stmt,'s', $row['Qty']);
        mysqli_stmt_bind_param($stmt,'s', $row['DTime']);
        mysqli_stmt_bind_param($stmt,'s', $row['Description']);
        $result = mysqli_stmt_execute($stmt);
    

【讨论】:

嗨,我试过了,但没有成功,错误的性质仍然与 mysqli_stmt_bind_param 期望参数 1 为 mysqli_stmt, 字符串相同 是的,错过了通过声明。在我的更新 1 @JSalaria 中检查我的更新答案 我也试过了,但我得到了 mysqli_stmt_bind_param() 的错误:变量数与准备语句中的参数数不匹配 (?) 个问号与数字变量匹配,否则会出现此错误。检查你的陈述【参考方案3】:

将 json 转换为数组。使用下面的代码

$datajson = $_GET['data'];
$dataarray = json_decode($datajson, true);

【讨论】:

以上是关于如何在 PHP 中获取 JSON 数组并打印其值?的主要内容,如果未能解决你的问题,请参考以下文章

PHP怎么随机获取数组里面的值?

如何在php中打印json文件数组中的数据

如何在json中编码php数组并解析成jquery

PHP - JSON 到数组,迭代并打印到字符串

如何在 C++ 的头文件中定义字符串数组并设置其值?

如何在 PHP 中遍历数组并获取键值