[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос для получения атрибутов полей таблицы
Игорь_Vasinsky
Вообще - известно имя таблицы

необходим SQL запрос - который вернёт атрибуты и тип данных 1го столбца в указанной таблице

к примеру - узнать тип данных (формат) для указанной таблицы и по имени столбца


SELECT DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydb' AND TABLE_NAME='mytable' AND COLUMN_NAME='name_cell'



вообщем я охочусь за полями, которые auto_increment

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
DESCRIBE `mytable`
Oyeme
SHOW  COLUMNS FROM  [mydb].[mytable] WHERE  Field = 'name_cell'


-- Extra = 'auto_increment'

Если Я правильно Вас понял.
Игорь_Vasinsky
ща проверим)

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Игорь_Vasinsky
Ооо. спасиб. оба запроса - то что надо.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
dr.nomore
тоже самое extra в схеме

вместо COLUMN_NAME='name_cell' согласно вашему ТЗ должно быть

ORDINAL_POSITION = 1

SELECT extra FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydb' AND TABLE_NAME='mytable' AND ORDINAL_POSITION = 1


После запроса все данные в полях - fetch_field(), флаги в свойстве flags, AI:

$is_ai = ($flags & MYSQLI_AUTO_INCREMENT_FLAG);
Игорь_Vasinsky
спс

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
TranceIT
Полезно, создал закладочку...

_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
dr.nomore
Вот еще сделайте. Полезная инфа по сущностям вашей бд.

SELECT 
`tables`.`TABLE_NAME`,
`tables`.`TABLE_TYPE`,
`tables`.`TABLE_ROWS`,
`columns`.`COLUMN_NAME`,
`columns`.`COLUMN_TYPE`,
`columns`.`DATA_TYPE`,
`columns`.`COLUMN_KEY`,
`columns`.`COLUMN_COMMENT`,
`columns`.`EXTRA`
FROM `information_schema`.`columns`
INNER JOIN `information_schema`.`tables`
USING(`table_name`)
WHERE `columns`.`table_schema` = "_YOUR_DB_"
AND `tables`.`table_schema` = "_YOUR_DB_"
ORDER BY `columns`.`TABLE_NAME` DESC, `columns`.`EXTRA` DESC;


Да, _YOUR_DB_ два раза. Потому что там индексов нет, любая попытка запросить джоин по общим полям больше чем 1 пара приводит к перформансу сразу в три и более раза медленному. При этом explain свою картинку не меняет. Естественно temporary table, filesort. Без ордена бегает быстрее процентов на 15-20. Количественно все в пределах десятых секунды на моем древнем компе. Без ордена Query took 0.0510 sec

SHOW FULL COLUMNS FROM...


дает все то же самое, но не дает инфы по таблицам. Ну и главное откудова берет - оттудова-же, из схемы, ясень пень.

В свое шоу можно еще добавлять поля или выкидывать лишние.
dr.nomore
флаги для mysqli::fetch_field() пощу, потому что найти полный список с каментами не значит скопипастить его с мануала. Пришлось поискать. флаги bitwise само собой.

/*
MYSQLI_BINARY_FLAG Field is defined as BINARY. Available since PHP 5.3.0.
MYSQLI_ENUM_FLAG Field is defined as ENUM. Available since PHP 5.3.0.
MYSQLI_NOT_NULL_FLAG Indicates that a field is defined as NOT NULL
MYSQLI_PRI_KEY_FLAG Field is part of a primary index
MYSQLI_UNIQUE_KEY_FLAG Field is part of a unique index.
MYSQLI_MULTIPLE_KEY_FLAG Field is part of an index.
MYSQLI_BLOB_FLAG Field is defined as BLOB
MYSQLI_UNSIGNED_FLAG Field is defined as UNSIGNED
MYSQLI_ZEROFILL_FLAG Field is defined as ZEROFILL
MYSQLI_AUTO_INCREMENT_FLAG Field is defined as AUTO_INCREMENT
MYSQLI_TIMESTAMP_FLAG Field is defined as TIMESTAMP
MYSQLI_SET_FLAG Field is defined as SET
MYSQLI_NUM_FLAG Field is defined as NUMERIC 32768
MYSQLI_PART_KEY_FLAG Field is part of an multi-index
MYSQLI_GROUP_FLAG Field is part of GROUP BY
*/
dr.nomore
Применительно к дискуссии из которой как я понимаю возникла эта тема. Допустим вы хотите нарисовать форму ввода данных. В стандартной схеме вы должны заранее знать и передать в модель сведения о полях. Если это поля из ДБ, практически все уже есть в самой ДБ и модель может самостоятельно их закачать и передать по логике действия на вывод.

В процедурном стиле:

$columns = '"' . explode('","', $model_columns) . '"';

