Имеется произвольный запрос SQL на выборку (строка).
Как быстрее всего получить список полей, возвращаемых этим запросом?
Запрос может возвращать пустой результат. В этом случае список полей тоже должен быть корректно получен.
Можно это реализовать через mysqli + fetch_fields, но этот вариант неуниверсален (только для mysql) и без участия modx.
Идеальный вариант = методами modx + универсально (для любой поддерживаемой modx СУБД) + без выполнения запроса (только парсинг запроса)
Кто какие варианты может предложить?
Раз уж ни у кого нет вариантов, предложу своё универсальное решение:
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; }