如何在PHP中发送多维数组的POST数据?

3
我正在设置一个模拟服务,并尝试返回一些数据到我的回调页面以保存到数据库表中。
这是我用来发送模拟调用的代码:
function checkCallback(){

            $ch = curl_init("remote.domain.com/callback.php");

$jsonData = [


    "success" =>true,      
    "error" => null, 
"response"=> [
        "code"=>"ad3f0db2-62b6-4cf4-9027-14829d33cfd2",
        "state"=>"my-secret-state-123456789"
    ]

            ];

            $jsonDataEncoded = json_encode($jsonData);

            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);


            $result = curl_exec($ch);


            var_dump($result);
            echo $jsonDataEncoded;
              curl_close($ch);

}

callback.php:

<?php 


var_dump(get_defined_vars());

$un = 'username';
$pw = 'password';
$dsn = "mysql:host=localhost;port=3306;dbname=safelocal;charset=utf8";
$pdo_options = array(PDO::ATTR_EMULATE_PREPARES => false, 
                     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);


$db = new PDO($dsn, $un, $pw, $pdo_options);



    $updateUserData = $db->prepare('INSERT into `table` (`message`, `extra`) VALUES(:msg, :extra)');
            $updateUserData->execute([
                ':msg' =>$_POST["response"],
                ':extra' => $_POST["code"]
                                ]);

我得到的只是这个奇怪的回复:
myfile.php:77:string 'array(4) {
  ["_GET"]=>
  array(0) {
  }
  ["_POST"]=>
  array(1) {
    ["{"success":true,"error":null,"response":{"code":"ad3f0db2-62b6-4cf4-9027-14829d33cfd2","state":"my-secret-state-123456789"}}"]=>
    string(0) ""
  }
  ["_COOKIE"]=>
  array(0) {
  }
  ["_FILES"]=>
  array(0) {
  }
}
' (length=291)

所以我们可以在这里看到我的数据,但是如何将其作为键值对来操作数据?任何指导都将不胜感激。

看起来你得到的响应是来自var_dump,而不是任何数据库调用 ~ 尝试并查看在callback.php脚本中执行print_r( $_POST )时会得到什么 - Professor Abronsius
将整个数据结构加载到键中,而不是每个键值对中。 - Frankenmint
你为什么要将数据作为JSON编码传递? - u_mulder
我强烈建议使用像 Guzzle 这样的 Http 客户端来进行 http 请求并处理响应。使用纯 curl_ 函数从/向资源获取/发送数据会产生比你想象的更多的头疼和错误。 - edigu
3个回答

2
我不确定你为什么要传递你的数据作为“json_string”,但显然,一个json字符串被认为是一个url_encoded字符串,并且在变量中解码。如果不需要json,你可以直接将数组传递给“curl_setopt”或使用“http_build_query”进行编码。
// passing raw array:
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);

// passing query string:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($jsonData));

我不确定这是所有情况下的正确解决方法,但至少让我模拟了我所需的内容,并且对我来说是朝着正确方向迈出的一步。直接将我的数组传递到http_build_query中可以解决问题,而setopt对于嵌套数组并不好用。 - Frankenmint

0

我不确定这是否是您尝试做的事情,或者它是否能够正常工作,因为它没有经过测试。有几个问题- Content-Type头部有多余的单引号,curl请求的URL没有协议(虽然这可能不是问题),回调函数输出的是输入数据而不是远程脚本的任何响应,并且由于在发送之前对数据进行了json编码,因此在访问远程脚本之前应该对其进行解码。希望这可以帮到您。

function checkCallback(){
    $ch = curl_init("http://remote.domain.com/callback.php");

    $jsonData = array(
        "success" =>true,      
        "error" => null, 
        "response"=> array(
            "code"=>"ad3f0db2-62b6-4cf4-9027-14829d33cfd2",
            "state"=>"my-secret-state-123456789"
        )
    );

    $jsonDataEncoded = json_encode( $jsonData );

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded );
    curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/json" ) ); 


    $result = curl_exec($ch);
    curl_close($ch);

    echo $result;
}


<?php

    $un = 'username';
    $pw = 'password';

    $dsn = "mysql:host=localhost;port=3306;dbname=safelocal;charset=utf8";
    $pdo_options = array(
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );

    $data=json_decode( $_POST );
    $msg=$data['response'];
    $extra=$data['code'];



    $db = new PDO( $dsn, $un, $pw, $pdo_options );

    $updateUserData = $db->prepare('INSERT into `table` (`message`, `extra`) VALUES (:msg, :extra)');
    $updateUserData->execute( array(
        ':msg'      =>  $msg,
        ':extra'    =>  $extra
    ));

    /* send any response data */
    print_r( $data );

?>

0
你需要为curl设置CURLOPT_HTTPHEADER选项:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

然后在接收数据的脚本中,您应该使用:

$data = json_decode(file_get_contents('php://input'), true);

这样,$data 变量中将包含具有值的关联数组。


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