PHP

Val Petruchek

подписывайтесь, а то хуже будет!  

ПОДПИСЫВАЙТЕСЬ НА RSS

Выборы в Верховную Раду — 2007

30-го сентября вечером начнётся наша прямая трансляция (с сайта ЦВК) распределения мест в украинском парламенте, как в 2006 году.

Синдикация трансляции: rss; трансляция синдикации трансляции в ЖЖ — [info]2006_rss

Кроссворды онлайн

Реанимировал свою старую онлайн-забаву: кроссворды, которые можно разгадывать прямо в браузере.

Программинг (PHP/JavaScript) пришлось переделать полностью, зато теперь кроссворды работают в IE, FF и Opera. Пока что на сайте выложено всего два кроссворда (1, 2), но уже можно подписаться на обновления (или добавить во френды).

Если найдёте ошибку — смело пишите в комментарии. Спасибо!

P.S. Ещё придумал уникальный и оригинальный домен для проекта, ага.

Получить ID после Insert

26.06.07 @ 02:51 — Programming, PHP, SQL

Задача: получить идентификатор только что добавленной в таблицу записи.
Необходимое условие: в таблице должно быть AUTO_INCREMENT поле.

Решение (MySQL): SELECT LAST_INSERT_ID();
Решение (PHP/MySQL): mysql_insert_id();
Решение (MsSQL): SELECT @@IDENTITY AS ID;

Замечания:

  1. Сбросить (поменять) значение Next Autoindex в MySQL: ALTER TABLE `table_name` AUTO_INCREMENT = 238;
  2. При выполнении INSERT запроса на добавление нескольких записей (insert into `table_name` (field1,…,fieldm) values (’value11′,…,’value1m’), …, (’valuen1′,…,’valuenm’);) MySQL в качестве LAST_INSERT_ID возвращает идентификатор первой вставленной записи, а не последней, как можно было бы предположить.
  3. В некоторых версиях MySQL был баг: при неуспешном выполнении команды INSERT IGNORE (если уникальный ключ уже существует и ничего не добавляется) LAST_INSERT_ID возвращает следующее доступное значение для авто-инкремента.
  4. Не использовать LAST_INSERT_ID, когда его надо использовать, нельзя. Вариант “быстренько пишем в базу и мгновенно делаем SELECT максимального значения авто-инкремента” ужасен и нестабилен.

Передать переменную из JavaScript в PHP

25.06.07 @ 22:54 — Programming, JavaScript, PHP

В свете бурного развития AJAX-технологий классический ламо-вопрос начинающего PHP-программиста:

Как передать значение переменной из JavaScript в PHP?

обретает новое звучание.

Программирование на PHP

21.06.07 @ 12:38 — Programming, PHP

Программировать на PHP очень легко, особенно до тех пор, пока сайт находится в разработке.

Когда дело доходит до промышленного использования легко разработанных скриптов, начинаются проблемы.

Например, начинает тормозить база: запросы, мгновенно отрабатывавшие на 100 тестовых записях, начинают подтормаживать уже на 5,000 записей. Using filesort, using temporary, using where.

Увеличивается количество посетителей сайта и начинаются проблемы с flock().

Генерирование всего-на-лету убивает процессор сервера: thumbnailы, pdfы и прочее так и просятся в кеш.

Возникают проблемы с доступом к удалённым ресурсам, которые могут и не ответить.

А при тестировании всё работало нормально: быстро, стабильно, красиво. А тестировать на прочность никто и не пытался.

Несмотря на все эти подводные грабли, PHP идеально подходит для мелкосредних бизнес-сайтов.

У предпринимателя есть сайт-идея. Он находит дешёвого php-программиста, который ваяет движок, реализующий эту идею. Движок дешёвый, на прочность не испытанный, но тем не менее работает: воплощает идею и позволяет предпринимателю раскручивать сайт. Который пока что работает относительно стабильно. Главное, что обходится предпринимателю он недорого, вкладываясь в бюджет, которым тот готов рискнуть: дизайн, движок, домен, хостинг, немного рекламы + время самого предпринимателя.

Далее, если идея оказывается неудачной, то сайт тихо мирно доживает до окончания регистрации домена и умирает.

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

Увеличение нагрузки означает повышение доходов. Сайт начинает приносить предпринимателю какие-то деньги, которые он может инвестировать в развитие бизнеса. Для сайта это означает: новый dedicated сервер вместо shared hosting, оптимизация движка, добавление нового функционала, переписывание движка с нуля.

PHP очень дешёв для первичной разработки; низкая цена реализации (по сравнению с более дорогим .NET, JSP) бизнес-идеи увеличивает количество предпринимательских попыток. Сработавшие проекты всё равно перейдут на более дорогой движок (качественный PHP или .NET), а несработавшим всё равно, на какой платформе умирать.

Таблица Премьер-Лиги

