<?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>Блог о бытие моём &#187; WEB всемогущий</title>
	<atom:link href="http://graber.net.ru/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://graber.net.ru</link>
	<description>заметки интернет-растения</description>
	<lastBuildDate>Mon, 12 Sep 2011 09:49:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Как включить логирование PHP ошибок посредством .htaccess</title>
		<link>http://graber.net.ru/web/kak-vklyuchit-logirovanie-php-oshibok-posredstvom-htaccess/</link>
		<comments>http://graber.net.ru/web/kak-vklyuchit-logirovanie-php-oshibok-posredstvom-htaccess/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 11:02:21 +0000</pubDate>
		<dc:creator>Antonio</dc:creator>
				<category><![CDATA[WEB всемогущий]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://graber.net.ru/?p=224</guid>
		<description><![CDATA[Хочу поделиться простым, но очень эффективным способом логирования ошибок выполнения PHP скриптов, с одновременной блокировкой вывода ошибок PHP пользователям на страницы нашего сайта. Для этого нам потребуется Apache, PHP и htaccess. Совсем немного, правда? Логирование ошибок PHP в отдельный файл имеет ряд преимуществ по сравнения с их выводом на экран. Во первых, при возникновении ошибки [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу поделиться простым, но очень эффективным способом логирования ошибок выполнения PHP скриптов, с одновременной блокировкой вывода ошибок PHP пользователям на страницы нашего сайта. Для этого нам потребуется Apache, PHP и htaccess. Совсем немного, правда?<br />
<span id="more-224"></span><br />
Логирование ошибок PHP в отдельный файл имеет ряд преимуществ по сравнения с их выводом на экран. Во первых,  при возникновении ошибки она не будет показана посетителю сайта. Не знаю как вас, а меня пугают сайты, на которых я вижу ошибки. Во вторых, все ошибки попадают в лог, который вы всегда можете проанализировать, и не ждать багрепортов от посетителей. Лог пустой – все хорошо, в логе появляются записи – значит с вашим кодом что-то не так, и его срочно нужно лечить.  Конечно данную задачу можно решить и через настройки php.ini, но далеко не каждый хостинг дает нам доступ к php.ini. Зато у нас есть спасительный htaccess! Его-то мы и будем крутитиь…</p>
<p><strong>Скрываем ошибки PHP от посетителей сайта</strong><br />
Для начала, давайте избавимся от вывода ошибок на экран, дабы не пугать пользователей. Да и вывод некоторых ошибок может проделать существенную брешь в безопасности вашего сайта. Для этого в свой .htaccess впишем следующие строки:<br />
<code># Supress php errors<br />
php_flag display_startup_errors off<br />
php_flag display_errors off<br />
php_flag html_errors off</code></p>
<p>Все, ошибки больше не отображаются в браузере, но теперь мы вообще не знаем об их существовании!</p>
<p><strong>Включаем логирование ошибок PHP</strong><br />
Итак, мы отключили вывод ошибок в браузер, тем самым спрятав их от глаз пользователей, и теперь хотим залогировать все ошибочные вызовы в наших PHP скриптах. Для этого опять поправим наш .htaccess, и допишем в него следующие записи:<br />
<code># Enable PHP error logging<br />
php_flag  log_errors on<br />
php_value error_log  /var/www/www.domain.com/logs/php_error.log</code></p>
<p>Измените путь к лог файлу в соответствии со своими требованиями, и проверьте права на запись. Возможно, вам придется создать этот файл руками и поставить на него права 755. Тут уж разбирайтесь сами, или поставьте права на файл 777, что крайне нежелательно.</p>
<p>Теперь можете проверить, как все это работает. Создайте PHP скрипт с ошибочным вызовом, выполните его в браузере. Убедитесь, что на экране браузера у вас нет ошибок. А после этого проверьте php_error.log</p>
]]></content:encoded>
			<wfw:commentRss>http://graber.net.ru/web/kak-vklyuchit-logirovanie-php-oshibok-posredstvom-htaccess/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Скругление углов без border-radius и css</title>
		<link>http://graber.net.ru/web/skruglenie-uglov-bez-border-radius-i-css/</link>
		<comments>http://graber.net.ru/web/skruglenie-uglov-bez-border-radius-i-css/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 14:21:14 +0000</pubDate>
		<dc:creator>Antonio</dc:creator>
				<category><![CDATA[WEB всемогущий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://graber.net.ru/?p=160</guid>
		<description><![CDATA[Сколько раз вы делали скругление углов для div блоков? Лично я уже устал бороться с разными браузерами, рисовать скругленные углы для блоков, шаманить с CSS. наверняка и вы намучались с этой задачей. А как хочется делать круглые углы для div-ного блока без картинок, без css и без использования border-radius-ов (которые так упорно игнорирует IE). Думаете [...]]]></description>
			<content:encoded><![CDATA[<p>Сколько раз вы делали скругление углов для div блоков? Лично я уже устал бороться с разными браузерами, рисовать скругленные углы для блоков, шаманить с CSS.  наверняка и вы намучались с этой задачей. А как хочется делать круглые углы для div-ного блока без картинок, без css и без использования border-radius-ов (которые так упорно игнорирует IE). Думаете это нереально? А вот и нет! Решить нашу задачу поможет замечательная библиотека jQuery Corner.<br />
<span id="more-160"></span><br />
Использовать ее ну ОЧЕНЬ ПРОСТО!<br />
Подключаем jQuery плагин:<br />
<code>&lt;<span>script</span><span> type</span>=<span>"text/javascript" </span><span>src</span><span>="</span>jquery.corner.js<span>"</span>&gt;&lt;/<span>script</span>&gt;<br />
&lt;<span>script</span><span> type</span>=<span>"text/javascript"</span>&gt;<br />
$(document).ready(function()<br />
{<br />
$("#block").corner();<br />
});<br />
&lt;/<span>script</span>&gt;</code></p>
<p>ну а в нужном месте вставляем<br />
<code>&lt;div id="#block"&gt;бла-бла-бла&lt;/div&gt;</code><br />
и получаем красивенький блок с круглыми углами.</p>
<p>Просто? Быстро?<br />
Надо сказать, что использование jQuery Corner позволяет делать не только скругление углов, но и массу других вариантов оформления углов блоков.</p>
<p>Скачать jQuery Corner и почитать мануал по нему можно <a href="http://jquery.malsup.com/corner/">тут</a><br />
Идею использования этой библиотеки подчерпнул на сайте <a href="http://nictools.ru">NICTools</a>, за что ему большое спасибо <img src='http://graber.net.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://graber.net.ru/web/skruglenie-uglov-bez-border-radius-i-css/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Выпадающее меню на css (ie6 побежден)</title>
		<link>http://graber.net.ru/web/vypadayushhee-menyu-ie6-pobezhden/</link>
		<comments>http://graber.net.ru/web/vypadayushhee-menyu-ie6-pobezhden/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 12:42:54 +0000</pubDate>
		<dc:creator>Antonio</dc:creator>
				<category><![CDATA[WEB всемогущий]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://graber.net.ru/?p=28</guid>
		<description><![CDATA[Делал себе небольшую админку, и наткнулся на весьма досадную неприятность. Оказалось, что мое выпадающее меню не работает в ie6. Чтож, опять господа из Мелкософта постарались, но мы хитрее Итак. Давайте напишем выпадающее меню, которое работает, я надеюсь, в любом браузере (если где-то не пашет, напишите где). Как ни странно, но чаще всего выпадающее меню делают [...]]]></description>
			<content:encoded><![CDATA[<p>Делал себе небольшую админку, и наткнулся на весьма досадную неприятность. Оказалось, что мое выпадающее меню не работает в ie6. Чтож, опять господа из Мелкософта постарались, но мы хитрее <img src='http://graber.net.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Итак. Давайте напишем выпадающее меню, которое работает, я надеюсь, в любом браузере (если где-то не пашет, напишите где).<br />
<span id="more-28"></span><br />
Как ни странно, но чаще всего выпадающее меню делают списками. Вполне разумно. Но если возникнет желание, можно делать и через дивы и через таблицы. Все зависит от вашей фантазии, но мы будем использовать именно списки, как наиболее распространенный вариант. Это маленькое меню поможет нам разобраться.<br />
<code><br />
&lt;ul id="sample_nav"&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Главная&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Услуги&lt;/a&gt;<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Услуги - 1&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Услуги - 2&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Услуги - 3&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Услуги - 4&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Услуги - 5&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Оплата&lt;/a&gt;<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Способы оплаты&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Cтоимость услуг&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Контакты&lt;/a&gt;<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;О Нас&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href="#"&gt;Контакты&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;/li&gt;<br />
&lt;/ul&gt;<br />
</code><br />
Теперь, когда у нас есть меню, напишем для него красивый стиль.<br />
<code>#sample_nav, #sample_nav ul {<br />
    padding: 0;<br />
    margin: 0;<br />
    list-style: none;<br />
}<br />
#sample_nav a {<br />
    display: block;<br />
    width: 150px;<br />
    text-align: center;<br />
    padding: 15px 0 0 0px;<br />
    color: #FFFFFF;<br />
    text-decoration: none;<br />
    white-space:nowrap;<br />
    height: 36px;<br />
}<br />
#sample_nav li {<br />
    float: left;<br />
    width: 150px;<br />
    height: 51px;<br />
    white-space: nowrap;<br />
}<br />
#sample_nav li:hover,<br />
#sample_nav li.sfhover {<br />
    background: #0583c4;<br />
    width: 150px;<br />
    height: 51px;<br />
    white-space: nowrap;<br />
}<br />
#sample_nav li ul {<br />
    position: absolute;<br />
    width: 180px;<br />
    left: -999em;<br />
    background: #f0f0f0;<br />
    border: 1px solid #0583c4;<br />
border-top: 0px;<br />
    font: 12px Arial, Helvetica, sans-serif;<br />
}<br />
#sample_nav li:hover ul,<br />
#sample_nav li.sfhover ul {<br />
    left: auto;<br />
}<br />
#sample_nav li ul a {<br />
    white-space: normal;<br />
    text-align: left;<br />
    color: #000;<br />
    height: 10px;<br />
    margin: 0;<br />
    padding: 0;<br />
    width: 160px;<br />
}<br />
#sample_nav li ul li {<br />
    width: 160px;<br />
    height: 20px;<br />
    padding-left: 20px;<br />
}<br />
#sample_nav li ul li:hover,<br />
#sample_nav li ul li.sfhover {<br />
    width: 160px;<br />
    height: 20px;<br />
    padding-left: 20px;<br />
    background: #dcdcdc;<br />
}<br />
</code></p>
<p>Обратите внимание, что для реализации “выпадание” меню мы используем не <strong>display:none</strong>, а <strong>left: -999em</strong>, там самым скрывая меню далеко за левым краем экрана.</p>
<p>Чтож, все хорошо и красиво, и даже работает. НО! Не работает в ie6 <img src='http://graber.net.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Эксплорер не обрабатывает псевдо класс <strong>:hover</strong>. Придется схитрить. Посмотрите внимательно, наряду с <strong>li:hover</strong> мы описываем и <strong>li.sfhover</strong>, но для его обработки нам понадобится небольшой яваскрипт.</p>
<p><code>sfHover = function() {<br />
var sfEls = document.getElementById("sample_nav").getElementsByTagName("LI");<br />
for (var i=0; i&lt;sfEls.length; i++) {<br />
sfEls[i].onmouseover=function() {<br />
this.className+=" sfhover";}<br />
sfEls[i].onmouseout=function() {<br />
this.className=this.className.replace(new RegExp(" sfhover\\b"), "");<br />
}}}<br />
if (window.attachEvent) window.attachEvent("onload", sfHover);</code></p>
<p>Что делает этот скрипт? Он подменяет псевдо класс :hover для Интернет Эксплорера следующим способом. При событии mouseOver для элемента li скрипт добавляет ему класс sfhover. При событии mouseOut класс обнуляется.</p>
<p>И вот теперь, соединив все это воедино, мы получаем красивое меню, которое работает (и в ie6 тоже).</p>
<style type="text/css">
#sample_nav_panel {
    background: #0097e0;
    white-space: nowrap;
    font: 14px Trebuchet MS, Arial, Helvetica, sans-serif;
    color: #FFFFFF;
    width: 495px;
    height: 51px;
}
#sample_nav, #sample_nav ul {
    padding: 0;
    margin: 0;
    list-style: none;
}
#sample_nav a {
    display: block;
    width: 150px;
    text-align: center;
    padding: 15px 0 0 0px;
    color: #FFFFFF;
    text-decoration: none;
    white-space:nowrap;
    height: 36px;
}
#sample_nav li {
background: none;
    float: left;
    width: 150px;
    height: 51px;
    white-space: nowrap;
}
#sample_nav li:hover,
#sample_nav li.sfhover {
    background: #0583c4;
    width: 150px;
    height: 47px;
    white-space: nowrap;
}
#sample_nav li ul {
    position: absolute;
    width: 180px;
    left: -999em;
