2016-11-28 122 views
-1

我试图解码与一个循环,插入的所有对象,以我的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" 
    } 
] 
+1

你应该只运行你的foreach一次。 – Daerik

+1

'$ postdata'的var_dump是什么样的?因为我想知道它是否将js中的对象转换为后值,并且发布的数据不是json。 [因为这里发布的json似乎没有什么问题](https://3v4l.org/T1Nme) –

+1

试试'json_decode($ postdata,true)'强制结果成为关联数组 – Phil

回答

1

您尝试使用访问的对象喜欢你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')"; 

} 
} 
+0

我说这不是'foreach'但'$值“设备”]'。最初的结果应该是'stdclass'对象的数组,所以它应该是'$ value-> equipment'。您的解决方案修复该问题虽然 – Phil

+0

@Phil是啊,我的意思'$值“设备”]','foreach'本身可以同工作。 –

+0

不确定你的意思。在OP的原始代码和你的答案中,'$ request'是**总是**一个数组。这是阵列中不同的项目 – Phil

1

可以使用$value->equipment代替$value[equipment]因为返回的值不是不是一个数组而是一个stdClass的对象。

1

寻址房间里的其它象; 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(); 
}