Эта тема на forum.dklab.ru


MVH: mysql_field_len()
Здраствуйте.
У меня тут возникло пару вопросов по определению длинны поля mysql в php.
1. У меня есть форма для добавления данных в базу и для определения длинны полей с помощью mysql_field_len() приходится делать запрос типа
$result = mysql_query("SELECT field_name, check_expression FROM fields WHERE id = 99999999999");
Но он он мне не очень то нравится, т.к. что бы в пустую не выбирать записи из таблицы приходится задавать несуществующий id. Может есть способ как-то по элегантнее сделать? Может без select'a...
2. Я что-то не нашёл функции, подобной mysql_field_len, но что бы вторым параметром был не field_offset, а имя поле. Неучто её нет?
Дмитрий Котеров:
2. Можете указывать и имя поле, точно так же, как смещение. См. документацию: http://ru3.php.net/manual/en/function.mysql-field-len.php

Только я не понимаю, зачем Вам вообще эта функция. Почему бы не сделать mysql_fetch_assoc(), а потом просто strlen()?

А запрос по любому придется делать:
http://ru3.php.net/manual/en/function.mysql-list-fields.php
MVH:
Можете указывать и имя поле, точно так же, как смещение. См. документацию: http://ru3.php.net/manual/en/function.mysql-field-len.php
Почему-то с именами она работает неверно.
Например:
SELECT field_name,field_type FROM fields WHERE id = 1
mysql_field_len($result, 'field_name') - вернёт 255, как и должно быть
mysql_field_len($result, 'field_type') - вернёт 255, хотя истинный размер поля - 150 (поле типа varchar)
Да и как можно указывать вторым параметром строку, если в документации написано, что второй параметр int:
int mysql_field_len ( resource result, int field_offset)
Ничего не понимаю... Может это работает в php5?

Только я не понимаю, зачем Вам вообще эта функция. Почему бы не сделать mysql_fetch_assoc(), а потом просто strlen()?
Но тогда же выдастся длинна строки, а не максимальное кол-во символов в поле. Просто я хочу, что бы maxlength в поле <input> автоматом подставлялось в зависимости от длинны поля в базе.
Дмитрий Котеров:
Ах воооон оно что... это, действительно, очень полезная возможность.
Может, тогда http://ru3.php.net/manual/en/function.mysql-list-fields.php ?
Почитайте документацию, короче говоря.
bæv:
Я не помню, в чём там дело было с mysql_field_len (может она длину конкретной записи показывает?), но я длины полей "доставал" примерно так:
$fields = mysql_list_fields($database, $tablename, $dbl);
$columns = mysql_num_fields($fields);
for ($i = 0; $i < $columns; $i++) {

$columnname = mysql_field_name($fields, $i);

$sql = "SHOW COLUMNS FROM $tablename LIKE '$columnname'";
$sql_res = mysql_query($sql);
$row = mysql_fetch_assoc($sql_res);
mysql_free_result($sql_res);

$columntype = mysql_field_type($fields, $i);
$flags = mysql_field_flags($fields, $i);
if(($columntype == "string")&&(!(eregi("enum", $flags)))){
$tattrib=preg_replace("/.*\(([0-9]*)\).*/", "\\1", $row["Type"]);
$columntype ="varchar(".$tattrib.")";
}
// ...Ну и дальше -- перебор остальных возможных значений $columntype.
$tattrib -- это и будет длина поля.

Делал "тупо в лоб". Наверняка есть решение лучше.
(кстати, заметьте, что как такового типа 'varchar' "внутри" MySQL нет -- на самом деле и 'varchar' и 'char' имеют тип 'string'...)

Эта тема на forum.dklab.ru