margin-top: -2px;
    background: #f0f0f0;
    border: 1px solid #0583c4;
border-top: 0px;
    font: 12px Arial, Helvetica, sans-serif;
}
#sample_nav li:hover ul,
#sample_nav li.sfhover ul {
    left: auto;
}
#sample_nav li ul a {
    white-space: normal;
    text-align: left;
    color: #000;
    height: 10px;
    margin: 0;
    padding: 0;
    width: 160px;
}
#sample_nav li ul li {
    width: 160px;
    height: 20px;
    padding-left: 20px;
}
#sample_nav li ul li:hover,
#sample_nav li ul li.sfhover {
    width: 160px;
    height: 20px;
    padding-left: 20px;
    background: #dcdcdc;
}
</style>
<div id="sample_nav_panel">
<ul id="sample_nav">
<li><a href="#">Главная</a></li>
<li><a href="#">Услуги</a>
<ul>
<li><a href="#">Услуги &#8212; 1</a></li>
<li><a href="#">Услуги &#8212; 2</a></li>
<li><a href="#">Услуги &#8212; 3</a></li>
<li><a href="#">Услуги &#8212; 4</a></li>
<li><a href="#">Услуги &#8212; 5</a></li>
</ul>
</li>
<li><a href="#">Оплата</a>
<ul>
<li><a href="#">Способы оплаты</a></li>
<li><a href="#">Cтоимость услуг</a></li>
</ul>
</li>
</ul>
</div>
<p><script type="text/javascript">
sfHover = function() {
    var sfEls = document.getElementById("sample_nav").getElementsByTagName("LI");
    for (var i=0; i<sfEls.length; i++) {
            sfEls[i].onmouseover=function() {
                this.className+=" sfhover";
            }
            sfEls[i].onmouseout=function() {
                this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
            }
    }
}
if (window.attachEvent) window.attachEvent("onload", sfHover);
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://graber.net.ru/web/vypadayushhee-menyu-ie6-pobezhden/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RUS2LAT транслитерация текста</title>
		<link>http://graber.net.ru/web/rus2lat-transliteraciya-teksta/</link>
		<comments>http://graber.net.ru/web/rus2lat-transliteraciya-teksta/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 13:43:29 +0000</pubDate>
		<dc:creator>Antonio</dc:creator>
				<category><![CDATA[WEB всемогущий]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://graber.net.ru/?p=19</guid>
		<description><![CDATA[Родной язык хорошо, но не все его понимают. Решил записать себе на FM-трансмитер немного музыки, и обнаружил, что он не умеет отображать на экране русские символы в именах файлов. Немного почесал репу и понял, что нужно транслитить все названия. Делать это руками как-то нет никакого желания (извините, 300+ треков переименовывать руками &#8212; это изврат!). Вот [...]]]></description>
			<content:encoded><![CDATA[<p>Родной язык хорошо, но не все его понимают. Решил записать себе на FM-трансмитер немного музыки, и обнаружил, что он не умеет отображать на экране русские символы в именах файлов. Немного почесал репу и понял, что нужно транслитить все названия. Делать это руками как-то нет никакого желания (извините, 300+ треков переименовывать руками &#8212; это изврат!). Вот и прихшлось написать простенькую функцию. Задача простая, но решил ее задокументировать, вдруг кому потребуется. Вот 2 варианта:<br />
<span id="more-19"></span><br />
<strong>PHP</strong><br />
Вообще скрипт я писал на Perl, но функция показалась мне весьма полезной, и я решил включить ее в свою библиотеку PHP функций.<br />
<code>function Rus2Lat($msg)<br />
{<br />
$iso = array(<br />
"№"=&gt;"#","«"=&gt;"","»"=&gt;"",<br />
"А"=&gt;"A","Б"=&gt;"B","В"=&gt;"V","Г"=&gt;"G","Д"=&gt;"D",<br />
"Е"=&gt;"E","Ё"=&gt;"YO","Ж"=&gt;"ZH",<br />
"З"=&gt;"Z","И"=&gt;"I","Й"=&gt;"J","К"=&gt;"K","Л"=&gt;"L",<br />
"М"=&gt;"M","Н"=&gt;"N","О"=&gt;"O","П"=&gt;"P","Р"=&gt;"R",<br />
"С"=&gt;"S","Т"=&gt;"T","У"=&gt;"U","Ф"=&gt;"F","Х"=&gt;"H",<br />
"Ц"=&gt;"C","Ч"=&gt;"CH","Ш"=&gt;"SH","Щ"=&gt;"SH","Ъ"=&gt;"'",<br />
"Ы"=&gt;"Y","Ь"=&gt;"","Э"=&gt;"E","Ю"=&gt;"YU","Я"=&gt;"YA",<br />
"а"=&gt;"a","б"=&gt;"b","в"=&gt;"v","г"=&gt;"g","д"=&gt;"d",<br />
"е"=&gt;"e","ё"=&gt;"yo","ж"=&gt;"zh",<br />
"з"=&gt;"z","и"=&gt;"i","й"=&gt;"j","к"=&gt;"k","л"=&gt;"l",<br />
"м"=&gt;"m","н"=&gt;"n","о"=&gt;"o","п"=&gt;"p","р"=&gt;"r",<br />
"с"=&gt;"s","т"=&gt;"t","у"=&gt;"u","ф"=&gt;"f","х"=&gt;"h",<br />
"ц"=&gt;"c","ч"=&gt;"ch","ш"=&gt;"sh","щ"=&gt;"sh","ъ"=&gt;"",<br />
"ы"=&gt;"y","ь"=&gt;"","э"=&gt;"e","ю"=&gt;"yu","я"=&gt;"ya"<br />
);<br />
return strtr($msg, $iso);<br />
}</code></p>
<p><strong>Perl</strong><br />
Ну собвственно вот. Знаю, что получилось немного извращенно, но работает <img src='http://graber.net.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<code>sub Rus2Lat<br />
{<br />
my @chars = split('', shift);<br />
my %iso = (<br />
"№"=&gt;"#","«"=&gt;"","»"=&gt;"",<br />
"А"=&gt;"A","Б"=&gt;"B","В"=&gt;"V","Г"=&gt;"G","Д"=&gt;"D",<br />
"Е"=&gt;"E","Ё"=&gt;"YO","Ж"=&gt;"ZH",<br />
"З"=&gt;"Z","И"=&gt;"I","Й"=&gt;"J","К"=&gt;"K","Л"=&gt;"L",<br />
"М"=&gt;"M","Н"=&gt;"N","О"=&gt;"O","П"=&gt;"P","Р"=&gt;"R",<br />
"С"=&gt;"S","Т"=&gt;"T","У"=&gt;"U","Ф"=&gt;"F","Х"=&gt;"H",<br />
"Ц"=&gt;"C","Ч"=&gt;"CH","Ш"=&gt;"SH","Щ"=&gt;"SH","Ъ"=&gt;"'",<br />
"Ы"=&gt;"Y","Ь"=&gt;"","Э"=&gt;"E","Ю"=&gt;"YU","Я"=&gt;"YA",<br />
"а"=&gt;"a","б"=&gt;"b","в"=&gt;"v","г"=&gt;"g","д"=&gt;"d",<br />
"е"=&gt;"e","ё"=&gt;"yo","ж"=&gt;"zh",<br />
"з"=&gt;"z","и"=&gt;"i","й"=&gt;"j","к"=&gt;"k","л"=&gt;"l",<br />
"м"=&gt;"m","н"=&gt;"n","о"=&gt;"o","п"=&gt;"p","р"=&gt;"r",<br />
"с"=&gt;"s","т"=&gt;"t","у"=&gt;"u","ф"=&gt;"f","х"=&gt;"h",<br />
"ц"=&gt;"c","ч"=&gt;"ch","ш"=&gt;"sh","щ"=&gt;"sh","ъ"=&gt;"",<br />
"ы"=&gt;"y","ь"=&gt;"","э"=&gt;"e","ю"=&gt;"yu","я"=&gt;"ya"<br />
);<br />
my $c;<br />
for $c (@chars) { $c = $iso{$c} if(exists($iso{$c})); }<br />
return join('', @chars);<br />
}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://graber.net.ru/web/rus2lat-transliteraciya-teksta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Защита от повторной отсылки данных формы</title>
		<link>http://graber.net.ru/web/zashhita-ot-povtornoj-otsylki-dannyx-formy/</link>
		<comments>http://graber.net.ru/web/zashhita-ot-povtornoj-otsylki-dannyx-formy/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 14:08:54 +0000</pubDate>
		<dc:creator>Antonio</dc:creator>
				<category><![CDATA[WEB всемогущий]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://graber.net.ru/?p=16</guid>
		<description><![CDATA[Сегодня писал небольшую php-шку, и наткнулся на один неприятный момент. Скажем я делаю добавление каких-то данных в базу. Соответственно есть форма, есть submit. Жмем на submit, данные отправляются, и нам пишут, что все ок. Добавились ваши данные. А теперь жмем Ctrl+R или F5 и наши данные благополучно отправляются второй раз. Долго думал как этого избежать… [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня писал небольшую php-шку, и наткнулся на один неприятный момент.</p>
<p>Скажем я делаю добавление каких-то данных в базу. Соответственно есть форма, есть submit. Жмем на submit, данные отправляются, и нам пишут, что все ок. Добавились ваши данные. А теперь жмем Ctrl+R или F5 и наши данные благополучно отправляются второй раз. Долго думал как этого избежать… придумал <img src='http://graber.net.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-16"></span><br />
Для защиты от повторной отправки данных будем использовать сессии.</p>
<p>Собственно вот код:</p>
<blockquote><p>&lt;?</p>
<p>session_start();</p>
<p>if (is_numeric($_SESSION['key']))</p>
<p>{</p>
<p>$s_key = $_SESSION['key'];</p>
<p>if ($_GET['key']!=$s_key)</p>
<p>if ($_POST['key']!=$s_key)</p>
<p>die(&#8216;Данные устарели!!!&#8217;);</p>
<p>}</p>
<p>$key = rand(1000, 9999);</p>
<p>$_SESSION['key'] = $key;</p>
<p>echo preg_replace(&#171;/[\r\n]+/&#187;,&#187;&lt;br&gt;&#187;,print_r($_SESSION,true));</p>
<p>echo &#8216;&lt;br&gt;&lt;br&gt;&lt;a href=&#187;?key=&#8217;.$key.&#8217;&#187;&gt;next&lt;/a&gt;&#8217;;</p>
<p>echo &#8216;&lt;br&gt;&lt;br&gt;&lt;form method=&#187;POST&#187; action=&#187;&#8216;.$_SERVER['PHP_SELF'].&#8217;&#187;&gt;&lt;input type=submit&gt;&lt;input value=&#8217;.$key.&#8217;&gt;&lt;/form&gt;&#8217;;</p>
<p>?&gt;</p></blockquote>
<p>Смысл состоит в том, что каждый раз мы генерируем новый ключ. Сохраняем его в сессии и передаем как параметр (в данном случае неважно каким методом POST или GET). Если значение параметра не совпадает со значением из сессии, значит это повторные данные.</p>
<p>Вуаля!</p>
]]></content:encoded>
			<wfw:commentRss>http://graber.net.ru/web/zashhita-ot-povtornoj-otsylki-dannyx-formy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WordPress для девочек</title>
		<link>http://graber.net.ru/web/wordpress-dlya-devochek/</link>
		<comments>http://graber.net.ru/web/wordpress-dlya-devochek/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 12:27:45 +0000</pubDate>
		<dc:creator>Antonio</dc:creator>
				<category><![CDATA[WEB всемогущий]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://graber.net.ru/?p=8</guid>
		<description><![CDATA[Так уж случилось, что я притягиваю к себе различного рода события. Еду в трамвае – в него ударит молния, обопрусь о дерево – оно с корнем вырвется из земли. Другими словами я все время нахожусь в эпицентре каких-то ярких событий, часто очень забавных. И потом сидя дома на кухне с друзьями часто вспоминаются эти истории, [...]]]></description>
			<content:encoded><![CDATA[<p>Так уж случилось, что я притягиваю к себе различного рода события. Еду в трамвае – в него ударит молния, обопрусь о дерево – оно с корнем вырвется из земли. Другими словами я все время нахожусь в эпицентре каких-то ярких событий, часто очень забавных. И потом сидя дома на кухне с друзьями часто вспоминаются эти истории, а моя горячо любимая супруга все время твердит, что заведет блог, в котором будет документировать все эти события. Вот и решил я ей поспособствовать с установкой блога, и мой выбор пал на WordPress.<br />
<span id="more-8"></span><br />
Для начала я сходил на сайт поддержки русского <a title="WordPress" href="http://mywordpress.ru">WordPress</a> и скачал оттуда <a title="Скачать wordpress" href="http://mywordpress.ru/download/">WordPress 2.8 RUS</a>. С установкой не возникло никаких проблем, тут все просто. А вот дальше ступор. Нужно как-то заинтересовать жену. Благо она человек творческий – направил ее в русло поиска шаблонов, благо их великое множество. Нашла она шаблон, загорелась, и блог начал наполняться. Вот только чего-то ему явно не хватало. Другими словами, для нормальной работы с wordpress потребовалось поправить ряд настроек, и установить некоторое количество жизненно необходимых плагинов.</p>
<p>Должен вам сказать, что на момент установки wordpress я знал про него только то, что он есть. Ну и пару раз попадал на чьи-то блоги в сети. Посему не судите строго…</p>
<p><strong>Настройка:</strong></p>
<p>Первое, куда я полез – это «<strong>Настройки &#8212; Общие настройки</strong>». Там указывается <strong>Заголовок блога</strong>, <strong>Краткое описание</strong>, <strong>Часовой пояс</strong>, <strong>Формат даты</strong> и <strong>времени</strong>. Далее идем в раздел «<strong>Настройки – Постоянные ссылки (ЧПУ)</strong>».</p>
<p>Если оставить все как есть, то ссылки в вашем блоге будут иметь примерно такой вид: <em>graber.net.ru/ ?page_id=1</em>. Если Вас все устраивает, то ничего не меняйте, но я педпочел другой путь. Произвольная структура – вот это наш метод! Ставим галку, и пишем: /%category%/%postname%/ Теперь наша ссылка выглядит так: <em><em>graber.net.ru</em>/uncategorized/hello-world/</em>. Забегая вперед, скажу, что ипользование плагина <strong>RustoLat</strong> существенно облегчит вам жизнь.</p>
<p><strong>Плагины:</strong></p>
<p><strong>WP-PageNavi</strong> – наверное это один из самых популярнейших плагинов для <strong>WordPress</strong>. Нужен он для создания в любом месте шаблона очень удобной постраничной навигации по блогу. Выглядит он как:</p>
<blockquote><p>Страница 1 из 3: 1 2 3 »</p></blockquote>
<p>Собственно посмотрите в нижнюю часть этой страницы, и вы увидите этот плагин в действии. Есть у этого плагина и еще один неоспоримый плюс. Если вы пользуетесь сервисом Сапы, то этот плагин вам просто необходим, т.к. его использование значительно увеличивает количество страниц 2-ого уровня, а значит и ваши доходы с продажи ссылок!</p>
<p><strong>RustoLat</strong> – если вы используете ЧПУ, то без этого плагина вам буде грустно. Служит он для транслитерации русских букв в латинские. Такой вариант более привлекателен для поисковых машин, да и глазу приятнее. Согласитесь, что ссылка вида /test выглядит куда более вразумительно, чем /%D2%E5%F1%F2</p>
<p>После этих нехитрых действий моя жена ловко управлялась с блогом, но все время требовала от меня загрузить какой-нить файл на сервер. Решение нашлось очень быстро.</p>
<p><strong>WP-</strong><strong>FileManager</strong> и <strong>WP-Easer-Uploader</strong> – эти два замечательных плагин позволяют загружать файлы (плагины, темы, картинки и пр.) на сервер из админки, не используя ftp. Естественно ставить оба плагина не нужно, достаточно одного.</p>
<p>Дальше от меня уже не требовалось никаких дополнительных действий. Супруга сама загружает плагины, темы, сама научилась пользоваться админкой, да и вообще капитально подружилась с wordpress-ом. Так что вот вам минимальный набор действий, и «wordpress для девочек» готов!</p>
]]></content:encoded>
			<wfw:commentRss>http://graber.net.ru/web/wordpress-dlya-devochek/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

