Richter web-программист: создание сайтов, написание интернет-магазинов, создание скриптов на PHP, MySQL, JavaScript. Качественная верстка HTML, CSS. Системы управления сайтом, CMS. Оптимизация для поисковиков
English version

PHP-программист: полезные заметки, решения, записки о PHP и программировании сайтов

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

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

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

Парсинг длинных строк, проблема preg_match_all()

При поиске подстроки длиной более 99992 байта функция preg_match_all() выдаст пустой результат. Проблема решается установкой большего значения параметра pcre.backtrack_limit в php.ini - по умолчанию его значение 100000. Наличие превышения лимита можно проверить через preg_last_error().
Рейтинг: 1.0. Голосов: 1
(0) Добавить комментарий

PHP-скрипт в шелле

#! /usr/local/bin/php

...

Рейтинг: 10.0. Голосов: 1
(0) Добавить комментарий

Простая работа с 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());

Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

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

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

В $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;
}
Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

Пишем в .htaccess:
deny from all
allow from 127.0.0.1
Рейтинг: 10.0. Голосов: 1
(0) Добавить комментарий

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

Простейший вариант:
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...);
Имеет место заметное ускорение работы.
Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

В 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");
Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

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

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

$descr = preg_replace("/\[IMG (.*?) LEFT]/", 
'<img src="index.php?img=data/pictures/\\1" />', $tmp1[1]);
Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

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

Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

Примеры 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]
Редирект с адреса с www на адрес без www
RewriteCond %{HTTP_HOST} ^www.example.ru$ [NC]
RewriteRule ^(.*)$ http://example.ru/$1 [R=301,L]
Редирект на другой сервер с сохранением структуры страниц
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.example.ru/$1 [R=301,L]:
IE "name" и "id" воспринимает как одно и то же...
... при получении через getElementById().
Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

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

Сравнение полей типа 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";
Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

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

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

Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

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

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

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

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

Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

Миграция на PHP 5

При переводе скриптов на PHP 5 нужно учесть следующее:
  • работа функции array_merge() отличается, обоими аргументами должны быть массивы;
  • в PHP 5 функция, имеющая такое же имя как и класс, считатается конструктором только в том случае, если определена в самом (том же) классе;
  • проверить функцию strtotime() c пустым аргументом при "- * days" - в PHP 5 дает иной результат, чем в PHP 4;
  • имена переменных типа "HTTP_REFERER".
Рейтинг: 0.0. Голосов: 0
(0) Добавить комментарий

Рекомендую действительно качественный хостинг,
пользуюсь сам и предлагаю вам:

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