Полная турнирная таблица чемпионата России.

В российском чемпионате самый продуманный список критериев для сортировки команд. В случае равенства очков у двух или более команд места команд (кроме первого) в текущей и итоговой таблице чемпионата определяются:

  • по наибольшему числу побед во всех матчах чемпионата;
  • по лучшей разности забитых и пропущенных мячей во всех матчах;
  • по результатам игр между собой (число очков, число побед, разность забитых и пропущенных мячей, число забитых мячей, число забитых мячей на чужом поле);
  • по наибольшему числу забитых мячей во всех матчах;
  • по наибольшему числу мячей, забитых на чужих полях во всех матчах.

Пока парсил данные в базу, нашёл кучу глюков в результатах матчей на разных сайтах. На УЕФА команды неправильно отсортированы, на sports.ru банальная ошибка в счёте.

На данный момент на сайте доступны таблицы чемпионатов Украины, Испании и России.

Таблица примеры

Полная турнирная таблица чемпионата Испании.

Кстати, при равенстве очков сравниваются личные встречи (в украинском чемпионате — количество побед).

Пока парсил данные в базу, нашёл кучу глюков в результатах матчей на разных сайтах.

На данный момент на сайте доступны таблицы чемпионатов Украины и Испании — чемпионатов, которые заканчиваются сегодня вечером.

Детальная турнирная таблица

Детальная турнирная таблица высшей лиги, пока только для Украины.

Но система легко расширяема — движок универсальный, его надо данными накормить и всё.

PHPMyAdmin — загрузить большой файл с дампом

07.06.07 @ 23:24 — Programming, Software, PHP

Совершенно случайно обнаружил в phpmyadmin возможность выполнения sql-кода из файла, расположенного на сервере. Эта фича очень удобна в том случае, когда необходимо зачитать большой sql dump (например при переезде базы с одного сервера на другой).

Я интересовался этой фичей давно, но по умолчанию она отключена, а поискать в настройках/документации я не догадался. Решил, что раз нет интерфейса, то и фичи тоже нет. Оказывается, фича есть. Чтобы её включить, надо в настройках phpmyadminа указать имя директории для загруженных файлов в опции $cfg[’UploadDir’]. Имя директории надо указывать относительно корневой папки phpmyadminа. Пустое имя = отключенная фича.

Если имя не пустое, то при выборе пункта меню Import File to import можно будет не только “Browse location of the text file”, но и выбрать его из “web server upload directory”. Расширение файла должно быть или .sql или .zip/.bz2/.gz в зависимости от поддерживаемых методов компрессии. Расширение файла должно быть нижнерегистровым.

Вот что написано в мануале по поводу этой фичи:

$cfg[’UploadDir’] string
The name of the directory where SQL files have been uploaded by other means than phpMyAdmin (for example, ftp). Those files are available under a drop-down box when you click the database name, then the SQL tab.

If you want different directory for each user, %u will be replaced with username.

Please note that the file names must have the suffix “.sql” (or “.sql.bz2″ or “.sql.gz” if support for compressed formats is enabled).

This feature is useful when your file is too big to be uploaded via HTTP, or when file uploads are disabled in PHP.

Please note that if PHP is running in safe mode, this directory must be owned by the same user as the owner of the phpMyAdmin scripts.

Я не тестил последний phpmyadmin, но в используемой мною версии список файлов появляется не на закладке “SQL”, а на закладке “Import”.

406 Not Acceptable Error и как с ней бороться

25.04.07 @ 05:29 — Programming, PHP

Если ваш php-скрипт начинает выдавать 406-ую ошибку (точнее не сам скрипт, а apache) со словами “An appropriate representation of the requested resource /***.php could not be found on this server”, то скорее всего apacheвскому mod_security что-то не нравится в вашем скрипте.

Например, ваш скрипт может принимать в качестве параметра какие-нибудь URLы, а mod_security будет думать, что злобный хакер пытается выполнить remode code injection. Или ещё что-нибудь.

Если вы уверены в своём скрипте, то можно попробовать отключить mod_security. Проще всего это сделать, добавив две директивы в .htaccess:
SecFilterEngine Off
SecFilterScanPOST Off

Если не получается отрубить mod_security с помощью .htaccess, отключайте его с помощью httpd.conf.

Если это не разрешает сделать админ или ваша религия, то читайте логи (типа такого: [mod_security: Access denied with code 406. Pattern match “\\\\.php(3|4|5)?(\\\\?|&).*=(ht|f)tps?:/.*(\\\\?|&) ” at REQUEST_URI [id “300018″] [rev “1″] [msg “Generic PHP code injection protection”] [severity “CRITICAL”] …]) и модифицируйте скрипт таким образом, чтоб он не вызывал подозрений у mod_security.

« Previous PageNext Page »   
Реклама::

 
Реклама::