2016-11-28 84 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(); 
}