[英]how to send multidimensional array post data in php?
我正在為服務設置模擬,並嘗試將一些數據返回到我的回調頁面以保存到db表中。
這是我用來將模擬發送到回調的代碼:
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)
這樣我們就可以在這里看到我的數據,但是如何獲取它作為鍵,值對,以便我可以操作數據? 任何指導表示贊賞。
我不確定為什么您將數據作為json_string
,但是顯然json字符串被認為是url_encoded字符串,並且對您在變量中得到的內容進行解碼。
如果不需要curl_setopt
您可以將數組直接傳遞給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));
我不確定這是您要嘗試執行的操作,還是不確定它是否可以運行,因為它未經測試。 有幾個問題-Content Content-Type
標頭中有多余的單引號,curl請求的url沒有協議(盡管那可能不是問題),回調回顯了輸入數據而不是來自遠程腳本的任何響應,以及在發送之前對數據進行json_encoded的處理,因此在訪問遠程腳本之前應先解碼數據。 希望能幫助到你。
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 );
?>
您需要為CURLOPT_HTTPHEADER
設置CURLOPT_HTTPHEADER
選項:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
然后在接收數據的腳本中應使用:
$data = json_decode(file_get_contents('php://input'), true);
這樣,在$data
變量中,您將擁有與值關聯的數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.