cyrax_02 10 мая 2015 0 1
Имеется произвольный запрос SQL на выборку (строка).
Как быстрее всего получить список полей, возвращаемых этим запросом?

Запрос может возвращать пустой результат. В этом случае список полей тоже должен быть корректно получен.

Можно это реализовать через mysqli + fetch_fields, но этот вариант неуниверсален (только для mysql) и без участия modx.
Идеальный вариант = методами modx + универсально (для любой поддерживаемой modx СУБД) + без выполнения запроса (только парсинг запроса)

Кто какие варианты может предложить?
1 комментарий
c
cyrax_02 14 мая 2015г в 12:50 #
Раз уж ни у кого нет вариантов, предложу своё универсальное решение:
function func_getSQLFields($sql, $fullInfo = false, $withTablePrefix = true, $xpdo = null) {
        
        if($xpdo === null) { global $modx; $xpdo = &$modx; }
        $output = null;
        
        if(in_array($xpdo->getOption('dbtype'), array('mysql', 'sqlite'))) {
            if(strpos($sql, ' LIMIT ', 0) === false) { $sql = $sql.' LIMIT 0'; }
        }
        if(($pdoStatement = $xpdo->query($sql)) === false) {
            $modx->log(modX::LOG_LEVEL_ERROR, '['.__METHOD__.'] Ошибка при выполнении запроса: '.$sql);
        } else {
            $fieldsInfo = array();
            foreach(range(0, $pdoStatement->columnCount() - 1) as $columnIndex) {
                $fieldsInfo[] = (array)$pdoStatement->getColumnMeta($columnIndex);
            }
            if($fullInfo) {
                $output = $fieldsInfo;
            } else {
                $output = array();
                foreach($fieldsInfo as $fieldInfo) {
                    $output[] = ($withTablePrefix? ((isset($fieldInfo['table']) && $fieldInfo['table'] !== '')? $fieldInfo['table'].'.': '').$fieldInfo['name']:
                                                   $fieldInfo['name']);
                }
            }
        }
        return $output;
    }
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.