2016-10-09 2 views
0

Цель - вернуть массив из .php в формате JSON. Этот массив содержит другой массив данных (DB 49 строк, каждая из которых имеет 4 столбца), который берется форма MySql БД:Многомерный массив как ответ JSON

.php ниже:

$json = array(//this is AJAX response 
     "status" => null, 
     "username" => null, 
     "population" => null, 
     "food" => null, 
     "water" => null, 
     "map" => null //this to be an array of tiles 
    ); 

$sql = "SELECT * FROM players_map_test WHERE player_id = :value"; 
    $stmt = $pdo->prepare($sql); 
    $stmt->bindParam(':value', $value, PDO::PARAM_INT); 
    $stmt->execute(); 
    $result = $stmt->fetch(PDO::FETCH_ASSOC); 

    foreach ($result as $row) { 
     $json["map"]["tile_health"] = $row["tile_health"]; 
     $json["map"]["tile_id"] = $row["tile_id"]; 
     $json["map"]["tile_level"] = $row["tile_level"]; 
     $json["map"]["tile_type"] = $row["tile_type"]; 
    } 
echo json_encode($json); 

В моей обработчик ответа AJAX, я ожидал чтобы получить доступ к этому подматрицу как response.map и обрабатывать элементы обычным образом: response.map [0].

Когда я console.log (ответ) Я вижу, что карта присутствует там, но это не является массивом и содержит «1» в качестве значений для всех ключей:

map:Object 
    tile_health:"1" 
    tile_id:"1" 
    tile_level:"1" 
    tile_type:"1" 

Что я делаю неправильно ?

+0

'$ JSON [ "Карта"] [ "tile_health"] = $ строки [ "tile_health"];': Вы перезаписать свои значения в петля. – jeroen

ответ

0

Синтаксис следующий:

foreach ($result as $row) { 
    $json["map"][] = [ 
     "tile_health" => $row["tile_health"], 
     "tile_id" => $row["tile_id"], 
     "tile_level" => $row["tile_level"], 
     "tile_type" => $row["tile_type"] 
    ]; 
} 

Вы были перезапись значения.

+0

К сожалению, ошибка «неожиданная» ['". Если я перехожу в массив (...); результат странный: все ключи имеют одинаковые значения. – Vadimster

+0

Вы пытались использовать fetchAll вместо fetch? –

+0

Я на самом деле смотрю на это или, альтернативно, помещая оператор fetch() в цикл while! Надеюсь это работает. Я пропустил, что fetch() возвращает только один результат. – Vadimster

1

Обновление ваш Еогеасп цикл вроде как below--

foreach ($result as $row) { 
    $json["map"][] = $row; 
} 

также изменить код, приведенный ниже

#$result = $stmt->fetch(PDO::FETCH_ASSOC); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

Примечание:выборки() возврата функции только один ряд. И fetchAll() Функция возвращает несколько строк.

+0

Этот результат, похоже, дает некоторый результат, но, к сожалению, у меня есть только одна строка данных вместо 49 строк. Ид этой строки 49, хотя ... Кажется, я что-то переписываю? – Vadimster

+0

Я обновил свой ответ. Пожалуйста, проверьте мой ответ. @Vadimster –

+0

Или вы можете назначить $ json ["map"] [] = $ result; После использования fetchAll() @Vadimster –

0

Вы можете упростить свою часть базы данных, как это:

// request only needed columns 
$sql = "SELECT tile_health, tile_id, tile_level, tile_type 
     FROM players_map_test WHERE player_id = :value"; 

$stmt = $pdo->prepare($sql); 
$stmt->bindParam(':value', $value, PDO::PARAM_INT); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

// output was already in the type of array 
$json["map"] = $result; 

// encode and display 
echo json_encode($json); 
Смежные вопросы