КрасносельскийКонстантинКонстантинович |
ТаблицейБлоками.Как в PHP поместить enum в массив? |
Последняя модификация: 10.08.2014 г
Страница загружена с адреса: http://webdesign.site3k.ru/sovet/enum_to_php_array.html
В очередной раз, работая с SQL-типом данных enum, решил посмотреть, как другие люди в PHP преобразуют тип enum в массив. Задал запрос в поиск гугла «php enum в массив» и начал просматривать результаты. После десятого стало грустно, и я решил написать об этом небольшую статью ну нет в сети нормального алгоритма преобразования enum в массив средствами PHP!
Во-первых, что за запрос:
$sql = "show columns from $table like '$column'";
ну это же нет слов, одни местоимения. Еще бы REGEXP применили, чтоб сервер загрузить по полной программе.
Но это далеко не все извращения, проделываемые ради превращения enum в массив PHP. Однако, не буду их перечислять, так как число бредовых решений множество, в то время, как правильных всего три.
Во-первых, для получения всех значений поля типа enum с именем «enum_field» из базы, имя которой хранится в константе basename, нужно выполнить запрос типа:
$sql="DESCRIBE ".basename." `enum_field`";// создать запрос для enum-поля enum_field $result=mysql_query($sql) or die(mysql_error());// получить ответ $records=mysql_num_rows($result);// получить количество записей if($records){// если записи есть @$enum_ar=mysql_fetch_assoc($result);// получить запись в массив /* тут будет код для превращения enum в массив */ } mysql_free_result($result);// освободить память от результатов SQL-запроса.
Во-вторых, можно применить один из трех методов преобразования enum в PHP-массив.
Метод первый:
preg_match_all("/'(.*?)'/i", $enum_ar['Type'], $ar);
В итоге, в элементе массива $ar с индексом 1, содержится массив всех значений enum-поля. Указанную выше строку нужно вставлять вместо «тут будет код ». Результат можно проверить, поместив в самом конце кода три строки:
echo '<pre>'; print_r($ar[1]); echo '</pre>';
Метод второй:
Чтобы не менять проверочный код, а возможно и другие места программы, где использовался $ar[1] из первого метода, используем в нем тот же первый индекс массива $ar.
$ar[1]=explode(',',preg_replace('/^enum\((.*)\)$/i','${1}',str_replace("'",'',$enum_ar['Type'])));
Этот вариант более громоздкий по коду, но позволяет, при желании, обходиться без лишних индексов (использовать не $ar[1], а $ar).
Метод третий:
Так же позволяет использовать не $ar[1], а $ar, но использует жудкий eval, которого начинающие программисты боятся, как черт ладана.
eval('$ar[1]='.str_replace('enum','array',$enum_ar['Type']).';');
Таким образом, полный PHP код для получения enum в массив может выглядеть так:
<?php $sql="DESCRIBE ".basename." `enum_field`"; $result=mysql_query($sql) or die(mysql_error()); $records=mysql_num_rows($result); if($records){ @$enum_ar=mysql_fetch_assoc($result);// получить запись в массив eval('$ar='.str_replace('enum','array',$enum_ar['Type']).';'); } mysql_free_result($result); // только для того, чтобы убедиться, что значения enum действительно попали в массив echo '<pre>'; print_r($ar); echo '</pre>'; ?>