#php #javascript #database
#php #javascript #База данных
Вопрос:
Используя Javascript, мне нужно получить несколько строк из таблицы базы данных, а затем выполнить цикл по каждой строке и использовать разные поля из каждой строки.
Например, если я получу строки, подобные этой:
var coordinatesArray = '<?php
global $wpdb;
echo $wpdb->get_var("SELECT * FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40);
?>';
Как я должен написать следующий код:
// for each row do: {
// alert the id field
// alert the lat field
// alert the long field
// }
Ответ №1:
JSON — это способ ввода выходных данных, который гарантирует, что результат будет действительным JavaScript и защищает вас от выполнения произвольного кода в JS.
var coordinatesArray = <?php
global $wpdb;
// replace * by id, lat and long since you don't need other fields
$sql = "SELECT id, lat, long FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40";
$rows = $wpdb->get_results($sql);
// if the function fails (?), make valid JS syntax
if (is_array($rows)) {
echo json_encode($rows);
} else {
echo '[]';
}
?>;
for (var i=0; i<coordinatesArray; i ) {
alert(coordinatesArray[i].id);
alert(coordinatesArray[i].lat);
alert(coordinatesArray[i]["long"]);
}
Другим способом было бы создание объекта JS с id
полем в качестве ключа объекта JS:
var coordinatesMap = <?php
global $wpdb;
// replace * by id, lat and long since you don't need other fields
$sql = "SELECT id, lat, long FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40";
// note: OBJECT_K, the result will be an associative array with the first field of a
// row as key
$rows = $wpdb->get_results($sql, OBJECT_K);
// if the function fails (?), make valid JS syntax
if (is_array($rows)) {
echo json_encode($rows);
} else {
echo '{}';
}
?>;
for (var id in coordinatesMap) {
if (coordinatesMap.hasOwnProperty(id)) {
alert(id);
alert(coordinatesMap[id].lat);
alert(coordinatesMap[id]["long"]);
}
}
Пожалуйста, замените alert
на что-нибудь другое, это не совсем удобно для пользователя. Помните, что PHP!= JavaScript и вы не можете использовать функции PHP в JavaScript и наоборот. Если вы не уверены, как будут выглядеть выходные данные, используйте опцию Просмотреть исходный код страницы.
Ссылки:
Комментарии:
1. @Lekensteyn, во-первых, спасибо! Второй — является ли один из способов лучше / быстрее другого?
2. @Ash: Я нахожу второй вариант более чистым, чем первый. Оба варианта верны, но если вы намерены выполнить быстрый поиск по идентификатору <-> по широте / длине, то лучше выбрать второй. Я только что заметил, что поле имеет имя
long
, которое является ключевым словом, зарезервированным для будущего использования. Смотрите мою правку.3. @Lekensteyn, я успешно реализовал ваше второе предложение в своем коде, но есть одна вещь, которую я все еще не понимаю — в моем sql-запросе я на самом деле использую
$sql = "SELECT user_id, ...
, а не$sql = "SELECT id, ...
как я написал здесь. Но в цикле for вы предложили, чтобы я использовал varid
так, как вы его написали, и это все еще работает. Как он узнает, что нужно сопоставить user_id с id? Идентификатор пользователя не определен как ключ в базе данных, хотя он уникален.4. @Ash: если
user_id
код не уникален, не используйте второй код, поскольку это приводит к потере данных, когда в результате появляются записи с одинаковымuser_id
значением.id
Как и вid in coordinatesMap
, определяет переменную JavaScript с ключомcoordinatesMap
, она также может быть названаthe_key_in_coordinatesMap
и не имеет ничего общего сid
полем в базе данных.$wpdb->get_results()
Метод использует первое поле в качестве ключа, если второму аргументу присвоено значениеOBJECT_K
.5. @Lekensteyn,
user_id
является уникальным, поэтому проблем нет. Я вижу, OBJECT_K делает свое дело. Я просто должен убедиться, что user_id навсегда останется первым полем. Спасибо.
Ответ №2:
Возможно, вам лучше потратить время на написание собственного PHP-скрипта для извлечения этих значений (а не в зависимости от WP), перебора их и создания объекта json, который вы возвращаете в javascript.
Ответ №3:
Во-первых, $wpdb->get_var может получить только одно значение. http://codex.wordpress.org/Class_Reference/wpdb#SELECT_a_Variable
Вместо этого используйте $wpdb->get_results http://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results
var coordinatesArray = '<?php
global $wpdb;
echo $wpdb->get_results("SELECT * FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40);
?>';
for(coord in coordinatesArray) {
alert(coordinatesArray[coord].id);
alert(coordinatesArray[coord].lat);
alert(coordinatesArray[coord].long);
}
Я не тестировал, но это должно быть что-то вроде этого.
Комментарии:
1. Не сработает, массив является
[]
, не''
.echo $wpdb->het_result(...)
выдает толькоArray
, а не их представление.2. @Domenic, можете ли вы сказать, как бы вы это сделали?
3. @Ash, используя обычный
for (var i = 0; i < coordinatesArray.length; i)
цикл.for ... in
предназначен не для использования с массивами, а для использования с объектами. В нем будут перечислены всеenumerable
свойства массива, включая, скажем, любые, которые были добавлены Prototype.js фреймворк или любой пользовательский код, который может находиться или не находиться под вашим контролем.4. Если вы не можете быть уверены, что объект не имеет унаследованных свойств, вам также нужно поставить
obj.hasOwnProperty(key)
проверку, чтобы увидеть, унаследовано ли свойство или нет. Но я думаю, что это выходит за рамки этого вопроса.5. @Codler, спасибо за ответ и исправление
get_var
. Вероятно, сэкономил мне много времени на отладку.