18.06.2020, 07:42
|
Интересующийся
|
|
Регистрация: 24.03.2019
Сообщений: 21
|
|
Вывод элементов массива
В ответе сервера получаю массив, и вывожу из него элементы в таблицу, затем отдельно показываю последний элемент (ed), а вот первый (sd) показать не получается, помогите пожалуйста
function(data) {
sc = "<h2>" + data.user.name + "</h2>";
var wf = "";
var sd = "";
var ed = "";
$.each(data.list, function(index, val) {
wf += "<tr><td>" + val.dt_txt + "</td>";
wf += "<td>" + val.main.min + "</td>";
wf += "<td>" + val.main.max + "</td>";
wf += "<td>" + val.wind.speed + "</td></tr>";
ed = "<span>End" + val.dt_txt + "</span>";
sd = "<span>Start" + val.dt_txt + "</span>";
});
$("#showС").html(sc);
$("#start").html(sd);
$("#end").html(ed);
$("#showT").html(wf);
}
|
|
18.06.2020, 07:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
А что значит первый? index - это индексы массива, он может указывать на первый элемент массива (у вас массив объектов). А val, это свойства объектов, где val.dt_txt, это не первый элемент, а свойство dt_txt объектов. Вы переменной постоянно присваиваете это свойство (переопределяется), а значит по окончанию работы цикла в ней будет значение этого свойства последнего объекта массива data.list. Если нужно значение первого объекта, тогда в цикле так:
if(!index) sd = "<span>Start" + val.dt_txt + "</span>";
Последний раз редактировалось laimas, 18.06.2020 в 11:33.
|
|
18.06.2020, 13:08
|
Интересующийся
|
|
Регистрация: 24.03.2019
Сообщений: 21
|
|
Спасибо, все правильно. Еще один вопрос вдогонку. Я записываю массив в localstorage, потом вызываю его и пытаюсь передать как параметр
...
localStorage.setItem('user', JSON.stringify(data));
...
data = JSON.parse(localStorage.getItem('user'));
$.ajax({
url: 'save.php?q='+data,
dataType: "json",
type: "POST",
...
но в результате передается только такая строка
save.php?q=[object Object]
что делаю неправильно?
|
|
18.06.2020, 13:23
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
data = JSON.parse(localStorage.getItem('user'));
data = localStorage.getItem('user');
//и в запросе так
url: 'save.php',
data: {q: data},
....
А на сервере полученный json декодировать:
$data = json_decode($_POST['q']);
Декодирование вернет либо объект (по умолчанию), либо массив, если вторым параметром указать true.
|
|
18.06.2020, 15:54
|
Интересующийся
|
|
Регистрация: 24.03.2019
Сообщений: 21
|
|
Спасибо, сделал как вы посоветовали, теперь массив передается, но на сервере пытаюсь посмотреть через
echo $data;
,но вижу пустоту.
|
|
18.06.2020, 16:09
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Volun
|
теперь массив передается, но на сервере пытаюсь посмотреть через
|
А откуда тогда вы знаете, что он передается? Если все сделано правильно и на сервере после декодирования был получен объект, то парсер бы выдал ошибку:
Catchable fatal error: Object of class stdClass could not be converted to string
с именем файла и строкой, в которой ошибка была обнаружена. Если после декодирования был получен массив, то вывелся бы тип данных - Array.
Массивы/объекты конструкцией echo нельзя просмотреть, для этого служат функции print_r и var_dump. Надо же не самодеятельностью заниматься, а читать и изучать.
|
|
18.06.2020, 16:33
|
Интересующийся
|
|
Регистрация: 24.03.2019
Сообщений: 21
|
|
Спасибо, я как раз и учусь. В консоли вижу что в save.php передается такой массив
q: {"cod":"200","message":0,"cnt":40,"list":[{"dt":1592492400,"main":{"temp":29.27,"feels_like":29.65,"temp_min":28.75,"temp_max":29.27,"pressure":1017,"sea_level":1016,"grnd_level":1001,"humidity":43,"temp_kf":0.52},"weather":[{"id":802,"main":"Clouds","description":"scattered+clouds","icon":"03d"}],"clouds":{"all":35},"wind":{"speed":1.65,"deg":240},"sys":{"pod":"d"},"dt_txt":"2020-06-23+12:00:00"}],"city":{"id":524901,"name":"Moscow","coord":{"lat":55.7522,"lon":37.6156},"country":"RU","population":1000000,"timezone":10800,"sunrise":1592441057,"sunset":1592504230}}
и пытаюсь на сервере получить из него значение city.name
на сервере выдает ошибку
PHP Notice: Undefined index: q in save.php on line 13
файл save.php такой
<?php
$servername = "";
$username = "";
$password = "";
$db = "";
$conn = new mysqli($servername, $username, $password, $db);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$data = json_decode($_POST['q']);
print_r ($data);
?>
Последний раз редактировалось Volun, 18.06.2020 в 16:46.
|
|
18.06.2020, 16:44
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Volun
|
я как раз и учусь
|
На чем же вы учитесь, если содержимое массива (как вы того ожидаете) пытаетесь выводить с помощью echo? Скачайте (выбирайте CHM с примерами) хотя бы руководство и изучайте в нем назначение функций.
Консоль показывает что передается на сервер, но это не значит что вы получили. На сервер передается на массив, а JSON, который представляет из себя строку (data = localStorage.getItem('user')). На сервере нужно получить по ключу q эту строку и декодировать (найдите в руководстве функцию json_decode и почитайте о ней).
Если бы вы на сервере получили бы, сделали бы все верно, то после echo $date вы бы получили либо ошибку, либо сообщение Array. У вас же вообще ничего, то есть, $data не определена, равна null.
Как вы на сервере принимаете данные?
Последний раз редактировалось laimas, 18.06.2020 в 16:51.
|
|
18.06.2020, 16:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Разберетесь с этим, тогда можно будет сказать как передать объект (это содержит ваш json), а на сервере получить сразу массив.
|
|
19.06.2020, 06:03
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Не заметил добавленного.
На каком сервере это исполняется, на удаленном или локальном? Учтите, вываливать ошибки на удаленном сервере не стоит, это почва для анализа не только для вас будет.
Notice: Undefined index ... это не ошибка, а предупреждение, что индекс q не определен в массиве $_POST, а неопределенное это null, следовательно и на выводе ничего не будет. На удаленном сервере вывод предупреждений подавляется, а ошибки пишут в лог файлы.
Параметры подключения к базе, это не имя сервера, а host, он и на удаленном сервере может быть как localhost. На локальном сервере уже есть по умолчанию установки из ini-файла: server = localhost:3306, user = root, password = "". Для отладки этого и достаточно, а на удаленном параметры хоста вам определит хостер.
localStorage.setItem('user', JSON.stringify(data)); - здесь в локальное хранилище записывается строка которую возвращает JSON.stringify, и это потому, что нельзя в локальное хранилище записать объект, все что в хранилище, это строки - ключи и их значения.
data = JSON.parse(localStorage.getItem('user')); - это декодирование json из локального хранилища, после которого data будет объектом. Поэтому подставив его тут url: 'save.php?q='+data, и получим вывод save.php?q=[object Object]. Правильно было бы
data = localStorage.getItem('user');
//....
url: 'save.php?q='+data
Но в этом случае на сервер бы ушел json как GET параметр, а вы определяете метод передачи POST, ничего не передавая, какой смысл? Поэтому удаляем его из url и передаем как POST - data: {q: data}. А на сервере декодировать $data = json_decode($_POST['q']);
Можно определить для передачи и объект:
var data = JSON.parse(localStorage.getItem('user'));
//а в $.ajax данные
data: data,
//об остальном это забота JQ
В этом случае на сервере print_r($_POST) выдаст ассоциативный массив. Ниже представленный код сохраните под любым именем как php и запустите его. Сервер получит POST данные в массиве $_POST и выведет их в браузер.
<?php
if($_POST) exit(print_r($_POST, 1));
?>
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$(function() {
//это объект
var data = {"cod":"200","message":0,"cnt":40,"city":{"id":524901,"name":"Moscow","country":"RU","population":1000000,"timezone":10800,"sunrise":1592441057,"sunset":1592504230}};
$.ajax({
url: location,
type: 'POST',
data: data,
success: function(d) {
alert(d)
}
})
});
</script>
</head>
<body>
</body>
</html>
А у вас не работает потому, что вы в чем-то допускаете ошибки.
|
|
|
|