Как использовать данные в строках, возвращаемых из базы данных в javascript

#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 вы предложили, чтобы я использовал var id так, как вы его написали, и это все еще работает. Как он узнает, что нужно сопоставить 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 . Вероятно, сэкономил мне много времени на отладку.