2016-11-28 4 views
-1

Я пытаюсь декодировать json с циклом, который вставляет все объекты в мою БД, следующим является мой php-код, но у меня есть ошибка: Fatal error: нельзя использовать объект типа stdClass as массив в phptest.php на линии 21Ошибка декодирования json array

$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

Вы должны запускать только один раз. – Daerik

+1

Как выглядит var_dump '$ postdata'? Потому что я задаюсь вопросом, преобразует ли объект из js в значения post, а опубликованные данные не 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', а' $ value ['equipment'] '. Первоначальный результат был бы массивом объектов 'stdclass', поэтому он должен был быть' $ value-> оборудованием'. Ваше решение устраняет проблему, хотя – Phil

+0

@Phil Да, я имел в виду '$ value ['equipment']', '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(); 
} 
Смежные вопросы