<?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>PHP программист &#187; Tutorials</title>
	<atom:link href="http://blog.xyz.net.ua/category/tutorials/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xyz.net.ua</link>
	<description>блог программиста</description>
	<lastBuildDate>Fri, 02 Dec 2011 10:45:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Автоматический выбор необходимой пользователю языковой версии сайта на PHP</title>
		<link>http://blog.xyz.net.ua/2011/01/10/php_select_user_language/</link>
		<comments>http://blog.xyz.net.ua/2011/01/10/php_select_user_language/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 17:32:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[рабочие будни]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=133</guid>
		<description><![CDATA[Сегодня появилась задача сделать для сайта, на котором используется интерфейс на двух языках, сделать автоматическое определение системного языка у пользователя. Чтобы пользователю сходу отдавать интерфейс на нужном ему языке. В связи с этим набросал туториал с примером этого функционала. Немного теории. Я выбрал самый простой вариант определения языка у пользователя (есть и сложные), но не [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня появилась задача сделать для сайта, на котором используется интерфейс на двух языках, сделать автоматическое определение системного языка у пользователя. Чтобы пользователю сходу отдавать интерфейс на нужном ему языке.<br />
В связи с этим набросал туториал с примером этого функционала.</p>
<p><span id="more-133"></span></p>
<p><strong>Немного теории.</strong></p>
<p>Я выбрал самый простой вариант определения языка у пользователя (есть и сложные), но не самый надежный (хотя абсолютно надежных вариантов не существует).<br />
У каждого браузера есть поддержка локализаций (это то, на каком языке интерфейс браузера у вас). У FireFox локализация выставляется в меню &laquo;Инструменты-&gt;Дополнения-&gt;Локализации&raquo;, в Opera в меню &laquo;Настройки-&gt;Общие настройки-&gt;Основные-&gt;Язык&raquo;, в остальных ищите сами. Так вот наша задача узнать какой язык выставлен у пользователя, и согласно этому языку отдавать необходимую версию сайта.<br />
У себя я сделал так, что если у пользователя выставлена русская, украинская или белорусская локализация, то отдавать ему русскую версию сайта, в противном случае отдавать английскую. Значение локализации браузера хранится в строке <strong>$_SERVER["HTTP_ACCEPT_LANGUAGE"]</strong>, эту строку мы и будем проверять (учтите, что в этой строке через запятую могут быть указаны разные локализации, нам же важно только самое первое значение &#8212; оно имеет высший приоритет). Но проверять значение этой строки мало, могут быть ситуации, когда пользователю надо другую языковую версию сайта, например, он иностранец, сидящий в русском интернет кафе, и ему нужна англоязычная версия сайта, не смотря на русскую локализацию браузера. Этому пользователю при первой загрузке отдаем версию согласно его локализации, но далее, если он вручную на сайте выберет другую, более приемлемую ему версию сайта, то надо его выбор запомнить, и больше не навязывать ему то, от чего он ушел. Поэтому выбор пользователя мы будем сохранять в куках при помощи <strong>setcookie();</strong> и далее проверять не сохранен ли выбор пользовательских языковых предпочтений в куках, если сохранен, то отдавать ему согласно его предпочтений до тех пор, пока эти предпочтения не поменяются.</p>
<p><strong>А теперь практика.</strong></p>
<p>Если теория ясна, то написать код не составит проблем, но для примера делюсь своим вариантом с комментариями.</p>
<p><code>{code type=PHP}<br />
// действие с проверкой языка и установкой куки языка проводим только на странице index.php<br />
if (strpos($_SERVER["REQUEST_URI"], "/index.php") or (substr($_SERVER["REQUEST_URI"], -1)  == "/")) {</p>
<p>	// если вход произведен без указания языка<br />
	if (!$_GET['lang']) {</p>
<p>		// то проверяем, может язык указан в куках, если нет, то то смотрим локализацию браузера<br />
		if (!$_COOKIE['lang']) {</p>
<p>			$b_lang = explode(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);</p>
<p>			// если локализация русская или украинская или белорусская, то считаем, что пользователю необходимо отдавать русскую версию сайта.<br />
			if (($b_lang[0] == "ru") or ($b_lang[0] == "be") or ($b_lang[0] == "ru-UA")) $lang = "rus";</p>
<p>			// при всех остальных локализациях отдаем английскую версию<br />
			else $lang = "eng";</p>
<p>		}</p>
<p>		// если язык уже указан в куках, то его и используем в системе<br />
		else $lang = $_COOKIE['lang'];<br />
	}</p>
<p>	// если страница запрошена с указанием языка, то этот язык и используем в системе, и запоминаем его в куку<br />
	else {<br />
		$lang = $_GET['lang'];<br />
		setcookie("lang", $lang, time()+30758400, "/");<br />
	}</p>
<p>}<br />
{/code}</code></p>
<p>На выходе в переменной <strong>$lang</strong> получаем рабочее значение языка &#8212; <strong>rus</strong> или <strong>eng</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2011/01/10/php_select_user_language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проверка URL на валидность (preg_match) в PHP</title>
		<link>http://blog.xyz.net.ua/2010/04/15/url_validation_preg_mtch/</link>
		<comments>http://blog.xyz.net.ua/2010/04/15/url_validation_preg_mtch/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 06:46:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[PCRE]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=97</guid>
		<description><![CDATA[Нужен был рег для проверки корректности введенного URL. Для примера был взят один отсюда, но немного дописан. Добавлена возможность принимать урлы с указанием порта, а также разрешено использование в адресе (не домене) символов &#171;()*&#187; (причем это позволено RFC 1738) и кириллицы (да, появилась нужда принимать и обрабатывать такие адреса без предварительного rawurlencode()). {code type=PHP} $file_now [...]]]></description>
			<content:encoded><![CDATA[<p>Нужен был рег для проверки корректности введенного URL. Для примера был взят один <a href="http://htmlweb.ru/php/example/preg.php" target="_blank">отсюда</a>, но немного дописан.<br />
Добавлена возможность принимать урлы с указанием порта, а также разрешено использование в  адресе (не домене) символов &laquo;()*&raquo; (<em>причем это позволено RFC 1738</em>) и кириллицы (да, появилась нужда принимать и обрабатывать такие адреса без предварительного<em> rawurlencode()</em>). </p>
<p><span id="more-97"></span><br />
<code>{code type=PHP}</p>
<p>$file_now = "http://www.domain.net.ua:8080/48649c6575cab899e6841aea6563e72a/down/3878/Abcde(FGH*).avi#dfbdf-dfb";</p>
<p>if (preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".<br />
   "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".<br />
   "org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".<br />
   "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(:[0-9]{1,5})?(?:/[а-яa-z0-9.,_@%\(\)\*&#038;".<br />
   "?+=\~/-]*)?(?:#[^ '\"&#038;<>]*)?$~i", $file_now))<br />
   		 print "Correct!";<br />
else print "Incorrect...";<br />
{/code}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2010/04/15/url_validation_preg_mtch/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Автоматизированное создание сложных HTML-карт (map &amp; area)</title>
		<link>http://blog.xyz.net.ua/2009/09/11/html_map_and_area/</link>
		<comments>http://blog.xyz.net.ua/2009/09/11/html_map_and_area/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 13:30:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Adobe ImageReady]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=52</guid>
		<description><![CDATA[Во время разработки одного из проектов появилась нужда сделать сложную HTML-карту. До этого сталкивался с более простыми, когда у какого-либо изображения надо было выделеть пару-тройку активных областей в виде прямоугольника или круга. Зная размеры изображения прикинуть координаты этих областей можно и на глаз, и потом, если что, то немного подогнать. Но как быть, когда сделать [...]]]></description>
			<content:encoded><![CDATA[<p>Во время разработки одного из проектов появилась нужда сделать сложную HTML-карту. До этого сталкивался с более простыми, когда у какого-либо изображения надо было выделеть пару-тройку активных областей в виде прямоугольника или круга. Зная размеры изображения прикинуть координаты этих областей можно и на глаз, и потом, если что, то немного подогнать.</p>
<p><img class="aligncenter size-full wp-image-53" title="map_example" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/map_example.jpg" alt="map_example" width="309" height="440" /></p>
<p>Но как быть, когда сделать карту надо посложнее, как на картинке выше? Понятное дело, что подобрать координаты границ таких ломанных областей на глаз не получится, и надо какое-нибудь средство, которое бы помогло нам в этом. Таким средством у нас будет <strong>Adobe ImageReady</strong></p>
<p><strong> </strong><span id="more-52"></span></p>
<p>Для начала открываем наше изображение, на котором необходимо сделать активную карту в Adobe ImageReady (я использую версию CS).</p>
<div id="attachment_55" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_1.jpg"><img class="size-medium wp-image-55" title="screen_1" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_1-300x174.jpg" alt="screen_1" width="300" height="174" /></a><p class="wp-caption-text">Рис. 1: Открытый проект с изображением. (кликабельно)</p></div>
<p style="text-align: center;">
<p style="text-align: left;">Выделяем область, которая должна быть активной. В моем случае для этого можно использовать <strong>Magic Wang Tool.</strong></p>
<p style="text-align: left;"><strong> </strong></p>
<div id="attachment_56" class="wp-caption aligncenter" style="width: 310px"><strong><strong><a href="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_2.jpg"><img class="size-medium wp-image-56" title="screen_2" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_2-300x174.jpg" alt="Рис. 2: выделение участка изображения." width="300" height="174" /></a></strong></strong><p class="wp-caption-text">Рис. 2: выделение участка изображения.</p></div>
<p><strong> </strong>После этого в списке слоёв жмем правой кнопкой мыши, и выбираем <strong>Layer via copy</strong>. Таким образом получается новый слой, в котором содержится выделенный участок изображения. На полученном слое тоже жмем правой кнопкой мыши и выбираем опцию <strong>New Layer Based Image Map Area</strong>.<br />
Далее открываем панель для работы с html-картой. Для этого в меню <strong>Window</strong> ставим галочку напротив <strong>Image Map</strong>.</p>
<p style="text-align: left;">
<div id="attachment_57" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_4.jpg"><img class="size-medium wp-image-57" title="screen_4" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_4-300x174.jpg" alt="Рис. 3: включение панели Image Map" width="300" height="174" /></a><p class="wp-caption-text">Рис. 3: включение панели Image Map</p></div>
<p>Там для текущего участка карты устанавливаем параметры URL, Traget, Alt (надеюсь не надо объяснять что это), а так же выбираем <strong>Shape: Polygon</strong> и выбираем уровень качества (больше качества &#8212; больше точности, но на выходе получим больше кода, поэтому смотрите сами).<br />
Таким образом мы имеем одну выделенную область. Далее возвращаемся в слой с картой, и проделываем опять все операции с новой областью.</p>
<p style="text-align: left;">Когда все области выделенны, делаем <strong>File &#8212; Save Optimized As, </strong>и сохраняем оптимизрованный результат.<br />
Если всё сделали правильно, то на выходе мы должны получить папку с картой, и html-документ с размеченной картой.</p>
<p style="text-align: left;">То, что получилось в итоге у меня можно посмотреть тут: <a href="http://tutorials.xyz.net.ua/html_map_and_area/" target="_blank">http://tutorials.xyz.net.ua/html_map_and_area/</a><br />
На практике карту, размеченную в Adobe ImageReady я использовал в верстке макета для <a href="http://getfreunde.de" target="_blank">getfreunde.de</a>, который можно посмотреть тут: <a href="http://portfolio.xyz.net.ua/getfreunde" target="_blank">http://portfolio.xyz.net.ua/getfreunde</a>.</p>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/09/11/html_map_and_area/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel-файл из PHP</title>
		<link>http://blog.xyz.net.ua/2009/05/08/php_to_excel/</link>
		<comments>http://blog.xyz.net.ua/2009/05/08/php_to_excel/#comments</comments>
		<pubDate>Fri, 08 May 2009 06:27:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=36</guid>
		<description><![CDATA[Появилась задача создания простых таблиц excel налету. В принципе, если поискть в сети, то можно найти ряд готовых инструментов для создания *.xls файлов. Делюсь с вами коротким обзором. Spreadsheet_Excel_Writer &#8212; целый пакет для решения подобных задач. Но необходимо наличие PEAR на сервере, а в подавляющем большинстве виртуальных хостингов PEAR не подключен. Конечно, можно собрать все [...]]]></description>
			<content:encoded><![CDATA[<p>Появилась задача создания простых таблиц excel налету.<br />
В принципе, если поискть в сети, то можно найти ряд готовых инструментов для создания *.xls файлов.<br />
Делюсь с вами коротким обзором.</p>
<p><span id="more-36"></span><br />
<a href="http://pear.php.net/package/Spreadsheet_Excel_Writer"  target="_blank">Spreadsheet_Excel_Writer</a> &#8212; целый пакет для решения подобных задач. Но необходимо наличие PEAR на сервере, а в подавляющем большинстве виртуальных хостингов PEAR не подключен. Конечно, можно собрать все файлы пакета в одном месте, поиграться с путями, но в моем случае овчинка не стоит выделки.</p>
<p>Можно генерить xls-файлы используя COM-объекты (пример: <a href="http://www.spravkaweb.ru/php/sovet/excelcom" target="_blank">http://www.spravkaweb.ru/php/sovet/excelcom</a>), но COM &#8212; это это прерогатива windows-серверов, поэтому и этот вариант отпадает.</p>
<p><a href="http://sourceforge.net/projects/psxlsgen/" target="_blank">PHP Simple Excel File Generator</a> &#8212; рабочее название <strong>psxlsgen</strong>. Класс для генерирования excel-файлов. Честно говорю, что не успел попробовать его в работе. Может когда-нибудь придется и его поковырять.</p>
<p>Ну и конечно можно поискать другие классы для решения нашей задачи на <a href="http://www.phpclasses.org/" target="_blank">http://www.phpclasses.org/</a> по ключам <a  target="_blank" href="http://www.google.com/custom?domains=www.phpclasses.org&#038;q=excel+php&#038;sa=Search&#038;sitesearch=www.phpclasses.org&#038;client=pub-2951707118576741&#038;forid=1&#038;channel=5742870948&#038;ie=ISO-8859-1&#038;oe=ISO-8859-1&#038;cof=GALT%3A%23663399%3BGL%3A1%3BDIV%3A%23222222%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3A%23e4e4e8%3BLBGC%3A%23e4e4e8%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BLH%3A50%3BLW%3A256%3BL%3Ahttp%3A%2F%2Ffiles.phpclasses.org%2Fgraphics%2Fgooglesearch.gif%3BS%3Ahttp%3A%2F%2Fwww.phpclasses.org%2Fsearch.html%3BFORID%3A1%3B&#038;hl=en">excel php</a></p>
<p>Но для решения моей задачи не пригодилось ничего из описанного мной выше. Ведь excel запросто понимает html-код. Поэтому мне для создания простого списка элементов в excel достаточно было сгенерировать html-страницу c отправкой соответствующих заголовков.</p>
<p><strong>Пример:</strong></p>
<p><code>{code type=PHP}<br />
header("Content-Type: application/vnd.ms-excel");<br />
header("Content-Disposition: attachment; filename=file.xls");<br />
header("Content-Transfer-Encoding: binary");</p>
<p>print "</p>
<table border=\"1\">
<tr>
<td width=\"200\"><b>Заголовок 1</b></td>
<td><b>Заголовок 1</b></td>
</tr>
<tr>
<td>Элемент 1</td>
<td>Описание 1</td>
</tr>
<tr>
<td>Элемент 2</td>
<td>Описание 2</td>
</tr>
</table>
<p>";<br />
{/code}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/05/08/php_to_excel/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Плавная смена изображений на JavaScript</title>
		<link>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/</link>
		<comments>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/#comments</comments>
		<pubDate>Wed, 06 May 2009 16:30:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[opacity]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=24</guid>
		<description><![CDATA[Как то появилась задача сделать плавную смену изображений в web-странице. Решением задачи решил поделиться с вами. Некоторые используют для этого CSS-свойство filter, но понимает его только Internet Explorer, поэтому пришлось искать реализацию, которая работала бы в разных браузерах. Сначала немного теории. Используя абсолютное позиционирование, набрасываем в разные слои несколько изображений. И только одно из них [...]]]></description>
			<content:encoded><![CDATA[<p>Как то появилась задача сделать плавную смену изображений в web-странице. Решением задачи решил поделиться с вами. Некоторые используют для этого CSS-свойство <strong>filter</strong>, но понимает его только <strong>Internet Explorer</strong>, поэтому пришлось искать реализацию, которая работала бы в разных браузерах.</p>
<p><span id="more-24"></span><br />
<strong>Сначала немного теории. </strong><br />
Используя абсолютное позиционирование, набрасываем в разные слои несколько изображений. И только одно из них должно отображаться сразу, а остальные проявляться со временем.<br />
Чтобы сделать плавную смену одного изображения другим, надо играться со свойствами прозрачности. Любой нормальный браузер понимает CSS3-свойство <a href="http://www.htmlbook.ru/css/opacity.html" target=_blank>opacity</a> (принимает значение от 0 до 1), любой но только не Internet Explorer, для него тоже самое приходится делать при помощи <strong>filter: alpha(opacity)</strong> (принимает значение от 0 до 100).<br />
Мы разобрались с инструментарием для изменения прозрачности, далее надо подумать как сделать смену одного изображения другим. Для этого нам надо через определенный промежуток времени запускать механизм плавного изменения свойств <strong>opacity</strong> и <strong>filter: alpha(opacity)</strong> для одного изображения в сторону уменьшения, для другого же в сторону увеличения. Для этого будет использоваться JavaScript-функция <a href="https://developer.mozilla.org/En/Window.setInterval" target=_blank>setInterval();</a>. Само же плавное изменение уровня прозрачности мы будем делать пошагово пересчитывая значение соответствующих CSS3-свойств, задавая задержку между шагами при помощи JavaScript-функции <a href="https://developer.mozilla.org/en/DOM/window.setTimeout" target=_blank>setTimeout();</a><br />
Процесс работы скрипта будет выглядеть примерно так:<br />
Имеем три изображения, наложенных одно на другое. Но два из них с минимальным значением прозрачности, и таким образом отображается только одно изображение.<br />
Одновременно изменяя в сторону уменьшения значения прозрачности первого изображения мы увеличиваем значение прозрачности второго.<br />
То же самое повторяем с изображением 2 и 3, потом между 3 и 1, и так далее по кругу.<br />
Вот примерно таким образом должно всё происходить. </p>
<p><strong>Ну и наконец сам листинг скрипта: </strong></p>
<blockquote><p>&lt;script language=JavaScript&gt;<br />
var total_pics_num = 3;&nbsp; // колличество изображений<br />
var interval = 4000;&nbsp;&nbsp;&nbsp;&nbsp; // интервал между изображениями<br />
var time_out = 10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // задержка кадров</p>
<p>var i = 0;<br />
var timeout;<br />
var opacity = 100;</p>
<p>function fade_to_next()<br />
&nbsp;{<br />
&nbsp; opacity&#8212;;<br />
&nbsp; var k = i + 1;<br />
&nbsp; var image_now = &#8216;image_&#8217; + i;<br />
&nbsp; if (i == total_pics_num)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp; &nbsp;k = 1;<br />
&nbsp;&nbsp; }<br />
&nbsp; var image_next = &#8216;image_&#8217; + k;<br />
&nbsp; document.getElementById(image_now).style.opacity = opacity/100;<br />
&nbsp; document.getElementById(image_now).style.filter = &#8216;alpha(opacity=&#8217;+ opacity +&#8217;)';<br />
&nbsp; document.getElementById(image_next).style.opacity = (100-opacity)/100;<br />
&nbsp; document.getElementById(image_next).style.filter = &#8216;alpha(opacity=&#8217;+ (100-opacity) +&#8217;)';</P><P><br />
&nbsp; timeout = setTimeout(&laquo;fade_to_next()&raquo;,time_out);<br />
&nbsp; if (opacity==1)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; opacity = 100;<br />
&nbsp;&nbsp;&nbsp; clearTimeout(timeout);<br />
&nbsp;&nbsp; }<br />
&nbsp;}</p>
<p>setInterval(function () {<br />
&nbsp;&nbsp;  i++;<br />
&nbsp;&nbsp;  if (i > total_pics_num) i=1;<br />
&nbsp;&nbsp;  fade_to_next();<br />
&nbsp; },interval);</p>
<p>&lt;/script&gt;</p>
<p>&lt;img src=&#8217;1.jpg&#8217; id=&raquo;image_1&#8243; style=&raquo;position: absolute;&raquo;&gt;<br />
&lt;img src=&#8217;2.jpg&#8217; id=&raquo;image_2&#8243; style=&raquo;opacity: 0; filter: alpha(opacity=0); position: absolute;&raquo;&gt;<br />
&lt;img src=&#8217;3.jpg&#8217; id=&raquo;image_3&#8243; style=&raquo;opacity: 0; filter: alpha(opacity=0); position: absolute;&raquo;&gt;
</p></blockquote>
<p><strong>Как это работает можно посмотреть тут:</strong><br />
<a href="http://tutorials.xyz.net.ua/css_javascript_opacity/" target=_blank>http://tutorials.xyz.net.ua/css_javascript_opacity/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Основы работы с сессиями</title>
		<link>http://blog.xyz.net.ua/2009/05/06/php_sessions/</link>
		<comments>http://blog.xyz.net.ua/2009/05/06/php_sessions/#comments</comments>
		<pubDate>Wed, 06 May 2009 14:08:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=16</guid>
		<description><![CDATA[Эта статья была написанна мной несколько лет назад. Была опубликованна на разных сайтах: http://www.php.com.ua/ru/articles/basic/session_start.htm http://btl-studio.com/o/17/ http://kiev.abcname.net/index.php?o=17 Ну и чтобы добро не пропадало, сделаю кросспост тут. Что такое сессии и для чего они нужны? Давайте представим такую ситуацию: у вас есть некоторое количество страниц, вход на которые вы хотите ограничить паролем. У нас есть форма, в [...]]]></description>
			<content:encoded><![CDATA[<p>Эта статья была написанна мной несколько лет назад.  Была опубликованна на разных сайтах:<br />
<a href="http://www.php.com.ua/ru/articles/basic/session_start.htm" target=_blank>http://www.php.com.ua/ru/articles/basic/session_start.htm</a><br />
<a href="http://btl-studio.com/o/17/" target=_blank>http://btl-studio.com/o/17/</a><br />
<a href="http://kiev.abcname.net/index.php?o=17" target=_blank>http://kiev.abcname.net/index.php?o=17</a><br />
Ну и чтобы добро не пропадало, сделаю кросспост тут.</p>
<p><span id="more-16"></span><br />
<strong>Что такое сессии и для чего они нужны?</strong></p>
<p>Давайте представим такую ситуацию: у вас есть некоторое количество страниц, вход на которые вы хотите ограничить паролем. У нас есть форма, в которой мы вводим логин и пароль, на следующей странице мы проверяем эти данные на «правильность», если логин и пароль верны, то отображаем содержимое страницы.</p>
<p>Всё бы ничего, но «запароленых» страниц у нас несколько, и логин с паролем надо проверять на каждой. Тут возникает необходимость передачи этих данных между страницами. Конечно, можно было бы передавать логин и пароль методом GET (http://www.domain.org/page.php?login=xyz&#038;pass=1123), но по нескольким причинам так делать не стоит (всем виден пароль). А представим себе случай, когда необходимо передать от скрипта скрипту (от страницы к странице) большое количество информации&#8230; И тут возникает мысль: «хорошо было бы иметь возможность передавать нужные нам данные от одного скрипта к другому при просмотре сайта без прямой передачи этих данных от сервера к браузеру и обратно». Таким образом, мы сами подобрались к принципу работы сессий.</p>
<p><strong><br />
Как устроенны сессии ?</strong></p>
<p>Сессии &#8212; это механизм, созданный для временного хранения и передачи информации между скриптами в пределах одного сайта.</p>
<blockquote><p>Сессии предусматривают возможность создания собственных способов обработки информации, поэтому, в принципе, можно использовать сессии и при работе с несколькими сайтами или даже с несколькими серверами. Эти способы нами здесь рассматриваться не будут, так как эти приемы выходят за рамки стандартного программирования на РНР и требуют от программиста глубоких знаний не только РНР, но и знания сетевых протоколов, архитектуры построения серверов и так далее.</p></blockquote>
<p><strong>Сессии с точки зрения программиста</strong><br />
Чтобы запустить механизм сессии в скрипте (создать сессию) необходимо воспользоваться функцией <strong>session_start()</strong>. Эта функция должна стоять в Вашем скрипте до того, как скрипт начнет вывод информации (зачем &#8212; объясним ниже). После создании сессии мы получаем доступ к суперглобальному массиву <strong>$_SESSION</strong>, который обладает полезными свойствами. Так, помещенная в него информация будет доступна нам в любом скрипте в любой функции данного сайта в течении сеанса работы с сайтом. Сеанс прекращается когда пользователь закроет браузер или по прошествии определенного времени, в течении которого пользователь не совершал переходов по сайту. Это время определяется опцией <strong>session.gc_maxlifetime</strong> в файле <strong>php.ini</strong> и определяет время, по прошествии которого файл сессии будет рассматриваться как устаревший.</p>
<p>Существует также массив <strong>$HTTP_SESSION_VARS</strong>, которым можно пользоваться при работе с сессиями. Но этот массив не является суперглобальным, плюс имя его содержит больше букв, а значит нужно потратить больше времени на его написание. В общем, пользоваться этим массивом я не рекомендую.</p>
<p><strong>Более пристальный взгляд на механизм работы сессий</strong><br />
Передача данных от скрипта к скрипту согласно механизму работы сессий состоит из создания файла, записи данных в файл, открытии файла чтении данных и тд. Итак, изначально этот механизм опирается на файлы. Как уже упоминалось, при необходимости, данные сессии можно хранить в базе данных или просто в памяти. Для этого необходимо воспользоваться функцией <strong>session_set_save_handler()</strong> и/или опцией <strong>session.save_handler</strong> в файле <strong>php.ini</strong></p>
<p><strong>Идентификатор сессии.</strong><br />
При старте сессии создается специальный файл, в котором хранятся данные, переданные с помощью сессии. Для идентификации конкретной сессии конкретного пользователя используется так называемый идентификатор сессии. Идентификатор представляет из себя 128 битное число типа 523afa15f4a8e05e95241481c0cbc71e, которое при старте сессий выбирается случайным образом. В итоге, мы имеем файл, в имени которого присутствует уникальный идентификатор равный идентификатору сессии.</p>
<p><strong>Передача идентификатора сессии</strong><br />
Существует два способа передачи идентификатора сессии между сервером и браузером:</p>
<ul>
<li>Куки</li>
<li>Как параметр в URL</li>
</ul>
<p><strong>Использование cookies</strong> – если у пользователи куки включены PHP процессор сам помещает туда переменную со значением идентификатора, и в нужный момент читает ее от туда, причем включены у клиента куки или нет – php определяет самостоятельно.</p>
<blockquote><p><strong>Что такое cookie?</strong><br />
    Cookie это небольшая порция информации, которую сервер передает клиенту. Клиент (броузер) будет хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка. Некоторые cookie хранятся только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, данные записываются в файл.</p></blockquote>
<p><strong>Использование параметров</strong> – этот метод используется PHP если куки отключены. Суть метода в том, что PHP процессор анализирует весь код, предназначенный для отображения в браузере, и производит автозамену всех ссылок таким образом, чтобы идентификатор сессии мог передаться на следующую страницу посредством метода GET или POST.</p>
<p><strong><br />
Примеры автозамены:</strong></p>
<p><strong>Код до обработки php-процессором:</strong><br />
<code>&lt;a href=page.php&gt;link&lt;/a&gt;<br />
</code></p>
<p><strong>Код после обработки php-процессором:</strong><br />
<code>&lt;a href=page.php?PHPSESSID=523afa15f4a8e05e95241481c0cbc71e&gt;link&lt;/a&gt;</code></p>
<p><strong>Код до обработки формы php-процессором:</strong><br />
<code>&lt;form action=page.php&gt;<br />
&lt;/form&gt;</code></p>
<p><strong>Код после обработки формы php-процессором:</strong><br />
<code>&lt;form action=page.php&gt;<br />
&lt;input type="hidden" name="PHPSESSID" value="523afa15f4a8e05e95241481c0cbc71e"&gt;<br />
&lt;/form&gt;<br />
</code></p>
<p><strong>Выводы</strong></p>
<p>Итак, подведем итог сказанному выше. У нас есть данные, которые необходимо использовать на нескольких страницах; для каждого клиента под хранение этих данных выделяется пространство памяти с уникальным идентификатором; PHP передает этот идентификатор от скрипта к скрипту, тем самым, открывая доступ к выделенному для текущего клиента участку памяти. Все эти действия выполняются PHP-процессором автоматически, а от программиста требуется всего лишь дать команду на запуск сессий.<br />
На примере всего этого мы видим, что сессии – это очень удобный и гибкий механизм для идентификации клиентских запросов.</p>
<p><strong>Часто используемые параметры и функции для сессий</strong></p>
<p><strong>session_start(); </strong>- запускает механизм сессий для текущего скрипта.</p>
<blockquote><p>    <strong>Предупреждение:</strong><br />
    Если Вы хотите, чтобы ваш сценарий работал независимо от register_globals, Вам нужно использовать массив <strong>$_SESSION</strong> так как данные которые находятся в этом массиве автоматически регистрируются. Если ваш сценарий использует <strong>session_register()</strong>, он не будет работать в средах где директива PHP <strong>register_globals</strong> выключена.</p></blockquote>
<p><strong><br />
Рекомендуется использовать такую конструкцию для регистрации переменных в сесии</strong><br />
<code>$_SESSION[‘name’]=”Василий”;</code></p>
<p><strong>session_destroy();</strong> &#8212; уничтожаются данные, хранящиеся в сессии, сам файл сессии и его идентификатор.</p>
<p><strong>session_name();</strong> &#8212; эта функция возвращает название переменной, которая используется для хранения идентификатора сессии.</p>
<p><strong>session_id();</strong> &#8212; сам идентификатор сессии.</p>
<p><strong>session.name</strong> – параметр в php.ini устанавливающий имя переменной для хранения идентификатора сессии, по умолчанию значение – PHPSESSID.</p>
<p><strong>session.auto_start</strong> – параметр включающий/выключающий автоматический старт сессий. Если значение этого параметра – <strong>1</strong>, то сессии стартуют автоматически и использовать <strong>session_start()</strong> не надо, если значение параметра – <strong>0</strong>, то сессии не будут стартовать автоматически. По умолчанию значение <strong>0</strong>.</p>
<p><strong>session.use_cookies</strong> – параметр указывающий PHP процессору использовать ли куки для хранения идентификатора или нет. По умолчанию PHP-процессору разрешено использовать cookies для хранения идентификатора сессии, и значение этого параметра равно <strong>1</strong>.</p>
<p>Остальные параметры и функции для работы с сессиями используются сравнительно редко, и поэтому я не стану приводить их описание в этой статье. Но если у вас всё-таки есть желание, то вы всегда можете ознакомиться с ними тут: <a href="http://ua.php.net/manual/ru/ref.session.php" target=_blank>http://ua.php.net/manual/ru/ref.session.php</a></p>
<p><strong>Пример использования сессий</strong></p>
<p>Сейчас я на простейшем примере продемонстрирую как хранятся и передаются данные при помощи механизма сессий.</p>
<p><strong>index.php</strong><br />
<code>&lt;form action=page1.php method=”GET”&gt;<br />
Введите ваше имя &lt;input type=text name=login&gt;<br />
&lt;input type=submit&gt;<br />
&lt;/form&gt;</code></p>
<p><strong>page1.php</strong><br />
<code>&lt;?php // внимание!!! До &lt;?php не должно быть пробелов или пустых строк<br />
session_start();<br />
// включаем поддержку сессий и генерируем случайный<br />
// идентификатор сессии</P><P>$_SESSION[‘login’]=”root”;<br />
// регистрируем переменную $login как переменную сессии.</P><P>print "На предыдущей странице вы ввели имя &lt;b&gt;$_GET[‘login’]&lt;/b&gt;. Ваше имя уже хранится в файле сессии.&lt;br /&gt;<br />
Перейдите по ссылке на следующую страницу&lt;p&gt;</P><P>&lt;a href=”page2.php”&gt;Ссылка на следующую страницу&lt;/a&gt;";<br />
// делаем ссылку для перехода на следующую страницу<br />
// в эту ссылку при помощи механизма автозамены<br />
// будет подставлен идентификатор сессии<br />
?&gt;<br />
</code></p>
<p><strong>page2.php</strong><br />
<code>&lt;?php // внимание!!! До &lt;?php не должно быть пробелов или пустых строк<br />
session_start();<br />
// снова включаем поддержку сессий</P><P>print "Ваше имя, переданное при помощи механизма сессий: &lt;b&gt;$_SESSION[‘login’]&lt;/b&gt;";<br />
// выводим содержимое переменной $login<br />
// которая хранится в файле сессий<br />
?&gt;<br />
</code></p>
<p>На этом я заканчиваю свою статью, и желаю вам успехов в дальнейшем изучении PHP!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/05/06/php_sessions/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

