解码JSON数组错误
问题描述:
我试图解码与一个循环,插入的所有对象,以我的DB一个JSON,下面是我的PHP代码,但我有错误:致命错误:无法使用类型stdClass的对象为阵列中phptest.php第21行解码JSON数组错误
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}else{
foreach($request as $key => $value) {
$equip = $value['equipment'];
$sql = "INSERT INTO contratos (equipo) VALUES ('$equip')";
}
}
我发布具有角的JSON,下面的代码是我controller.js
$scope.continue = function(choices)
{
var data = $scope.choices;
$http.post('php/phptest.php', data)
.then(function(response) {
console.log(response);
});
};
而JSON
[
{
"id":"choice1",
"quantity":1,
"equipment":"BLONG - F25",
"teamvox":true,
"plandatos":"D50"
},
{
"id":"choice2",
"quantity":1,
"equipment":"OUTERFONE - S17",
"evidence":true,
"mobictrl":true,
"plandatos":"D100"
}
]
答
您尝试使用访问的对象喜欢你foreach
循环内的数组。但是json_decode
产生了一个对象。您可以通过将true
传递给第二个参数来更改此行为。
$postdata = file_get_contents("php://input");
$request = json_decode($postdata, true);
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}else{
foreach($request as $key => $value) {
$equip = $value['equipment'];
$sql = "INSERT INTO contratos (equipo) VALUES ('$equip')";
}
}
答
可以使用$value->equipment
代替$value[equipment]
因为返回的值不是不是一个数组而是一个stdClass的对象。
答
寻址房间里的其它象; SQL注入漏洞
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
// make MySQLi throw exceptions
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli($servername, $username, $password, $dbname);
$stmt = $conn->prepare('INSERT INTO `contratos` (`equipo`) VALUES (?)');
$stmt->bind_param('s', $equip);
foreach ($request as $data) {
$equip = $data->equipment; // $data is a stdclass
$stmt->execute();
}
你应该只运行你的foreach一次。 – Daerik
'$ postdata'的var_dump是什么样的?因为我想知道它是否将js中的对象转换为后值,并且发布的数据不是json。 [因为这里发布的json似乎没有什么问题](https://3v4l.org/T1Nme) –
试试'json_decode($ postdata,true)'强制结果成为关联数组 – Phil