Создание закруглённых углов без использования изображений.
Нашел в просторах сети (не помню уже где) простой способ обрамлять блочные элементы рамкой с закруглёнными углами без использования изображений для сайтов, написанных на PHP.
В начале PHP - кода страницы подключаем библиотеку, скачанную вот здесь, инициализируем класс и создаем переменные для начала и завершения HTML кода рамки:
$pmb = new PhpMyBorder();
$begin_side_round=$pmb -> begin_round("170px","ffffff","bbbbbb");
// (170px - ширина, ffffff - цвет бекграунда, bbbbbb - цвет рамки)
$begin_content_round=$pmb -> begin_round("100%","ffffff","bbbbbb");
// Если нужно несколько разных рамок, определяем начала для каждой...
$end_round=$pmb -> end_round();
В шаблоне страницы обрамляем рамкой контейнер с контентом:
Всё...
Методы запрета кеширования браузером динамического контента
Поле заголовка expires
Значением данного заголовка является дата, после которой содержимое ресурса устареет. Если пользователь после этой даты обратиться к ресурсу, браузер должен запросить ресурс у сервера, а не из локального кэша.
Если поле »expires« содержит дату, прошедшую, по отношению к текущей, то при следующем обращении к ресурсу браузер будет вынужден снова обратиться к серверу. Это произойдет вследствие того, что либо документ не будет занесен в кэш - как уже устаревший, либо при обращении к кэшу браузер определит, что документ уже устарел. Следующий листинг на php демонстрирует использование заголовка expires:
Поле заголовка last-modified
Значением данного заголовка является дата последнего обновления ресурса. Большинство современных браузеров используют следующий алгоритм, если ресурс уже находится в локальном кэше:
запрашивает с сервера дату последнего обновления ресурса
сравнивает полученную дату и дату ресурса в локальном кэше
если ресурс на сервере новее ресурса в кэше - запрашивается ресурс с сервера.
Если ресурс, расположенный на сервере, содержит в данном поле текущую дату, то браузер будет каждый раз запрашивать ресурс с сервера, а не из локального кэша. Следующий листинг демонстрирует использование поля заголовка last-modified:
Поля заголовка cache-control и pragma
И, наконец, поля заголовка, непосредственно отвечающие за кэширование ресурса. Поле «pragma» было определено в стандарте rfc 1945, описывающим протокол http 1.0. Данное поле считается устаревшим, но в некоторых случаях приходится использовать именно его. В частности некоторые proxy-сервера неправильно обрабатывают запросы к постоянно изменяющимся ресурсам, если вместе с ресурсом не передается данное поле заголовка.
Второе поле определено в стандарте rfc 2068, который описывает протокол http 1.1. Данное поле заголовка позволяет запретить кэширование, и каждый раз запрашивать ресурс с сервера. Следующий листинг демонстрирует использование полей заголовка cache-control и pragma для запрета кэширования:
Защита PHPBB от спам-ботов путем изменения каптчи
Хочу рассказать о самом простом способе, осложняющем жизнь спамерам и программам ботов, использующим автоматические регистрации на форумах под управлением PHPBB версий 2.x. Естественно, что такой тип защиты срабатывает на тех форумах, где включено визуальное подтверждение, так называемая CAPTCHA.
Многие знают, что стандартная защита от автоматических регистраций на PHPBB 2 легко обходится с помощью использования OCR технологий, используемых программами автопостинга. Попробуем сделать каптчу нестандартной, что может решить проблему, т.к. спамерам проще пройтись по нескольким тысячам незащищенных форумов, чем модифицировать программу, чтобы проспамить несколько нестандартных сайтов.
Находим от корня форума файл /includes/usercp_confirm.php и находим в нем строку $img_width = 0; Если исправить значение $img_width, например на 1 или 2 или -1 или -2, то вместо стандартного изображения получаются вот такие замечательное уродство:
$img_width = 1
$img_width = -1
$img_width = 2
$img_width = -2
которые, надо понимать, еще вполне распознаваемы человеком, но усложняют OCR процесс для ботов. Конечно, значения 2 и -2 это слишком, обычно хватает 1 или -1.
Еще более гибкий способ, заменить строку $img_width = 0; на что-то такое:
$img_width_arr = array(-2, -1, 1, 2);
$img_width = $img_width_arr[rand(0, 3)];
или такое: $img_width = rand(0, 1) == 0 ? -1 : 1;
Данный трюк далек от идеала, но обычно помогает. Предпочтительным же представляется способ, удачно применяемый на rapidshare, когда несколько заготовок captcha с разными экзотическими фонтами и разными подложками выдается пользователю случайным образом
Хороший стиль программирования на PHP
Когда пишите PHP программу, придерживайтесь следующих простых правил:
1. Инициализируйте переменные
Несмотря на то, что язык PHP не требует инициализации и типизирования переменных, возьмите себе за правило это делать всегда, это убережет Вас от многих трудноуловимых ошибок в будущем.
2. Как можно меньше используйте Echo, пользуйтесь по необходимости буферизированным выводом
Хороший код:
for ($i = 0, $max = sizeof($arr), $str = ""; $i < $max; $i++) $str .= $arr[$i];
echo $str;
?>
Быстрый код:
ob_start();
for ($i = 0, $max = sizeof($arr); $i < $max; $i++) echo $arr[$i];
?>
3. Всегда пользуйтесь операторами Incremental/Decremental
$i--;
++$i;
--$i;
4. Всегда пользуйтесь комбинированными операторами
$i *= 10;
$i /= 10;
$str .= "";
...
5. Разберитесь с оператором сравнения - 'идентичность' и используйте его.
6. Пользуйтесь "улучшенными" проверенными конструкциями:
Цикл по "обычному" массиву
for ($i = 0, $max = sizeof($arr); $i < $max; $i++) echo $arr;
Цикл по "ассоциативному" массиву
while (list(, $val) = each($arr)) echo $val;
если нужен ключ:
Чтение результата запроса из БД в массив
while ($row = @mysql_fetch_assoc($resquery)) $arr[] = $row;
Формирование из массива списка IN в SQL запросе
$query = sprintf("SELECT * FROM `table` WHERE `id` IN ('%s')",
implode("', '", $arr));
/*
В итоге получится строка:
SELECT * FROM `table` WHERE `id` IN ('1', '2')
*/
7. Пользуйтесь "правильной" конструкцией для формирования строки SQL запроса
$val1,
mysql_real_escape_string($val2));
Замечание: используйте символы `` в именах полей, баз, таблиц и т.д., чтобы не иметь проблем с именованием
8. Не ленитесь, всегда комментируйте код, но только четкими и достаточными предложениями
9. Старайтесь по максимуму, не смешивать PHP код и HTML код
10. Прочитайте про проект PEAR и научитесь грамотному именованию переменных, функций и т.д.
11. Не изобретайте велосипед, пользуйтесь готовыми решениями
много интересного Вы найдете в PEAR и sourceforge.net.
12. Поверьте, можно замечательно прожить без объектно-ориентированного программирования, всегда подумайте над целесообразностью его использования в своей задаче.
13. И напоследок самое главное: ВСЕГДА проверяйте, что принимаете и что отсылаете
Имеются ввиду типы переменных, их размерность, наличие/отсутствие обратных слэшей в строках, HTML сущности (entities), URL encoding и т.п., помните, PHP за Вас это никогда не сделает.
14. Всегда используйте относительные пути
Один из примерных методов:
include("config.php");
...
?>
файл config.php:
define("BASEDIR", dirname(__FILE__));
require(BASEDIR."/lib/libs.php");
...
?>
При таком способе, вне зависимости от того, где находится Ваш скрипт, в корне сайта или в его поддиректориях, он всегда будет правильно выставлять пути до Ваших инклудингов, от текущей папки файла config.php.
15. Разберитесь с тернарным оператором и используйте его.
return($err !== 0 ? false : true);
Распаковка ZIP-архива на FTP-сервере
Если Вам приходится достаточно часто закачивать по FTP скрипты, содержащие большое количество файлов (например, CMS, блоги), то можно использовать существенно более удобный способ их закачки: закачать один упакованный в ZIP файл и в последствии распаковать его прямо на сервере.
Согласитесь, что процесс закачки проходит гораздо быстрее, если заливать всего лишь один файл, нежели все файлы по отдельности, при условии одинакового размера в том и другом случае. Когда закачивается большое количество файлов, происходит множественное обращение FTP-клиента к серверу после каждого файла, на что уходит определенное время.
Более того, при использовании SOCKS или прокси, во время закачки множества маленьких файлов может произойти разрыв соединения с FTP-сервером, а это гарантирует еще большее количество потраченного времени, чего не может произойти, когда заливаешь всего один файл.
При частом повторении одних и тех же действий каждый стремится упростить выполняемую задачу. В данном случае существенно облегчает жизнь PHP Unzipper – скрипт, который за считанные секунды распаковывает закачанный на сервер zip архив.
Вот его предназначение:
- Незаменимый инструмент для веб-мастера, которому часто приходится закачивать на сайт много файлов и папок.
- Позволяет значительно сэкономить время и трафик (архив занимает гораздо меньший размер, кроме того при закачке большого количества файлов, исходящий трафик создает значительно большую долю входящего трафика, как раз за счет частого обращения к серверу) – достаточно закачать архив и скрипт распакует его мгновенно.
- Дополнительной функцией является возможность просмотра структуры директорий на сайте, а также возможность просмотра содержимого zip архивов на сервере без их распаковки.
- Скрипт очень прост в установке, использует авторизацию по логину и паролю.
(38 Kb).
Как устанавливается:
- Закидываем находящиеся в архиве файлы index.php и pclzip.lib.php на сервер в ту папку, куда будем устанавливать движок (возможно потребуется переименовать index.php в любой другой, поскольку закачиваемый скрипт движка может иметь файл с таким же названием).
- Устанавливаем CHMOD для файла index.php на 777 (примечание - не знаю, почему, но в инструкции к скрипту написано именно так, а практика показала, что 777 нужно ставить для папки, в которую будет распаковываться архив).
- Открываем index.php в браузере, скрипт попросит зарегистрироваться – указываем логин и пароль (если после регистрации снова появилась эта же форма, устанавливаем для папки, в которую закачан PHP Unzipper, CHMOD на 777).
- Авторизуемся для работы с zip архивом.
При архивировании скрипта движка прошу обратить внимание на тот момент, что архивировать нужно не саму папку, в которой лежит этот скрипт, а то, что в ней находится, поскольку в каком виде вы запакуете движок, в таком виде его и разархивирует PHP Unzipper.
На некоторых серверах иногда возникает ситуация, когда файлы, распакованные таким образом становятся залоченными, т.е. их невозможно перезаписать или сменить им права доступа вручную.
В таком случае нужно установить им права доступа PHP-средствами.
Для смены CHMOD файлам и папкам следует запустить php-файл со следующим кодом:
-
-
chmod ("file1.php", 0666);
-
chmod ("file2.php", 0666);
-
chmod ("directory1", 0777);
-
chmod ("directory2", 0777);
-
?>
что устанавливает права доступа 666 к файлам file1.php и file2.php и права доступа 777 папкам directory1 и directory2.