Составление SQL запроса к базе данных

Главные вкладки

Аватар пользователя Zerbert Zerbert 18 июля 2016 в 14:33

Доброго времени суток всем!
Пишу апи для сайта на друпале 7, соответственно пишу запросы к базе. И столкнулся с одной сложностью. Для ввода геоданных используется модуль geofield yandex map. Теперь мне нужно средствами sql выбрать эти данные. Всё бы ничего, но данные шифруюся. Когда я делаю выборку через views и указываю вывод в формате geoJSON, то views всё правильно делает и показывает нужный результат. Вот запрос, который составляет views:

SELECT node.nid AS nid, node.created AS node_created, 'node' AS field_data_field_map4_node_entity_type
FROM
{node} node
WHERE (( (node.status = '1') AND (node.type IN  ('uchastok4')) ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0

Вот пример вывода views
Но когда я хочу руками написать запрос для получения такого же результата, я сталкиваюсь с проблемой шифрования. Как оказалось, в БД данные геометрии хранятся в файлах с разширением .bin (к сожалению сам фаил прикрепить не могу, так как расширение такое не поддерживается)
Скриншот из БД

Собственно вопрос: как достать эти данные в формате geoJSON, как на первом скриншоте?

Комментарии

Аватар пользователя Zerbert Zerbert 19 июля 2016 в 10:01

Да, Вы правы, но достать данные все равно не получается. Вот пример кода:

<?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_allMYSQLI_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']) ничего не получаю. Пустота. Почему так может быть?

Аватар пользователя gun_dose gun_dose 19 июля 2016 в 10:28

У вас куда этот код завёрнут? Если просто отдельным файлом, то у вас скорее всего кодировка не подхватывается. Выводите через модуль, должно будет показать нормально. Или хотя бы просто на странице с кракозябрами переключите в браузере кодировку на UTF-8

Аватар пользователя gun_dose gun_dose 19 июля 2016 в 10:38

Вот это кстати всем надо знать как отче наш. Я уже не переходя по ссылке вспомнил, что 88-я запись в блоге Андеда - это про Database API Smile

Аватар пользователя Zerbert Zerbert 19 июля 2016 в 11:59

Пишу код на отдельной странице. Решил попробовать использовать апи друпала. Подключил его, сделал выборку (запрос скопировал из 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. Тут, вероятнее всего, в самом запросе, но я не понимаю, как его правильно составить, чтобы получить нужные данные

Аватар пользователя Orion76 Orion76 19 июля 2016 в 12:53

"Откройте" Вашу БД в чем-то типа phpmyadmin и посмотрете структуры таблиц:
node
field_data_*

В таблице node храняться только "своства" ноды.
Поля храняться в отдельных таблицах, связанных с node по полям nid - entity_id
Т.е. чтобы получить значение поля, необходимо"подключить" таблицу поля джойном(join)

По ссылке выше посмотрите главу "Выборка из двух таблиц соединённых с помощью INNER JOIN:"
ПОследний пример "// Drupal 7, dynamic query"

Аватар пользователя Zerbert Zerbert 19 июля 2016 в 13:57

Собственно говоря, вернулись к проблеме со странными символами..

<?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');
?>

Результат такой же, как на скриншоте выше.
Как можно побороть эту неприятную ситуацию?

Аватар пользователя Orion76 Orion76 19 июля 2016 в 20:20

Если вьюс выводит правильно, тогда проще посмотреть как это поле выводит модуль "geofield yandex map"

поищите в недрах ГЕО модуля функцию - ИМЯ_ГЕОМОДУЛЯ_field_formatter_view
и посмотрите, как она работает.