Доброго времени суток всем!
Пишу апи для сайта на друпале 7, соответственно пишу запросы к базе. И столкнулся с одной сложностью. Для ввода геоданных используется модуль geofield yandex map. Теперь мне нужно средствами sql выбрать эти данные. Всё бы ничего, но данные шифруюся. Когда я делаю выборку через views и указываю вывод в формате geoJSON, то views всё правильно делает и показывает нужный результат. Вот запрос, который составляет views:
FROM
{node} node
WHERE (( (node.status = '1') AND (node.type IN ('uchastok4')) ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0
Вот пример вывода views
Но когда я хочу руками написать запрос для получения такого же результата, я сталкиваюсь с проблемой шифрования. Как оказалось, в БД данные геометрии хранятся в файлах с разширением .bin (к сожалению сам фаил прикрепить не могу, так как расширение такое не поддерживается)
Скриншот из БД
Собственно вопрос: как достать эти данные в формате geoJSON, как на первом скриншоте?
Комментарии
Данные в БД сериализованы.
Да, Вы правы, но достать данные все равно не получается. Вот пример кода:
<?php
if ($_GET['action'] == "getuchastok") {
$mysqli = new mysqli($host, $user, $pswd, $database);
if ($mysqli->connect_errno) {
echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$mysqli->set_charset("utf8");
$res = $mysqli->query(" SELECT field_data_field_map4.field_map4_geom
FROM field_data_field_map4, node
WHERE ((node.nid = 8) AND (node.nid = field_data_field_map4.entity_id))");
$mysqli->close();
$data = $res->fetch_all( MYSQLI_ASSOC );
print_r($data[0]['field_map4_geom']);
$data = unserialize($data[0]['field_map4_geom']);
print_r($data);
}
?>
Когда я вывожу print_r($data[0]['field_map4_geom']), то получаю следующее
А после вызова unserialize($data[0]['field_map4_geom']) ничего не получаю. Пустота. Почему так может быть?
У вас куда этот код завёрнут? Если просто отдельным файлом, то у вас скорее всего кодировка не подхватывается. Выводите через модуль, должно будет показать нормально. Или хотя бы просто на странице с кракозябрами переключите в браузере кодировку на UTF-8
http://xandeadx.ru/blog/drupal/88
Вот это кстати всем надо знать как отче наш. Я уже не переходя по ссылке вспомнил, что 88-я запись в блоге Андеда - это про Database API
Пишу код на отдельной странице. Решил попробовать использовать апи друпала. Подключил его, сделал выборку (запрос скопировал из views). В views показывает правильно, а у меня нет.
<?php
define('DRUPAL_ROOT', getcwd());
require_once $_SERVER['DOCUMENT_ROOT'].'/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$geom = db_query(" SELECT node.nid AS nid, 'node' AS field_data_field_map4_node_entity_type
FROM {node} node")->fetchAll();
print_r($geom);
?>
результат в views
результат у меня
Вместо координат запрос возвращает слово node. Тут, вероятнее всего, в самом запросе, но я не понимаю, как его правильно составить, чтобы получить нужные данные
"Откройте" Вашу БД в чем-то типа phpmyadmin и посмотрете структуры таблиц:
node
field_data_*
В таблице node храняться только "своства" ноды.
Поля храняться в отдельных таблицах, связанных с node по полям nid - entity_id
Т.е. чтобы получить значение поля, необходимо"подключить" таблицу поля джойном(join)
По ссылке выше посмотрите главу "Выборка из двух таблиц соединённых с помощью INNER JOIN:"
ПОследний пример "// Drupal 7, dynamic query"
Собственно говоря, вернулись к проблеме со странными символами..
<?php
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$query = db_select('node', 'n');
$query->innerJoin('field_data_field_map4', 'f', 'n.nid = f.entity_id');
$query->fields('n', array('nid'));
$query->fields('f', array('field_map4_geom'));
$query->condition('n.nid', 8);
$geom = $query->execute()->fetchAll();
print_r($geom);
?>
результат
Так как поле типа BLOB, кодировка не должна никак влиять на результат. На всякий случай установил кодировку для самой страницы
<?php
header('Content-type: text/html; charset=UTF-8');
?>
Результат такой же, как на скриншоте выше.
Как можно побороть эту неприятную ситуацию?
Если вьюс выводит правильно, тогда проще посмотреть как это поле выводит модуль "geofield yandex map"
поищите в недрах ГЕО модуля функцию - ИМЯ_ГЕОМОДУЛЯ_field_formatter_view
и посмотрите, как она работает.
Кстати.. апи проще делать с помощью модулей
https://www.drupal.org/project/services
https://www.drupal.org/project/restws
и т.п.
Благодарю за подсказку! Буду изучать мануалы)