English version

Профессиональный PHP-программист:

создание сайтов, движков, аудит и оптимизация сайтов
Система построения сайта SBS "Web-Pro"
SBS Web-Pro Средство для создания и удобного управления сайтом, имеющее расширенные по сравнению с CMS (Content Management System) характеристики. Более 5 лет успешного использования. Подробнее
Пишите!
ICQ
176621941

Записки web-программиста

PHP и web-программирование

При сохранении из textarea...

...нужно проверять get_magic_quotes_gpc(), например:
if (get_magic_quotes_gpc()) $settings = stripslashes($settings);

Если нужно, чтобы директивы PHP обрабатывались в файлах .html и .htm...

...то необходимо создать файл .htaccess. Действие этого файла будет распространятся на текущую и на все расположенные ниже директории. Файл должен содержать строку вида:
AddHandler php-script .html .htm

HTTP-заголовки определены в RFC1945 (HTTP/1.0) и RFC2068 (HTTP/1.1)

Если неверно работает сортировка в MySQL 4

Проблему можно решить написанием запросов с "binary":
SELECT ... FROM ... WHERE ... ORDER BY BINARY field_name
Это же справедливо и для строковых полей, по которым производится выборка.

Для MySQL 5+ нужно внимательно относиться к collation. Неверно загруженный дамп вызовет ошибки выборки и сортировки, хотя тексты на сайте могут смотреться корректно. Для корректной работы использовать phpMyAdmin не ниже 2.10.3.

Сравнение полей типа float

MySQL неверно работает (точнее так устроено) при сравнении float-полей - округляет. Поэтому вместо простого "field>value" надо использовать запрос типа:
$mobj->SQL = "select id from photos where photo_no - ".$photo->photo_no." > 0.1 order by photo_no limit 1";

Кириллица и сортировка в PHP

Некоторые PHP-функции могут работать некорректно с кириллицей, если не выполнить установку локали (делается до вызова функции):
setlocale (LC_CTYPE, "ru_RU.CP1251");
или
setlocale (LC_CTYPE, "ru_RU.UTF-8");
К таким функциям относятся функции поиска, замены (preg_match, preg_replace, str_ireplace), а также запросы в базу данных.

Примеры rewrite


RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^(.*)[gif|css|jpg|htm|js|swf|cm|index.phtml]$
RewriteRule ^(.*)$ /tourism/index.phtml
Слеш в конце

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]
Редирект на другой сервер с сохранением структуры страниц
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.example.ru/$1 [R=301,L]:
IE "name" и "id" воспринимает как одно и то же...
... при получении через getElementById().

Замена с вставкой найденного фрагмента

$content->body_f = preg_replace("/\[IMG(.*?)\]/", "-\\1---------", $content->body_f);

timestamp в PHP только примерно до 2020 г.

Поиск и замена найденного фрагмента через preg_replace()

$descr = preg_replace("/\[IMG (.*?) LEFT]/", 
'<img src="'._MOBJ_I_.'?img=data/pictures/\\1" />', $tmp1[1]);

Настройка параметров PHP при работе в режиме FastCGI

Все настройки вида
php_flag параметр значение
которые в других случаях прописываются в .htaccess, здесь необходимо указывать в php.ini в виде:
параметр=значение;

Удобный способ работы с датой

В PHP 5.2 появился класс для работы с датой - DateTime. Его удобно применять для модификации даты, а также вычисления возраста, например:
$date = new DateTime('2009-04-02 08:00:00');
$date->modify("+1 hour");
$date->diff(new DateTime()); // PHP 5.3.0+
echo $date->format("Y-m-d H:i:s");

Как сделать выборку случайных записей из таблицы

Простейший вариант:
select * from wares order by rand() limit 10;
НО такой вариант сильно грузит сервер, особенно при большом количестве записей, т.к. происходит создание временной таблицы равной исходной таблице.

Можно предварительно подготовить массив идентификаторов и, используя его, выбрать случайные записи (по одной) с использованием "UNION".

select * from wares limit <подготовленный идентификатор>, 1;
Такой вариант также может создать нагрузку, если нужно выбрать большое количество записей или таблица содержит сотни тысяч записей.

Третий вариант предполагает замену "UNION" на:

select id from wares where id IN (1, 1000, 25000...);
Имеет место заметное ускорение работы.

Как разрешить доступ к сайту только с одного IP-адреса

Пишем в .htaccess:
deny from all
allow from 127.0.0.1

Склонение слова в зависимости от числа

В $w1, $w2, $w3 нужно задать слова для разных случаев.
function word_end($number, $w1, $w2, $w3)
{
  if (substr($number,-1)==1 && substr($number,-2)!=11) return $w1;

  if ((substr($number,-1)==2 && substr($number,-2)!=12)
    || (substr($number,-1)==3 && substr($number,-2)!=13)
    || (substr($number,-1)==4&& substr($number,-2)!=14))
    return $w2;

  return $w3;
}

Как отключить выполнение PHP в папке

Можно добавить в .htaccess в нужной папке:
php_flag engine 0
AddType "text/html" .php .php3 ...
В некоторых случаях может понадобится отключения rewrite'а:
RewriteEngine Off

Простая работа с XML на PHP

PHP 5 предоставляет удобный упрощенный способ работы с XML - SimpleXML. Поддержка включена по умолчанию. XML-данные можно прочитать из файла или из переменной, и они будут представлены как обычный объект PHP. Нужно учитывать, что верхний тег XML-данных не включен в объект, а является его именем (функция getName()).

Есть несколько правил: - числовой индекс ("$xml_data->body->p[0]") обозначает конкретный элемент,
- нечисловой индекс ("$xml_data->body->p['align]") обозначает атрибут элемента,
- значение элемента выводится как текст БЕЗ потомков. Для вывода потомков следует использовать функцию asXML().

Следует помнить, что конструкция вида $xml_data->node выдаст объект даже, если этот узел содержит число. Это нужно учитывать при числовых операциях, делая преобразование intval(). Однако если есть несколько узлов с именем "node", то $xml_data->node будет являться массивом, и его можно перебрать через foreach(), тем не менее print_r() выдаст первое значение этого массива.

Так можно получить всех потомков тега "body":
$xml_data->body->children()

Так можно получить атрибуты тега "a":
$xml_data->body->p[0]->a->attributes();

Записать изменные данные можно, например, так:
file_put_contents('filename.xml',$xml_data->asXML());

Пользуйтесь выгодными услугами, рекомендую!

RuWeb.net - гибкий хостинг