$q = strtolower('SELECT
`TABLE_NAME`
`COLUMN_NAME`,
`COLUMN_DEFAULT`,
`IS_NULLABLE`,
`DATA_TYPE`,
`CHARACTER_MAXIMUM_LENGTH`,
`CHARACTER_OCTET_LENGTH`,
`NUMERIC_PRECISION`,
`NUMERIC_SCALE`,
`CHARACTER_SET_NAME`,
`COLLATION_NAME`,
`COLUMN_TYPE`,
`COLUMN_KEY`,
`EXTRA`,
`COLUMN_COMMENT`
FROM `information_schema`.`columns`
WHERE `columns`.`table_schema` = "'
.$db_name.'"
AND `columns`.`TABLE_NAME` = "'
.$table_name.'"
AND `columns`.`COLUMN_NAME` IN ('
. $columns . ');');

$res = $mysqli->query($q);

// далее текстом


нужен тип поля? в column_type записи вида varchar(255) или enum('y', 'n') или int(10) unsigned, timestamp и так далее.

Парсим в методе, получаем нормальные данные.

Парсеру разобраться с типом поможет поле DATA_TYPE. В котором записи только о типе данных int, varchar, enum и тп. Еще помогут поля `CHARACTER_MAXIMUM_LENGTH`, `CHARACTER_OCTET_LENGTH`, `NUMERIC_PRECISION`, `NUMERIC_SCALE` - первые два для строк, вторые для чисел.

Собственно из column_type надо достать только атрибуты типа unsigned, zerofill и контент полей типа set, enum. В общем все делается в одном месте откуда приходит объект с нормальными данными по которым можно сгенерить что угодно.

Нормальные данные это структура объекта filed майскли. Может показаться не очень удобным сначала кодировать флаги и типы, а потом раскодировать, но это - нормально. Разумеется в объект можно всунуть родительские методы которые по команде сверху сами построят вам что хотите.

Поле nullable? Да - нет звезды. Нет - рендер добавляет звезду. Обязательное к заполнению. Валидатору ничего передавать не надо - у него тот же метод получения данных. Валидатор смотрит: поле пустое, оно нулабле? Нулабле - ок, пропускаем. Нет? - Исключение.

Короче все типовое можно отразить и проверить. Не типовое можно внедрять через либо коды на этапе парсинга, скажем сделать тип passw, придумать ему код типа и флаг. Или то же самое взять из бд по отношениям.
dr.nomore
Альтернативный способ без запросов к схеме и парсинга - запросить данные для перечисленных полей и получить все готовченко в объекте field.

$q = 'select ' . $model_fields  . ' from ' . $model_table . ' limit 0;';

$res = $mysqli->query($a);

while($field = $res->fetch_field()) {
// забиваете объект сведениями для рендера
}


Каменты полей, правда, не возвращаются. Нет такой проперти в field.

Но самая мякотка это передача всех сведений в валидатор через имя поля ввода.

Валидатор ничего у бд просить не будет и вообще ему ничего больше не надо кроме полученных из $_GET, $_POST данных.

Имя поля строится схеме

table_name[field_name][field_flags][field_type]

Оно превращается во вложенный массив достать значение которого можно рекурсией, или, если запросить RAW данные, то есть навалом, то отпарсить как строку - это проще, но не научно. Рекурсия простая как три копейки.

Очевидно валидатор не получит всех данных о поле которые применялись при его создании, но это и не требуется. Их получает валидатор на ява-скрипте. Который нормально вызывается по событию потери фокуса полем ввода и ему тоже ничего больше не надо кроме this.

Без супер-мега-тегов html5 все умещается в атрибуты поля как то: placeholder - рассказывает юзеру чего вообще можно ввести и в каком формате; max-length - длина в символах что для строк, что для чисел. Из this.name ява-валидатор узнает о флагах поля, о типе поля и может проверить должен юзер ввести что-то, или может оставить пустое, проверить на число, с запятой, целое, дату, строку текста и тп.

Поскольку поле ввода само создано по типу из БД, некоторые проверки вообще не нужны. Например max-length попросту не даст ввести длиннее чем задано (но надо ловить вставку из буфера и проверять чтобы обругать). Если поле было типа set или enum оно представляет из себя список из которого можно выбрать только то, что предусмотрено в типе поля в БД. Ничего другого. В перспективе когда браузеры освоят все фишки html5 можно будет генерить вполне конкретные типы ввода под типы в БД.

Вполне понятно что к фирменным флагам и типам можно добавить свои чтобы закодировать инфу в тех же двух пропертях.
dr.nomore
Да, получается что не нормальный юзер увидит как называется таблица, какие есть в ней поля, какие у них свойства и все такое.

Это имеет какое-то значение для безопасности? Никакого.

Это имеет какое-то значение для приватности? - ваш сайт экспонирует все то же самое. И вообще есть же фейсбук.
Игорь_Vasinsky
понятно wink.gif

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
dr.nomore
Искал в мануале как сделать хитрый constraint и наткнулся на фичу:

Цитата
If a PRIMARY KEY or UNIQUE index consists of only one column that has an integer type, you can also refer to the column as _rowid in SELECT statements.


из статьи create table. Проверил - работает. Там еще в другом месте есть об этом же. Что если PK не найдется, субдя будет искать первый не нулевой UNIQUE. И, если найдет, по нему и вернет.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.