#php #mysql #arrays
#php #mysql #массивы
Вопрос:
Цель состоит в том, чтобы вернуть массив из .php в формате JSON. Этот массив должен содержать другой массив данных (49 строк DB, каждая из которых имеет 4 столбца), который берется из базы данных MySQL:
.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(ответ) Я вижу, что там присутствует map, но это не массив, и он содержит «1» в качестве значений для всех ключей:
map:Object
tile_health:"1"
tile_id:"1"
tile_level:"1"
tile_type:"1"
Что я делаю не так?
Комментарии:
1.
$json["map"]["tile_health"] = $row["tile_health"];
: Вы перезаписываете свои значения в цикле.
Ответ №1:
Обновите цикл foreach, как показано ниже—
foreach ($result as $row) {
$json["map"][] = $row;
}
Также измените приведенный ниже код
#$result = $stmt->fetch(PDO::FETCH_ASSOC);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
fetch() Примечание: функция возвращает только 1 строку. И функция fetchAll() возвращают несколько строк.
Комментарии:
1. Это, кажется, дает некоторый результат, но, к сожалению, у меня есть только 1 строка данных вместо 49 строк. Однако идентификатор этой строки равен 49… Кажется, я снова что-то переписываю?
2. Я обновил свой ответ. Пожалуйста, проверьте мой ответ. @Vadimster
3. Или вы можете напрямую назначить $json[«map»][] = $resu< После использования fetchAll() @Vadimster
Ответ №2:
Синтаксис следующий:
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"]
];
}
Вы перезаписывали значения.
Комментарии:
1. К сожалению, получаю сообщение об ошибке «unexpected ‘[‘». Если я перейду в array(…); результат будет странным: все ключи будут иметь одинаковые значения.
2. Вы пытались использовать fetchAll вместо fetch?
3. Я на самом деле изучаю это или, в качестве альтернативы, помещаю оператор fetch() в цикл while! Я надеюсь, что это сработает. Я пропустил, что функция fetch() возвращает только один результат.
4. Этот код работал со мной:
foreach ($result as $row) { $json["map"][] = array( "tile_health" => $row["tile_health"], "tile_id" => $row["tile_id"], "tile_level" => $row["tile_level"], "tile_type" => $row["tile_type"] ); }
Ответ №3:
Вы можете упростить свою часть базы данных следующим образом:
// 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);