Вывод элементов массива
В ответе сервера получаю массив, и вывожу из него элементы в таблицу, затем отдельно показываю последний элемент (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); } |
А что значит первый? index - это индексы массива, он может указывать на первый элемент массива (у вас массив объектов). А val, это свойства объектов, где val.dt_txt, это не первый элемент, а свойство dt_txt объектов. Вы переменной постоянно присваиваете это свойство (переопределяется), а значит по окончанию работы цикла в ней будет значение этого свойства последнего объекта массива data.list. Если нужно значение первого объекта, тогда в цикле так:
if(!index) sd = "<span>Start" + val.dt_txt + "</span>"; |
Спасибо, все правильно. Еще один вопрос вдогонку. Я записываю массив в 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] что делаю неправильно? |
data = localStorage.getItem('user'); //и в запросе так url: 'save.php', data: {q: data}, .... А на сервере полученный json декодировать: $data = json_decode($_POST['q']); Декодирование вернет либо объект (по умолчанию), либо массив, если вторым параметром указать true. |
Спасибо, сделал как вы посоветовали, теперь массив передается, но на сервере пытаюсь посмотреть через
echo $data; ,но вижу пустоту. |
Цитата:
Catchable fatal error: Object of class stdClass could not be converted to string с именем файла и строкой, в которой ошибка была обнаружена. Если после декодирования был получен массив, то вывелся бы тип данных - Array. Массивы/объекты конструкцией echo нельзя просмотреть, для этого служат функции print_r и var_dump. Надо же не самодеятельностью заниматься, а читать и изучать. |
Спасибо, я как раз и учусь. В консоли вижу что в 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); ?> |
Цитата:
Консоль показывает что передается на сервер, но это не значит что вы получили. На сервер передается на массив, а JSON, который представляет из себя строку (data = localStorage.getItem('user')). На сервере нужно получить по ключу q эту строку и декодировать (найдите в руководстве функцию json_decode и почитайте о ней). Если бы вы на сервере получили бы, сделали бы все верно, то после echo $date вы бы получили либо ошибку, либо сообщение Array. У вас же вообще ничего, то есть, $data не определена, равна null. Как вы на сервере принимаете данные? |
Разберетесь с этим, тогда можно будет сказать как передать объект (это содержит ваш json), а на сервере получить сразу массив.
|
Не заметил добавленного.
На каком сервере это исполняется, на удаленном или локальном? Учтите, вываливать ошибки на удаленном сервере не стоит, это почва для анализа не только для вас будет. 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> А у вас не работает потому, что вы в чем-то допускаете ошибки. |
Забыл сказать. Я же говорил - прочесть о функции json_decode. Что пишут? А пишут о том, о чем я ранее говорил - если опущен второй параметр функции, то результатом будет не массив, а объект. К пример, пусть json будет таким и он как и у вас отправлен серверу под ключом q:
{"a":1,"b":2} Декодируем: $data = json_decode($_POST['q']); //попытка вывести значение как echo $data['a']; //закончится фатальной ошибкой - Fatal error: Cannot use object of type stdClass as array //так как $data, это объект и получить можно только значения его свойств a и b echo $data->a; //а так верно и будет выведено в браузер 1, получили значение свойства a объекта $data //если декодировать со вторым параметром равным true (можно и 1 указать, любое значение больше 0 тоже есть true) $data = json_decode($_POST['q'], true); //то $data массив и вывод echo $data['a']; //это верно, есть такой ключ в массиве, а значит получим 1 Обязательно читать о функциях, их назначении, параметрах и работе. В руководстве есть примеры. |
Спасибо, с этим почти разобрался. Еще такой вопрос по БД. Не получается составить запрос. Я получаю на сервере параметр и мне нужно сравнить его с БД, и если там нет такого совпадения, то добавить строку в таблицу. В таблице users есть 4 столбца
u_id u_name created updated $servername = ""; $username = ""; $password = ""; $db = ""; $conn = new mysqli($servername, $username, $password, $db); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $user_n = $_POST[name]; $sql = "SELECT * FROM `users` WHERE u_name like '%$user_n%'"; $result = mysqli_query($sql); print($result); mysqli_close($conn); |
Вы же учитесь, а учиться начинают с основ, сначала выучить азбуку, научится читать, писать, и т.д. Язык программирования нужно тоже начинать изучать с его основ, с синтаксиса, правил, ... Вы же этим даже не утруждаете себя. Вот так делать нельзя:
$user_n = $_POST[name]; РНР исправит за вас ошибку, но это не означает, что так он будет поступать всегда. Пришедшие извне данные сервер обязан фильтровать/проверять, а уж тем более не допустимо вставлять непосредственно данные извне как параметры в SQL запросах, это грозит sql-инъекцией. Прежде чем использовать LIKE, нужно внимательно прочесть о ней, дабы не получать запросом не то, чего хотелось. А в вашем запросе эта функция вообще не нужна, здесь требуется простое сравнение. Действия после запросов не всегда нужно завершать выходом (die), это стоит учитывать, а sql-ошибки никогда не показывать пользователю. Откройте руководство, найдите описание почему у вас ошибки, исправьте их, после это можно будет говорить как сделать лучше. И не надо это воспринимать за "отфутболивание", здесь ведь форум, а не кафедра, никто не станет вам рассказывать все, от мелких ошибок до ... Нужно самому учить такие вещи коли учитесь, и учитесь серьезно. |
Часовой пояс GMT +3, время: 01:40. |