<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mihalytch personal blog &#187; PHP</title>
	<atom:link href="http://mihalytch.org.ua/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://mihalytch.org.ua</link>
	<description>Все о высоких технологиях</description>
	<lastBuildDate>Mon, 05 Dec 2011 16:05:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Алгоритм P: Перемешивание массива</title>
		<link>http://mihalytch.org.ua/programming/php/algoritm-p-peremeshivanie-massiva.html</link>
		<comments>http://mihalytch.org.ua/programming/php/algoritm-p-peremeshivanie-massiva.html#comments</comments>
		<pubDate>Sun, 17 Apr 2011 19:45:02 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[алгоритм]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/?p=348</guid>
		<description><![CDATA[Приветствую друзья. Сегодня речь пойдет о перемешивании одномерно массива. Будем пользоваться Алгоритмом P, описанным Дональдом Кнутом (Искусство программирования. Том 2, [...]]]></description>
			<content:encoded><![CDATA[<p>Приветствую друзья.</p>
<p>Сегодня речь пойдет о <strong>перемешивании одномерно массива</strong>. Будем пользоваться Алгоритмом P, описанным Дональдом Кнутом (Искусство программирования. Том 2, с.163).</p>
<p>Для начала процитируем описание алгоритма.</p>
<p><strong>Алгоритм P (Перемешивание)</strong>. Пусть X1, X2, &#8230;, Xt &#8211; множество t чисел для перемешивания.</p>
<p><strong>P1</strong>. &#8220;Инициализация&#8221;. Присвоить j &lt;- t.</p>
<p><strong>P2</strong>. &#8220;Генерация U&#8221;. Генерировать случайное число U, равномерно распределенное между 0 и 1.</p>
<p><strong>P3</strong>. &#8220;Замена&#8221;. Присвоить j &lt;- round(j*U) + 1, где round() &#8211; операция округления до целого числа. Заменим Xk &lt;-&gt; Xj.</p>
<p><strong>P4</strong>. &#8220;Уменьшение j&#8221;. Уменьшить j на 1. Если j&gt;1, возвратиться к шагу <strong>P2</strong>.</p>
<p><span id="more-348"></span><br />
А теперь перейдем к реализации данного алгоритма на PHP.</p>
<pre class="brush: php; title: ; notranslate">
# Приведем Алгоритм Р от Кнута в действие
function ShuffleP(&amp;$X) {
$N = count($X); // Кол-во элементов массива

# P1: Инициализация
$j = $N-1; // Индекс последнего элемента массива

do {
# P2: Генерация U, равномерно распределенного между 0 и j
$U = rand(0, $j);

# P3: Округлить U до целого и присвоить k. Переставить местами Xk &lt;-&gt;Xj
$k = round($U);

$tmp = $X[$k];
$X[$k] = $X[$j];
$X[$j] = $tmp;
unset($tmp);

# P4: Уменьшить j на 1. Если j&gt;0: вернуться к P2
$j--;
} while($j&gt;0);
}
</pre>
<p>Исходный код со скриптом для демонстрации работы функции можно скачать по ссылке <a href="http://mihalytch.org.ua/download/alg.shuffle.zip" >alg.shuffle.zip</a> .</p>
<p>Спасибо за внимание!</p>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/algoritm-p-peremeshivanie-massiva.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WP Super Cache &#8211; rewrite rules для nginx</title>
		<link>http://mihalytch.org.ua/administration/wpsupercache-rewrite-rules-for-nginx.html</link>
		<comments>http://mihalytch.org.ua/administration/wpsupercache-rewrite-rules-for-nginx.html#comments</comments>
		<pubDate>Fri, 28 Nov 2008 10:47:51 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Cookie]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[UTF-8]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/administration/wpsupercache-rewrite-rules-for-nginx.html</guid>
		<description><![CDATA[Если вы решились прочитать это пост, значит вы решили перейти (или уже перешли, что вероятнее всего) с  apache на nginx. [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:left; margin:5px;" src="http://mihalytch.org.ua/wp-content/nginx.gif" alt="nginx" />Если вы решились прочитать это пост, значит вы решили перейти (или уже перешли, что вероятнее всего) с  apache на nginx. Движок вашего сайта WordPress, и необходимо использовать плагин &#8220;WP Super Cache&#8221;. Текущая статья посвящена тому, как настроить rewrite rules под nginx.<span id="more-68"></span></p>
<p>Super Cache после установки и активации попросит нас сделать .htaccess доступным для записи или записать в него следующие правила:</p>
<pre class="brush: plain; title: ; notranslate">
# BEGIN WPSuperCache
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /
AddDefaultCharset UTF-8
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*=.*
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz [L]
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} !.*=.*
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html [L]
&lt;/IfModule&gt;
# END WPSuperCache
</pre>
<p>Но проблема в том, что все эти правила, как и сам .htaccess, абсолютно бесполезны для nginx`a, так как все rewrite rules прописываются в nginx.conf.</p>
<p>Итак  открываем файл конфигурации nginx.conf, находим</p>
<pre class="brush: plain; title: ; notranslate">
location /путь/к/блогу/ {
...
}
</pre>
<p>&#8220;/путь/к/блогу/&#8221; &#8211; вот вместо этого, скорее всего, будет стоять просто &#8220;/&#8221;</p>
<p>и между фигурными скобочками вписываем ряд директив:</p>
<pre class="brush: plain; title: ; notranslate">
gzip_static on;
if (-f $request_filename) {
 break;
}  

set $supercache_file '';
set $supercache_uri $request_uri;  

if ($request_method = POST) {
 set $supercache_uri '';
}  

if ($query_string) {
 set $supercache_uri '';
}  

if ($http_cookie ~* &quot;comment_author_|wordpress|wp-postpass_&quot; ) {
 set $supercache_uri '';
}  

if ($supercache_uri ~ ^(.+)$) {
 set $supercache_file /blog/wp-content/cache/supercache/$http_host/$1index.html;
}  

if (-f $document_root$supercache_file) {
 rewrite ^(.*)$ $supercache_file break;
}  

if (!-e $request_filename) {
 rewrite . /blog/index.php last;
}
</pre>
<p>Сохраняем и перезапускаем сервер.</p>
<p>P.S. Если мы хотим пользоваться gzip компрессией, то необходимо будет перекомпилировать nginx с параметром &#8220;<em>–-with-http_gzip_static_module</em>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/administration/wpsupercache-rewrite-rules-for-nginx.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Получаем список всех вложеных файлов и папок на php</title>
		<link>http://mihalytch.org.ua/programming/php/recursive-reading-files-on-php.html</link>
		<comments>http://mihalytch.org.ua/programming/php/recursive-reading-files-on-php.html#comments</comments>
		<pubDate>Tue, 18 Nov 2008 10:12:17 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[chmod]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/programming/php/recursive-reading-files-on-php.html</guid>
		<description><![CDATA[Начнем как всегда с постановки задачи. Нам необходимо получить список всех вложенных директорий и файлов, находящихся в конкретной папке, и [...]]]></description>
			<content:encoded><![CDATA[<p>Начнем как всегда с постановки задачи. Нам необходимо получить список всех вложенных директорий и файлов, находящихся в конкретной папке, и выполнить некоторые действия над ними. Для этого напишем функцию, которая будет получать список всех файлов и папок, отделять эти две категории, обрабатывать отдельно и в случае нахождения вложенных папок будет вызывать себя рекурсивно.<span id="more-67"></span></p>
<p>В нижеприведенном примере мы будем выполнять действия над вложенными объектами текущей папки, присваивать всем файлам права на чтение/запись/выполнение &#8211; 666, а папкам &#8211; 777 и выводить их список на экран.</p>
<pre class="brush: php; title: ; notranslate">
function rdir ($path2dir) {
    $d = dir ($path2dir);  

    while (false !== ($entry = $d-&gt;read())) {  

        if ($entry!='.' &amp;&amp; $entry!='..' &amp;&amp; $entry!='' ) {
            $all_path = $path2dir.$entry;
            $new_path = go ($all_path, is_file($all_path));  

            if (!is_file($all_path)) {
                if (!rdir ($new_path)) {
                    return false;
                }
            }
        }
    }  

    return true;
}

function go ($path2file, $is_file = true) {  

    if ($is_file) {  

        # выполняем операцию над файлом
        # выведем относительный путь к обрабатываемому файлу
        echo $path2file,&quot;\n&quot;;  

        # установим необходимые права на файл
        if (!chmod($path2file,0666)) {
            return false;
        }  

    } else {  

        # выполняем операцию над папкой
        $path2file = $path2file.'/';  

        # выведем относительный путь к обрабатываемой директории
        echo &quot;\n\n&quot;,$path2file,&quot;\n&quot;;  

        # установим необходимые права на папку
        if (!chmod($path2dir,0777)) {
            return false;
        }
    }  

    return $path2file;
}

# начинаем с текущей папки
$folder = './';  

# непосредственно вызываем функцию
if (rdir ($folder)) {
    echo 'DONE';
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/recursive-reading-files-on-php.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Время выполнения php скрипта</title>
		<link>http://mihalytch.org.ua/programming/php/the-time-of-php-script.html</link>
		<comments>http://mihalytch.org.ua/programming/php/the-time-of-php-script.html#comments</comments>
		<pubDate>Tue, 11 Nov 2008 10:08:06 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[time]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/programming/php/the-time-of-php-script.html</guid>
		<description><![CDATA[У каждого, кто хоть немного задумывался об оптимизации быстродействия своего кода, возникала потребность в измерении времени исполнения всего скрипта либо [...]]]></description>
			<content:encoded><![CDATA[<p>У каждого, кто хоть немного задумывался об оптимизации быстродействия своего кода, возникала потребность в измерении времени исполнения всего скрипта либо его участков. Конечно, данный способ не идеален в плане точности измерения, но для грубых измерений вполне сойдет.<span id="more-66"></span></p>
<pre class="brush: php; title: ; notranslate">
function get_time () {
        # Считываем текущее время
    $mtime = microtime();
        # Разделяем секунды и миллисекунды
    $mtime = explode(&quot; &quot;,$mtime);
        # Составляем одно число из секунд и миллисекунд
    $mtime = $mtime[1] + $mtime[0];
        # Возвращаем текущее время в переменную
    return $mtime;
}  

function end_time ($start_time) {
        # Записываем текущее время в переменную
    $end_time = get_time ();
        # Вычисляем разницу
    $total_time = ($end_time - $start_time);
        # Выводим не экран
    echo 'Страница сгенерирована за ',$total_time,' секунд !';
}  

    # Записываем в переменную время на начало измерения
$start_time = get_time ();  

    # некоторый участок кода
for ($i=0; $i&amp;lt;1000000; $i++) {
    #
}  

    # Выводим результат
end_time ($start_time);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/the-time-of-php-script.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IBLC group</title>
		<link>http://mihalytch.org.ua/news/iblc-group.html</link>
		<comments>http://mihalytch.org.ua/news/iblc-group.html#comments</comments>
		<pubDate>Mon, 03 Nov 2008 15:47:05 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/portfolio/iblc-group.html</guid>
		<description><![CDATA[IBLC group Сайт-визитка IBLC Group &#8211; группа правового консалтинга в сфере международного бизнеса. Выполненая работа: Блочная резиновая верстка div`ами. Адрес [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td><img src="http://mihalytch.org.ua/wp-content/iblc.gif" alt="IBLC group preview" /></td>
<td class="portfolio">
<h2><a href="http://mihalytch.org.ua/go.php?url=iblc.in.ua"  target="_blank" title="IBLC group">IBLC group</a></h2>
<p><em>Сайт-визитка</em></p>
<p>IBLC Group &#8211; группа правового консалтинга в сфере международного бизнеса.</td>
</tr>
</table>
<p><span id="more-64"></span></p>
<p><em>Выполненая работа</em>: Блочная резиновая верстка div`ами.</p>
<p><em>Адрес сайта</em>: <a href="http://mihalytch.org.ua/go.php?url=iblc.in.ua"  title="IBLC group" target="_blank">http://www.iblc.in.ua/ </a></p>
<p style="text-align: center"><img src="http://mihalytch.org.ua/wp-content/iblc1.gif" alt="IBLC group main page preview" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/news/iblc-group.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Время и дата в php</title>
		<link>http://mihalytch.org.ua/programming/php/date-and-time-in-php.html</link>
		<comments>http://mihalytch.org.ua/programming/php/date-and-time-in-php.html#comments</comments>
		<pubDate>Fri, 29 Aug 2008 14:36:48 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[DATE]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/programming/php/date-and-time-in-php.html</guid>
		<description><![CDATA[Эта статья представляет собой собрание нескольких полезных советов по манипулированию датой и временем в PHP. Для начала разберемся с установкой [...]]]></description>
			<content:encoded><![CDATA[<p>Эта статья представляет собой собрание нескольких полезных советов по манипулированию датой и временем в PHP.<span id="more-55"></span></p>
<p>Для начала разберемся с <strong>установкой временной зоны</strong>. Для этого всего лишь необходимо воспользоваться функцией</p>
<pre>bool <a target="_blank" href="/go.php?url=ua2.php.net/manual/en/function.date-default-timezone-set.php" title="date_default_timezone_set">date_default_timezone_set</a> ( string <tt>$timezone_identifier</tt>);</pre>
<p>Список временных зон (параметров для вышеописанной функции) доступен на <a target="_blank" rel="nofollow" href="http://mihalytch.org.ua/goto/http://www.php.net/manual/en/timezones.others.php" target="_blank"  title="Список временных зон">официальном сайте PHP</a>. Итак, для того чтобы установить нужную нам временную зону, необходимо вызвать функцию date_default_timezone_set в начале исполняемого скрипта.</p>
<p>Для того чтобы определить текущую временную зону в PHP есть стандартный инструмент:</p>
<pre>string <a href="http://mihalytch.org.ua/go.php?url=ua2.php.net/manual/en/function.date-default-timezone-get.php" target="_blank"  title="date_default_timezone_get">date_default_timezone_get</a>  ( void  );</pre>
<p>О <a href="http://mihalytch.org.ua/programming/php/comparison-of-dates.html" target="_blank"  title="Сравнение дат в PHP">сравнении двух дат</a> я уже упоминал ранее. Далее рассмотрим<strong> вычитание и сложение даты и времени</strong> или <strong>как определить какая дата и время были N дней X часов назад!? </strong> <img src='http://mihalytch.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Года полтора назад встречал &#8220;интересное&#8221; решение. Некий разработчик загнал в массив соответствия &#8220;номер месяца&#8221;=&gt;&#8221;количество дней&#8221;, затем парсил текущую дату и &#8220;вручную&#8221; отнимал или прибавлял количество дней, часов, минут, секунд.  Описывать подробно этот алгоритм не буду, так как не привык изобретать велосипед. Предлагаю &#8220;формулу&#8221; гораздо проще:</p>
<pre class="brush: php; title: ; notranslate">
# $sec - разница в секундах с текущим временем;
# $min - разница в минутах с текущим временем;
# $hour - разница в часах с текущим временем;
# $days - разница в днях с текущим временем;
$need_date = date (&quot;Y-m-d H:i:s&quot;, time()+( $sec + 60*($min + 60*($hour + 24*$day))));
</pre>
<p>Где &#8220;<em>Y-m-d H:i:s</em>&#8221; всего лишь шаблон времени, которое мы получим в текстовом формате.</p>
<p>Для тех, кто хочет узнать не будущее, а прошлое время &#8211; необходимо заменить вот этот плюс <em>&#8230; time()<font color="#ff0000">+</font>( $sec &#8230;</em> на минус.</p>
<p>На этой оптимистической ноте заканчиваю описание. Остальные возможности PHP предлагаю рассмотреть самостоятельно на официальном сайте php.net в качестве домашнего задания.</p>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/date-and-time-in-php.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Постраничный вывод</title>
		<link>http://mihalytch.org.ua/programming/php/paginal-conclusion.html</link>
		<comments>http://mihalytch.org.ua/programming/php/paginal-conclusion.html#comments</comments>
		<pubDate>Thu, 24 Jul 2008 12:41:05 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/programming/php/paginal-conclusion.html</guid>
		<description><![CDATA[Начнем по обыкновению с постановки задачи. Необходимо организовать постраничный вывод любого рода контента. Поле деятельности &#8211; движок, написаный на PHP, [...]]]></description>
			<content:encoded><![CDATA[<p>Начнем по обыкновению с постановки задачи. Необходимо организовать постраничный вывод любого рода контента. Поле деятельности &#8211; движок, написаный на PHP, и данные, которые хранятся в базе MySQL.<span id="more-44"></span></p>
<p>Разобьем нашу задачу на два подпункта. Нам необходимо организовать выбор из базы необходимой нам части информации (иными словами &#8211; страницы), а также сгенерировать меню навигации по страницам.</p>
<p>Я считаю наиболее удобной следующего вида схему навигации по страницам:</p>
<p>&lt;&lt; &#8230; n-1 n n+1 &#8230; &gt;&gt;,</p>
<p>где &#8220;&lt;&lt;&#8221; переход на первую страницу (&#8220;&lt;&lt; &#8230; &#8221; не отображаются когда текущая страница первая), &#8221; n &#8221; &#8211; номер текущей страницы, &#8220;n-1&#8243;и &#8220;n+1&#8243; &#8211; ссылки на предыдущую и следующую страницы соответственно, &#8220;&#8230;&#8221; просто три точки. =)</p>
<p>Теперь приступим непосредственно к делу. Для начала определим константу, которой присвоим максимально допустимое значение единиц контента на страницу.</p>
<pre class="brush: php; title: ; notranslate">DEFINE('ITEM_PER_PAGE', 4);</pre>
<p>Следующим шагом необходимо узнать количество всех доступных элементов. Например:</p>
<pre class="brush: php; title: ; notranslate">
$items_cnt_arr = $this-&gt;db-&gt;GetRow(&quot;SELECT COUNT(`id`) as `all` FROM `content` &quot;);
# в этой переменно уже храниться общее кол-во элементов.
$items_cnt = $items_cnt_arr['all'];
#делим кол-во всех элементов на кол-во элементов на странице и округляем до большего
$max_pages = ceil($items_cnt/ITEM_PER_PAGE);
</pre>
<p>Теперь определить какой передаваемый параметр будет отвечать за запрашиваемую страницу и проверить допустимо ли значение, которое он принимает.</p>
<pre class="brush: php; title: ; notranslate">
if ( empty($_GET['page']) || !is_numeric($_GET['page'])) {
    # если передаваемое значение пусто или не число
    $curr_page = 0;
} elseif ($_GET['page']&gt;=$max_pages){
    # если не превышает максимально допустимого числа страниц
    $curr_page = ($max_pages-1);
} else {
    # если входит в область допустимых значений
    $curr_page = $_GET['page'];
}
</pre>
<p>Для того чтобы выбрать необходимые элементы для вывода на страницу теперь достаточно выполнить следующего рода запрос:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT *
FROM `content`
LIMIT &quot;.($curr_page*ITEM_PER_PAGE).&quot;, &quot;.ITEM_PER_PAGE;
</pre>
<p>(выделенная жирным часть обязательно должна присутствовать <img src='http://mihalytch.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Теперь организуем генерацию меню навигации.</p>
<pre class="brush: php; title: ; notranslate">
$_nav_text = '';
# ссылка на первую страницу
if ($curr_page&gt;0) {
    # если текущая страница не первая
    $_nav_text .= '&lt;a href=&quot;/phone/0&quot; mce_href=&quot;/phone/0&quot;&gt;«&lt;/a&gt;  ...';
} 

for ($k=0;$k&amp;lt;3;$k++) {
    # номер страницы, содержащейся в ссылке
    $_link_id = $curr_page+($k-1);

    if (($_link_id &lt; $max_pages) &amp;&amp; ($_link_id&gt;=0)) {
        if ($_link_id != $curr_page) {
            # выводим ссылки на предыдущие и следующие страницы
            $_nav_text .= ' &lt;a href=&quot;index.php?page='.$_link_id.'&quot; mce_href=&quot;index.php? page='.$_link_id.'&quot;&gt;'.($_link_id+1).'&lt;/a&gt; ';
        } else {
            # выводим номер текущей страницы
            $_nav_text .= ' &lt;b&gt;'.($_link_id+1).'&lt;/b&gt;';
        }
    }
}

// ссылка на последнюю страницу
if ($curr_page &lt; ($max_pages-1)) {
    # если текущая страница не последняя
    $_nav_text .= '  ...  &lt;a href=&quot;index.php?page='.($max_pages-1).'&quot; mce_href=&quot;index.php?page='.($max_pages-1).'&quot;&gt;»&lt;/a&gt;; ';
}
</pre>
<p>Теперь в переменной $_nav_text содержится код ссылок меню навигации.<br />
<strong>UPD.1.</strong> В данной статье принято считать страницы с нуля. Чтобы получить человеко понятную нумерацию, нужно изменить <span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;">$curr_page = $_GET['page']; на $curr_page = $_GET['page']-1; .</span></p>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/paginal-conclusion.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Аналог foreach в javascript</title>
		<link>http://mihalytch.org.ua/programming/php/analogue-foreach-in-javascript.html</link>
		<comments>http://mihalytch.org.ua/programming/php/analogue-foreach-in-javascript.html#comments</comments>
		<pubDate>Wed, 23 Jul 2008 21:39:40 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/programming/php/analogue-foreach-in-javascript.html</guid>
		<description><![CDATA[В PHP конструкция foreach &#8211; это очень удобный инструмент для обхода элементов массива. В бою на самом деле используеться этот [...]]]></description>
			<content:encoded><![CDATA[<p>В PHP конструкция foreach &#8211; это очень удобный инструмент для обхода элементов массива.<span id="more-43"></span><br />
<s>В бою</s> на самом деле используеться этот оператор следующим образом:</p>
<pre class="brush: php; title: ; notranslate">
foreach ($some_array as $key=&amp;gt;$val) {
    echo $key,' = ',$val,'';
}
</pre>
<p>Опять таки по велению случая, мне было необходимо использовать ее аналог в JavaScript. Соответствующий вариант использования аналогичной конструкции в JavaScript`е представлен ниже:</p>
<pre class="brush: php; title: ; notranslate">
for (var key in some_array) {
    var val = some_array [key];
    alert (key+' = '+val);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/analogue-foreach-in-javascript.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>captcha на php</title>
		<link>http://mihalytch.org.ua/programming/php/captcha-in-php.html</link>
		<comments>http://mihalytch.org.ua/programming/php/captcha-in-php.html#comments</comments>
		<pubDate>Fri, 04 Jul 2008 15:34:52 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/programming/php/captcha-in-php.html</guid>
		<description><![CDATA[Создаем &#8220;каптчу&#8221; или боремся со спам-ботами) Перед нами стоит задача &#8211; написать простой скрипт, генерирующий картинку с циферками, а также [...]]]></description>
			<content:encoded><![CDATA[<p>Создаем &#8220;каптчу&#8221; или боремся со спам-ботами)<span id="more-38"></span></p>
<p>Перед нами стоит задача &#8211; написать простой скрипт, генерирующий картинку с циферками, а также нам необходимо будет проверить, соответствуют ли введенные пользователем данные изображенным на&#8221;captcha&#8221;.</p>
<p>Первым делом пишем скрипт:</p>
<pre class="brush: php; title: ; notranslate">
if (empty($_SESSION)) {
    session_start();
}
    # generate 5 digit random number
$rand = rand(10000, 99999);
$_SESSION['captcha'] = md5($rand); 

if ($rand) {
    header(&quot;Expires: Sun, 1 Jan 2000 12:00:00 GMT&quot;);
    header(&quot;Last-Modified: &quot; . gmdate(&quot;D, d M Y H:i:s&quot;) . &quot;GMT&quot;);
    header(&quot;Cache-Control: no-store, no-cache, must-revalidate&quot;);
    header(&quot;Cache-Control: post-check=0, pre-check=0&quot;, false);
    header(&quot;Pragma: no-cache&quot;);
    header('Content-type: image/jpeg'); 

    $image = imagecreate(55, 15);
    $bgColor = imagecolorallocate($image, 255, 255, 255);
    $textColor = imagecolorallocate($image, 0, 0, 0);
    imagestring($image, 5, 5, 0, $rand, $textColor);
    imagejpeg($image);
    imagedestroy($image);
}
</pre>
<p>называем его, например &#8211; security_img.php, сохраняем.</p>
<p>Далее в коде формы пишем:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;img src=&quot;security_img.php&quot; alt=&quot;Security code&quot;&amp;gt;
&amp;lt;input id=&quot;security_code&quot; name=&quot;security_code&quot; type=&quot;text&quot; value=&quot;&quot; /&amp;gt;
</pre>
<p>А проверять введенные данные на соответствие будем следующим образом:</p>
<pre class="brush: php; title: ; notranslate">
if($_SESSION['captcha'] == md5($_POST['security_code']) ) {
    echo &quot;Вы человек!&quot;;
}  else {
    echo &quot;ТЫ РОБОТ-СПАМЕР =)!&quot;;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/captcha-in-php.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Отправка почты средствами PHP</title>
		<link>http://mihalytch.org.ua/programming/php/sending-e_mails.html</link>
		<comments>http://mihalytch.org.ua/programming/php/sending-e_mails.html#comments</comments>
		<pubDate>Fri, 04 Jul 2008 14:07:43 +0000</pubDate>
		<dc:creator>mihal</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mail]]></category>

		<guid isPermaLink="false">http://mihalytch.org.ua/programming/php/sending-e_mails.html</guid>
		<description><![CDATA[Для отправки почты существует множество уже написанных функций и библиотек&#8230; Самый простой способ &#8211; это отправка почты с помощью функции: [...]]]></description>
			<content:encoded><![CDATA[<p>Для отправки почты существует множество уже написанных функций и библиотек&#8230;</p>
<p>Самый простой способ &#8211; это отправка почты с помощью функции:</p>
<pre class="brush: php; title: ; notranslate">bool mail (string $to, string $subject, string $message
                   [, string $additional_headers[, string $additional_parameters ]])</pre>
<p><span id="more-37"></span></p>
<p>По мнению автора более надежный способ отправки почты средствами PHP &#8211; это отправка письма через SMTP с помощью сокетов.</p>
<p>Ниже приведен код класса для отправки писем через SMTP:</p>
<pre class="brush: php; title: ; notranslate">
class SendMail {
	private $smtp_username = &quot;&quot;; // имя пользователя
	private $smtp_port     = &quot;&quot;; // порт для отправки почты
	private $smtp_host     = &quot;&quot;; // почтовый smtp-сервер
	private $smtp_password = &quot;&quot;; // пароль
	private $smtp_debug    = &quot;&quot;; // true - включен вывод ошибок
	                                      // false - выключен вывод ошибок
	private $smtp_charset  = &quot;&quot;; // кодировка тела письма
	private $smtp_from     = &quot;&quot;; // имя отправителя

	public function send ($mail_to, $subject, $message, $headers='') {

        $mail_body = &quot;Date: &quot;.date(&quot;D, d M Y H:i:s&quot;) . &quot; UT\r\n&quot;;
        $mail_body .= 'Subject: =?'.$this-&amp;gt;smtp_charset.'?B?'.base64_encode($subject).&quot;=?=\r\n&quot;;

        if ($headers) {
            $mail_body .= $headers.&quot;\r\n\r\n&quot;;
        } else {
            $mail_body .= &quot;Reply-To: &quot;.$this-&amp;gt;smtp_username.&quot;\r\n&quot;;
            $mail_body .= &quot;MIME-Version: 1.0\r\n&quot;;
            $mail_body .= &quot;Content-Type: text/plain; charset=\&quot;&quot;.$this-&amp;gt;smtp_charset.&quot;\&quot;\r\n&quot;;
            $mail_body .= &quot;Content-Transfer-Encoding: 8bit\r\n&quot;;
            $mail_body .= &quot;From: \&quot;&quot;.$this-&amp;gt;smtp_from.&quot;\&quot; &amp;lt;&quot;.$this-&amp;gt;smtp_username.&quot;&amp;gt;\r\n&quot;;
            $mail_body .= &quot;To: $mail_to &amp;lt;$mail_to&amp;gt;\r\n&quot;;
            $mail_body .= &quot;X-Priority: 3\r\n\r\n&quot;;
        }

        $mail_body .=  $message.&quot;\r\n&quot;;

        if( !$socket = fsockopen($this-&amp;gt;smtp_host, $this-&amp;gt;smtp_port, $errno, $errstr, 30) ) {
            if ($this-&amp;gt;smtp_debug) echo $errno.&quot;&amp;lt;br&amp;gt;&quot;.$errstr;
            return false;
        }

        if (!$this-&amp;gt;server_parse($socket, &quot;220&quot;, __LINE__)) return false;

        fputs($socket, &quot;EHLO &quot; . $this-&amp;gt;smtp_host . &quot;\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;250&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'I can not send HELO!';
            fclose($socket);
            return false;
        }

        fputs($socket, &quot;AUTH LOGIN\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;334&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'I can not find an answer to request authorization.';
            fclose($socket);
            return false;
        }

        fputs($socket, base64_encode($this-&amp;gt;smtp_username) . &quot;\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;334&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'Login authentication server has not been adopted!';
            fclose($socket);
            return false;
        }

        fputs($socket, base64_encode($this-&amp;gt;smtp_password) . &quot;\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;235&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'Password was not adopted as a server right! Error authorise!';
            fclose($socket);
            return false;
        }

        fputs($socket, &quot;MAIL FROM: &amp;lt;&quot;.$this-&amp;gt;smtp_username.&quot;&amp;gt;\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;250&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'I can not send a command MAIL FROM: ';
            fclose($socket);
            return false;
        }
        fputs($socket, &quot;RCPT TO: &amp;lt;&quot; . $mail_to . &quot;&amp;gt;\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;250&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'I can not send a command RCPT TO: ';
            fclose($socket);
            return false;
        }

        fputs($socket, &quot;DATA\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;354&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'I can not send a command DATA';
            fclose($socket);
            return false;
        }

        fputs($socket, $mail_body.&quot;\r\n.\r\n&quot;);

        if (!$this-&amp;gt;server_parse($socket, &quot;250&quot;, __LINE__)) {
            if ($this-&amp;gt;smtp_debug) echo 'No body was able to send letters. Letter was not sent!';
            fclose($socket);
            return false;
        }

        fputs($socket, &quot;QUIT\r\n&quot;);
        fclose($socket);

        return true;
	}

	private function server_parse($socket, $response, $line = __LINE__) {
        global $config;
    	while (substr($server_response, 3, 1) != ' ') {
	        if (!($server_response = fgets($socket, 256))) {
	               if ($this-&amp;gt;smtp_debug) echo &quot;Problems sending mail! $response$line&quot;;
                   return false;
                }
    	}

	    if (!(substr($server_response, 0, 3) == $response)) {
           if ($this-&amp;gt;smtp_debug) echo &quot;Problems sending mail!$response$line&quot;;
           return false;
        }

    	return true;
	}

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mihalytch.org.ua/programming/php/sending-e_mails.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

