пятница, 20 ноября 2009 г.

PHP в руках прогрммиста на Си (микроскоп и гвозди)

Если берешь на вооружение новый язык программирования, изучи для начала типовые приёмы в этом языке. Иначе рискуешь начать забивать гвозди микроскопом.

Вот такой замечательный способ выводить большой кусок html я обнаружил у одного бывшего Сишника:

echo '<div class="search_menu"><table width="73%" cellpadding="0" cellspacing="0" border="0"><tr>';
echo '<td><div id="menu_item_internet"><a href="#" onclick="openMenu(\'internet\');return false;">Интернет</a></div></td>';
echo '<td><div id="menu_item_photo" class="aktiv"><a href="#" onclick="openMenu(\'photo\');return false;">Фото</a></div></td>';
echo '<td><div id="menu_item_video"><a href="#" onclick="openMenu(\'video\');return false;">Видео</a></div></td>';
echo '<td><div id="menu_item_files"><a href="#" onclick="openMenu(\'files\');return false;">Файлы</a></div></td>';
echo '<td><div id="menu_item_job"><a href="#" onclick="openMenu(\'job\');return false;">Работа</a></div></td>';
echo '<td><div id="menu_item_refer"><a href="#" onclick="openMenu(\'refer\');return false;">Рефераты</a></div></td>';
echo '</tr></table></div>';


пятница, 13 ноября 2009 г.

AUTO_INCREMENT в InnoDB

Весьма неожиданное поведение автоинкремента было обнаружено в InnoDB (MySQL >= 5.0).

С MyISAM всё достаточно просто - берётся значение из параметров таблицы, используется для вставки и увеличивается на единицу для следующей вставки. При вставке заданного значения в таблицу, значение AUTO_INCREMENT соответствующим образом подпрыгнет подстраиваясь под вставляемое. Если вставлялось значение меньше чем AUTO_INCREMENT, то значение счётчика не подпрыгнет. Значение AUTO_INCREMENT можно изменить при помощи ALTER TABLE `table` AUTO_INCREMENT value; При этом MyISAM не анализирует это значение, а просто задаёт. Если при вставке в уникальный столбец автоматическое значение уже есть, то происходит ошибка DUPLICATE KEY;

C InnoDB всё гораздо интереснее. Автоинкрементируемое поле должно обладать ключом. При старте сервера значение AUTO_INCREMENT сбрасывается до максимального существующего значения +1. Нумерация может быть непоследовательной из-за транзакций. Задать значение меньше максимально существующего невозможно, альтре отработает, не выдав ошибки, но фактическое значение он не изменит. Задать значение много больше максимального возможно, но при рестарте сервера оно сбросится до максимального.

PS В InnoDB начиная с MySQL 5.1 появилось понятие "блокировка автоинкремента". Подробнее об этом можно почитать AUTO_INCREMENT Handling in InnoDB

пятница, 6 ноября 2009 г.

Очередной пример говнокода

Вот так извращаются разработчики, чтобы не писать массив с названиями месяцев:

function getTime($time)
{

    $time1=substr($time,0,-1);
    $time1=$time;
    $time1=strtotime($time1);
    setlocale(LC_ALL, 'ru_RU.KOI8-R', 'ru_RU', 'ru', 'RU');
    $time1=strftime("%e %B %Y", $time1);
    $time1=convert_cyr_string ($time1, 'k', 'w') . ' года';
    return $time1;
}

Руки бы оторвать им.