<?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>2Coders. Блог 2-х web-разработчиков &#187; PHP</title>
	<atom:link href="http://2coders.ru/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://2coders.ru</link>
	<description>Web - Дизайн, Web - Программирование и SEO</description>
	<lastBuildDate>Sat, 04 Sep 2010 17:31:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Yii, Модуль SRBAC часть 2. Пишем регистрацию.</title>
		<link>http://2coders.ru/yii-modul-srbac-chast-2-pishem-registraciyu/</link>
		<comments>http://2coders.ru/yii-modul-srbac-chast-2-pishem-registraciyu/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 10:49:54 +0000</pubDate>
		<dc:creator>d4rkr00t</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[Srbac]]></category>
		<category><![CDATA[Регистрация]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1081</guid>
		<description><![CDATA[После того как мы подключили и настроили модуль srbac нам необходимо  сделать регистрацию пользователей на нашем сайте. Этим сейчас и  займемся.
Оговорюсь сразу, что для выполнения этого урока  требуется yii версии 1.1.1 и дополнение email.
Почему взята именно эта, а не  стабильная версия 1.1.0, потому что в новой версии появился очень  интересный [...]]]></description>
			<content:encoded><![CDATA[<p>После того как мы подключили и настроили модуль srbac нам необходимо  сделать регистрацию пользователей на нашем сайте. Этим сейчас и  займемся.</p>
<p>Оговорюсь сразу, что для выполнения этого урока  требуется <strong>yii версии 1.1.1</strong> и дополнение <a id="fkl3" title="email" href="http://www.yiiframework.com/extension/email/">email</a>.</p>
<p>Почему взята именно эта, а не  стабильная версия 1.1.0, потому что в новой версии появился очень  интересный виджет &laquo;CActiveForm&raquo; позволяющий проводить валидацию форм на  стороне клиента.<br />
<span id="more-1081"></span><br />
Кстати на счет этого виджета, если кто-то  знает, как заставить его проводить валидацию по правилам, как например:</p>
<pre class="brush: php;">$model-&gt;validate('reg');</pre>
<p>буду очень признателен.</p>
<p>Закончим это лирическое отступление и  перейдем непосредственно к программированию.</p>
<p>Первым делам  устанавливаем дополнение email. Как? На странице документации все  подробно расписано и думаю, это затруднений не вызовет. Правда у данного  модуля есть проблемка с отправлением сообщений на русском языке. Для ее  устранения открываем “protected/extensions/email/Email.php” находим  функцию <strong>mail()</strong> и заменяем <strong>mb_send_mail</strong> на <strong>mail</strong>. И все отлично работает.</p>
<p>У  нас уже есть таблица User и конечно же модель User в папке  “protected/models”.  Вот как выглядит моя таблица User:</p>
<pre class="brush: sql;">
CREATE TABLE IF NOT EXISTS `User` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(100) NOT NULL,
  `username` varchar(100) NOT NULL,
  `password` varchar(32) NOT NULL,
  `createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `activationKey` varchar(32) NOT NULL,
  `status` varchar(1) NOT NULL,
  PRIMARY KEY (`id`)
)
</pre>
<p>На этом приготовления закончены, перейдем непосредственно к модулю  регистрации.</p>
<p>Для этого создадим модуль “User” из консоли <strong>yiic</strong> и в <strong> DefaultController.php</strong> добавим функцию регистрации:</p>
<pre class="brush: php;">
    /*
    * Регистрация
    *
    * @param
    * @return
    */
    public function actionRegistration() {

    }
</pre>
<p>После добавим вспомогательные функции для ajax валидации данных и для  отправки кода активации на почту.</p>
<pre class="brush: php;"> protected function performAjaxValidation($model) {
        if(isset($_POST['ajax']) &amp;&amp; $_POST['ajax']==='user-form') {
            echo CActiveForm::validate($model);
            Yii::app()-&gt;end();
        }
    }

    /*
    * Отправление кода активации
    *
    * @param model $model
    * @return bolean
    */
    protected function activationKey($model) {
        $email = Yii::app()-&gt;email;

        $email-&gt;to = $model-&gt;email;

        $email-&gt;subject = 'Код активации аккаунта для сайта '.Yii::app()-&gt;name;

        $email-&gt;message = 'Код активации аккаунта: &lt;a href=&quot;'.Yii::app()-&gt;homeUrl.'/user/default/activation/key/'.$model-&gt;activationKey.'&quot;&gt;'.$model-&gt;activationKey.'&lt;/a&gt;';

        $email-&gt;send();
    }</pre>
<p>Тут все предельно просто. В первой функции проверяем, откуда пришел  запрос и если он ajax то проводим валидацию данных.</p>
<p>Во второй  функции создаем экземпляр класса email, устанавливаем значения для  необходимых полей и отправляем письмо.</p>
<p>После этого простые  рутинные операции, как при создании любой формы. Добавим действие <strong>captcha:</strong></p>
<pre class="brush: php;">function actions() {
        return array('captcha'=&gt;array(
                        'class'     =&gt;'CCaptchaAction',
                        'maxLength' =&gt; 6,
                        'minLength' =&gt; 3,
                        'foreColor' =&gt; 0x667e9a,
                        'testLimit' =&gt; 2,)
        );
    }</pre>
<p>Для вывода каптчи в форме регистрации и  установим минимальную длинну кода на картинке в «3» символа,  максимальную в «6», колличество попыток ввода до смены кода «2», что бы  пользователь при ошибочном вводе кода видел свою ошибку.</p>
<p>Теперь  создадим форму регистрации, для этого в папке &laquo;protected.modules/User/views/default&raquo; создадим файл “registration.php” и  добавим следующий код:</p>
<pre class="brush: xml;">
&lt;?php
$this-&gt;breadcrumbs=array(
        &quot;Регистрация&quot;,
);
?&gt;

&lt;h1&gt;Регистрация&lt;/h1&gt;

&lt;div class=&quot;form&quot;&gt;
    &lt;?php $form = $this-&gt;beginWidget('CActiveForm', array(
            'id'=&gt;'user-form',
            'enableAjaxValidation'=&gt;true,
    )); ?&gt;

    &lt;p class=&quot;note&quot;&gt;Поля со &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt; обязательны.&lt;/p&gt;

    &lt;?php echo $form-&gt;errorSummary($model); ?&gt;

    &lt;div class=&quot;row&quot;&gt;
        &lt;?php echo $form-&gt;label($model, 'email', array('class' =&gt; 'required')); ?&gt;
        &lt;?php echo $form-&gt;textField($model, 'email')?&gt;
        &lt;?php echo $form-&gt;error($model,'email'); ?&gt;
    &lt;/div&gt;

    &lt;div class=&quot;row&quot;&gt;
        &lt;?php echo $form-&gt;label($model, 'username'); ?&gt;
        &lt;?php echo $form-&gt;textField($model, 'username' )?&gt;
        &lt;?php echo $form-&gt;error($model,'username'); ?&gt;
    &lt;/div&gt;

    &lt;div class=&quot;row&quot;&gt;
        &lt;?php echo $form-&gt;label($model, 'password'); ?&gt;
        &lt;?php echo $form-&gt;passwordField($model, 'password') ?&gt;
        &lt;?php echo $form-&gt;error($model,'password'); ?&gt;
    &lt;/div&gt;

    &lt;div class=&quot;row&quot;&gt;
        &lt;?php echo $form-&gt;label($model, 'password2'); ?&gt;
        &lt;?php echo $form-&gt;passwordField($model, 'password2') ?&gt;
        &lt;?php echo $form-&gt;error($model,'password2'); ?&gt;
    &lt;/div&gt;

    &lt;div class=&quot;row&quot;&gt;
        &lt;?php $this-&gt;widget('CCaptcha', array('buttonLabel' =&gt; '&lt;br&gt;[новый код]')); ?&gt;
        &lt;?php echo $form-&gt;label($model, 'captcha'); ?&gt;
        &lt;?=CHtml::activeTextField($model,'captcha'); ?&gt;
    &lt;/div&gt;

    &lt;div class=&quot;row submit&quot;&gt;
        &lt;?=CHtml::submitButton('Зарегистрироваться', array('id' =&gt; &quot;submit&quot;)); ?&gt;
    &lt;/div&gt;

    &lt;?php $this-&gt;endWidget(); ?&gt;
&lt;/div&gt;&lt;!-- form --&gt;
</pre>
<p>Перейдем к доработке модели User. Добавим два параметра:</p>
<pre class="brush: php;">public $captcha;
public $password2;</pre>
<p>Установим имена для аттрибутов:</p>
<pre class="brush: php;">public function attributeLabels() {
         return array(
             'email'     =&gt; 'E-mail адресс:',
             'username'  =&gt; 'Имя пользователя:',
             'password'  =&gt; 'Пароль:',
             'password2' =&gt; 'Пароль еще раз:',
             'captcha'   =&gt; 'Введите код с картинки:',
         );
     }</pre>
<p>И опишем правила валидации для полей:</p>
<pre class="brush: php;">/*
    * Правила валидации
    *
    * @param
    * @return
    */
    public function rules() {
        return array(
            array('email, username, password, password2, captcha', 'required', 'on'=&gt;'reg'),
            array('password2', 'compare', 'compareAttribute' =&gt; 'password', 'on'=&gt;'reg'),
            array('captcha',  'captcha', 'allowEmpty' =&gt; !extension_loaded('gd'), 'on'=&gt;'reg'),

            array('email, username', 'required', ),
            array('email',    'match',   'pattern'    =&gt; '/^([a-z0-9_\.-]+)@([a-z0-9_\.-]+)\.([a-z\.]{2,6})$/', 'message' =&gt; 'Не верный формат e-mail адреса.'),
            array('username', 'match',   'pattern'    =&gt; '/^[A-Za-z0-9_-А-Яа-я\s,]+$/u','message'  =&gt; 'Логин содержит недопустимые символы.'),

            array('username, email',     'length',  'max' =&gt; '100', 'min' =&gt; '3',),
            array('password, password2', 'length',  'max' =&gt; '40',  'min' =&gt; '5',),
        );
    }</pre>
<p>Расписывать правила валидации не буду, про это и  так много всего написано.</p>
<p>Теперь создадим представление для сообщения об  успешной регистрации. Добавим в «protected.modules/User/views/default»  файл «registratoinOk.php» со следующим содержимым:</p>
<pre class="brush: xml;">&lt;?php
$this-&gt;breadcrumbs=array(
                &quot;Регистрация&quot;,
);
?&gt;

&lt;h1&gt;Регистрация&lt;/h1&gt;

&lt;div id=&quot;content&quot;&gt;
    &lt;h1&gt;Пользователь успешно добавлен!&lt;/h1&gt;
&lt;/div&gt;</pre>
<p>Ну и наконец перейдем непосредственно к коду нашей регистрации:</p>
<pre class="brush: php;">/*
    * Регистрация
    *
    * @param
    * @return
    */
    public function actionRegistration() {
        if (Yii::app()-&gt;user-&gt;isGuest) {

            $user = new User;

            /*
            * Ajax валидация
            */
            $this-&gt;performAjaxValidation($user);

            if(empty($_POST['User'])) {
                /*
                * Если форма не отправленна, то выводим форму
                */
                $this-&gt;render('registration', array('model' =&gt; $user));

            } else {
                /*
                * Форма получена
                */
                $user-&gt;attributes = $_POST['User'];

                /*
                * Валидация данных
                */
                if($user-&gt;validate('reg')) {
                    /*
                    * Если проверка пройдена, проверяем на уникальность имя
                    * пользователя и e-mail
                    */
                    if($user-&gt;model()-&gt;count(&quot;email = :email&quot;,
                        array(':email' =&gt; $user-&gt;email))) {

                        $user-&gt;addError('email', 'E-mail уже занят');
                        $this-&gt;render(&quot;registration&quot;, array('model' =&gt; $user));

                    } else if($user-&gt;model()-&gt;count(&quot;username = :username&quot;,
                        array(':username' =&gt; $user-&gt;username))) {

                        $user-&gt;addError('username', 'Имя пользователя уже занято');
                        $this-&gt;render(&quot;registration&quot;, array('model' =&gt; $user));

                    } else {
                        /*
                        * Если проверки пройдены шифруем пароль, генерируем код
                        * активации аккаунта, а также устанавливаем время регистрации
                        * и роль по умолчанию для пользователя
                        */
                        $user-&gt;password      = md5(md5($user-&gt;password));
                        $user-&gt;activationKey = substr(md5(uniqid(rand(), true)), 0, rand(10, 15));
                        $user-&gt;status        = '0';

                        /*
                        * Проверяем если добавление пользователя прошло успешно
                        * устанавливаем ему права.
                        */
                        if($user-&gt;save()) {
                            $role = new AuthAssignment();
                            $role-&gt;itemname = 'User';
                            $role-&gt;userid   = $user-&gt;id;

                            if($role-&gt;save()) {
                                /*
                                * Если роль успешно добавилась, выводим сообщение
                                * об успешной регистрации и отправляем код активации аккаунта
                                */
                                $this-&gt;render(&quot;registrationOk&quot;);

                                $this-&gt;activationKey($user);

                            } else {
                                throw new CHttpException(403, 'Ошибка добавления в базу данных.');
                            }
                        } else {
                            throw new CHttpException(403, 'Ошибка добавления в базу данных.');
                        }
                    }
                } else {
                    /*
                    * Не прошел валидацию
                    */
                    $this-&gt;render('registration', array('model' =&gt; $user));
                }
            }
        } else {
            /*
            * Если пользователь залогинен редиректим обратно
            */
            $this-&gt;redirect(Yii::app()-&gt;user-&gt;returnUrl);
        }
    }</pre>
<p>Я думаю комментариев в коде достаточно, что бы просто его понять.  Если возникнут вопросы пишите в комментариях.</p>
<p>В  следующем уроке мы будем делать активацию аккаунта.</p>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/yii-modul-srbac-chast-2-pishem-registraciyu/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Регер аккаунтов 100zakladok.ru</title>
		<link>http://2coders.ru/reger-akkauntov-100zakladok-ru/</link>
		<comments>http://2coders.ru/reger-akkauntov-100zakladok-ru/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 08:37:04 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1051</guid>
		<description><![CDATA[Что-то давно мы ничего не писали в блог, пора бы это исправить =) Как вы поняли из названия, этот пост посвящен созданию аккаунтов в сервисе социальных закладок &#8211; 100zakladok.ru. Регистрация будет осуществляться с ручным вводом каптчи. Логин  генерируется случайным образом и после регистрации записывается в файл.


Для начала, нам нужно узнать какие данные отправлются при [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://2coders.ru/wp-content/uploads/2010/01/100z.gif"  rel="lightbox[pics1051]" title="Регер аккаунтов" rel="sexylightbox"><img src="http://2coders.ru/wp-content/uploads/2010/01/100z.gif" alt="Регер аккаунтов" width="120" height="110" class="attachment wp-att-1076 alignleft" /></a>Что-то давно мы ничего не писали в блог, пора бы это исправить =) Как вы поняли из названия, этот пост посвящен созданию аккаунтов в сервисе социальных закладок &#8211; <strong>100zakladok.ru</strong>. Регистрация будет осуществляться с ручным вводом каптчи. Логин  генерируется случайным образом и после регистрации записывается в файл.<br />
<br />
<span id="more-1051"></span><br />
Для начала, нам нужно узнать какие данные отправлются при создании аккаунта. Для этого можно воспользоваться сниффером (LiveHttpHeaders/Tamper Data и др.). </p>
<p>Обязательнные поля:</p>
<p><strong>Логин</strong> (ln)<br />
<strong>Пароль</strong> (lp)<br />
<strong>Повторите пароль</strong> (pass21)<br />
<strong>Контрольное число</strong> (secret)</p>
<p>К моему удивлению поле <strong>email</strong> оказалось необязательным для заполнения. Так же при регистрации будет отправляться значение из скрытого поля (sid). Значение <strong>sid</strong> берется из названия картики для каптчи. Например, 5426454.jpg</p>
<p>Теперь, когда мы разобрализь с отправляемыми данными, можно приступать к написанию <strong>регера аккаунтов</strong>. Сервис 100zakladok.ru ограничивает по времени количество регистраций с одного ip. Для того, чтобы избежать этого, воспользуемся прокси. В качестве источника прокси я буду использовать <a href="http://www.torproject.org/">TOR</a>. </p>
<pre class="brush: php;">
&lt;?php
ignore_user_abort(1);
set_time_limit(0);
//Получаем страницу регистрации
$str = file_get_contents('http://www.100zakladok.ru/register/');
$pattern = '#&lt;img src=&quot;\/secretimage\/(.*)&quot; width=&quot;88&quot; height=&quot;22&quot;&gt;#sU';
//Находим каптчу
if(preg_match_all($pattern, $str, $matches)) {
	//При регистрации так же отправляется значение из скрытого поля
	//Это значение берется из имени картики для каптчи. Например,5426454.jpg
	$sid = str_replace(&quot;.jpg&quot;, &quot;&quot;, $matches[1][0]);
	echo  &quot;&lt;img src='http://www.100zakladok.ru/secretimage/{$matches[1][0]}/&gt;&quot;;
}
?&gt;

&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
	Каптча:  &lt;input type=&quot;text&quot; name=&quot;captcha&quot; /&gt;
	&lt;input type=&quot;submit&quot; value=&quot;Отправить&quot; /&gt;
	&lt;input type=&quot;hidden&quot; value=&quot;&lt;?=$sid?&gt;&quot; name=&quot;hid&quot;/&gt;
&lt;/form&gt;	

&lt;?php
if (isset($_POST['captcha'])) {
	//Генерируем логин и мыло
	$alphabet = &quot;abcdefghijklmnopqrstuvwxyz&quot;;
	$shake1 = substr($alphabet, rand(0, 25), 3);
	$shake2 = substr($alphabet, rand(0, 9), 5);
	$shake3 = substr($alphabet, rand(0, 25), 3);

	$names 		= $shake1.$shake2.$shake3;
	$password 	= &quot;helloqueen&quot;;

	//Массив с данными, для сабмита в форму регистрации
	$postfields = array(&quot;ln&quot; =&gt; $names, &quot;lp&quot; =&gt; $password, &quot;pass21&quot; =&gt; $password, &quot;email&quot; =&gt; &quot;{$names}@gmail.com&quot;,
					 &quot;realname&quot; =&gt; &quot;Tester&quot;, &quot;secret&quot; =&gt; $_POST['captcha'],
					 &quot;sid&quot; =&gt; $_POST['hid'],
					);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, &quot;http://www.100zakladok.ru/register/&quot;);
	curl_setopt($ch, CURLOPT_POST, 1);
	//Используем proxy
	curl_setopt($ch, CURLOPT_PROXY, &quot;127.0.0.1:9050&quot;);
	curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
	curl_setopt($ch, CURLOPT_USERAGENT, &quot;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7&quot;);
	curl_setopt($ch, CURLOPT_REFERER, &quot;http://www.100zakladok.ru/register/&quot;);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$result = curl_exec($ch);
	curl_close($ch);

	//Записываем в файл логин и пароль
	$logfile = 'log.txt';
	if ($handle = fopen($logfile, &quot;a&quot;)) {
		$content = &quot;{$names}:{$password}\r\n&quot;;
		fwrite($handle, $content);
		fclose($handle);
		echo '&lt;p style=&quot;color:green&quot;&gt;Данные записаны в файл log.txt&lt;/p&gt;';
	} else {
		echo &quot;ошибка записи в файл&quot;;
	}
}
?&gt;
</pre>
<p>Вот и всё. Нам остается толоько вводить каптчу. Логин и пароль к аккаунту записываются в файл <strong>log.txt</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/reger-akkauntov-100zakladok-ru/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Пишем спамер Wordpress блогов</title>
		<link>http://2coders.ru/pishem-spamer-wordpress-blogov/</link>
		<comments>http://2coders.ru/pishem-spamer-wordpress-blogov/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 20:07:13 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=1003</guid>
		<description><![CDATA[
Ни для кого не секрет, что спам комментарии в блогах приносят неплохие результаты, особенно если блог dofollow. Есть куча софта и сервисов, готовых проспамить вашу ссылку. Но мы, напишем свое решение. Для работы нам понадобятся PHP и cURL.
Прежде, чем начинать кого-нибудь спамить, нужно разобраться, как работает форма комментариев. Вот так в Wordpress блоге, выглядит обычная [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://2coders.ru/wp-content/uploads/2009/11/ызфь.jpeg"  rel="lightbox[pics1003]" title="Спам" rel="sexylightbox"><img src="http://2coders.ru/wp-content/uploads/2009/11/ызфь.jpeg" alt="Спам" width="122" height="110" class="attachment wp-att-1030 alignleft" /></a><br />
Ни для кого не секрет, что спам комментарии в блогах приносят неплохие результаты, особенно если блог dofollow. Есть куча софта и сервисов, готовых проспамить вашу ссылку. Но мы, напишем свое решение. Для работы нам понадобятся <strong>PHP</strong> и <strong>cURL</strong>.</p>
<p>Прежде, чем начинать кого-нибудь спамить, нужно разобраться, как работает форма комментариев. Вот так в Wordpress блоге, выглядит обычная форма для комментариев:<br />
<span id="more-1003"></span></p>
<pre class="brush: xml;">
&lt;form id=&quot;commentform&quot; method=&quot;post&quot; action=&quot;wp-comments-post.php&quot;&gt;
&lt;p&gt;
&lt;input type=&quot;text&quot; tabindex=&quot;1&quot; size=&quot;45&quot; value=&quot;&quot; id=&quot;author&quot; name=&quot;author&quot;/&gt;
&lt;label for=&quot;author&quot;&gt;Имя (обязательно)&lt;/label&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;input type=&quot;text&quot; tabindex=&quot;2&quot; size=&quot;45&quot; value=&quot;&quot; id=&quot;email&quot; name=&quot;email&quot;/&gt;
&lt;label for=&quot;email&quot;&gt;Почта (не публикуется) (обязательно)&lt;/label&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;input type=&quot;text&quot; tabindex=&quot;3&quot; size=&quot;45&quot; value=&quot;&quot; id=&quot;url&quot; name=&quot;url&quot;/&gt;
&lt;label for=&quot;url&quot;&gt;Сайт&lt;/label&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;
&lt;textarea tabindex=&quot;4&quot; rows=&quot;10&quot; cols=&quot;60&quot; id=&quot;comment&quot; name=&quot;comment&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;input type=&quot;submit&quot; value=&quot;Submit Comment&quot; tabindex=&quot;5&quot; id=&quot;submit&quot; name=&quot;submit&quot;/&gt;
&lt;input type=&quot;hidden&quot; value=&quot;14&quot; name=&quot;comment_post_ID&quot;/&gt;
&lt;/p&gt;
&lt;/form&gt;
&lt;/div&gt;
</pre>
<p>Чтобы оставить комментарий, мы должны заполнить следующие поля поля:</p>
<ul>
<li>Имя (Обязательное поле)</li>
<li>Почта (Обязательное поле)</li>
<li>Сайт</li>
<li>Комментарий (Обязательное поле)</li>
</ul>
<p>Так же при оставление комментария, будет отправлена информация из скрытоко поля:<br />
comment_post_ID &#8211;  Это ID поста, к которому вы оставляете комментарий. Например, ID этого поста &#8211; 1003. Все эти значения мы будем отправлять в нашем скрипте.</p>
<p>Отлично, с формой комментариев разобрались и теперь можем приступать к написанию спам скрипта.</p>
<pre class="brush: php;">
&lt;?php
ignore_user_abort(1);
set_time_limit(0);

$url = &quot;http://site.com/&quot;; //Адрес блога, в котором оставляем коммент
//$postfields - массив с необходимыми данными для постинга
//author 			- Имя автора
//email  			- почтовый ящик
//comment_post_ID 	- ID поста, в блоге
//comment 			- Наш комментарий
//url				- url, который спамим
$postfields = array(&quot;action&quot; =&gt; &quot;submit&quot;, &quot;author&quot; =&gt; &quot;test&quot;, &quot;email&quot; =&gt; &quot;mymail@gmail.com&quot;,
					 &quot;comment_post_ID&quot; =&gt; 14, &quot;comment&quot; =&gt; &quot;Very Interesting post&quot;,
					 &quot;url&quot; =&gt; &quot;http://myspamsite.com'&quot;,
					);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url.&quot;wp-comments-post.php&quot;);
curl_setopt($ch, CURLOPT_POST, 1);
//Расскоментируйте, строку ниже, если хотите использовать proxy
//curl_setopt($ch, CURLOPT_PROXY, &quot;xx.xx.xx.xx:xx&quot;);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_USERAGENT, &quot;User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT&quot;);
curl_setopt($ch, CURLOPT_REFERER, &quot;http://google.com/&quot;);
curl_setopt($ch, CURLOPT_HEADER, 0);
$result = curl_exec($ch);
curl_close($ch);
?&gt;
</pre>
<p>Вот и всё. Конечно же, с помощью этого скрипта много не наспамишь, да и простейшую каптчу он не сможет обойти. Такие вещи лучше делать на компилируемых языках или на python/perl. </p>
<p><strong>Пост написан в образовательных целях. Автор не несет никакой ответственности за использование скрипта.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/pishem-spamer-wordpress-blogov/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Создаем индикатор сложности пароля</title>
		<link>http://2coders.ru/sozdaem-indikator-slozhnosti-parolya/</link>
		<comments>http://2coders.ru/sozdaem-indikator-slozhnosti-parolya/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 12:27:55 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=929</guid>
		<description><![CDATA[
Сегодня,  я покажу как можно сделать индикатор сложности пароля. Всего у нас будет 4 степени сложности пароля: очень слабый, слабый, простой и надежный. Каждой степени сложности будет соответствовать свой цвет. 
Надежным мы будем считать пароль, который будет состоять не меньше, чем из 6-ти символов и в нем будет содержаться минимум 1 цифра, спецсимвол, буква [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://2coders.ru/wp-content/uploads/2009/10/7266386858875d4eaec53b0380808200_medium.jpg"  rel="lightbox[pics929]" title="password" rel="sexylightbox"><img src="http://2coders.ru/wp-content/uploads/2009/10/7266386858875d4eaec53b0380808200_medium.jpg" alt="password" width="200" height="133" class="attachment wp-att-953 alignleft" /></a><br />
Сегодня,  я покажу как можно сделать <strong>индикатор сложности пароля</strong>. Всего у нас будет 4 степени сложности пароля: очень слабый, слабый, простой и надежный. Каждой степени сложности будет соответствовать свой цвет. </p>
<p>Надежным мы будем считать пароль, который будет состоять не меньше, чем из 6-ти символов и в нем будет содержаться минимум 1 цифра, спецсимвол, буква в нижнем регистре и буква в верхнем регистре. Для работы нам понадобятся PHP и <a href="http://jquery.com/">jQuery</a>.</p>
<p><span id="more-929"></span><br />
Создадим 2 файла: <strong>indicator.php</strong> и <strong>checkpass.php</strong>. В файле indicator.php будет текстовое поле для ввода пароля и наш индикатор в виде полоски. С помощью ajax&#8217;a, мы будем отправлять пароль на проверку в файл checkpass.php.</p>
<p>Файл <strong>indicator.php</strong></p>
<pre class="brush: xml;">
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;.::2coders.ru::.&lt;/title&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			#indicator {
			background:#d9d6d6;
			width:200px;
			height:10px;
			margin-top:5px;
			}
		&lt;/style&gt;
		&lt;script src='../js/jquery.js' type='text/javascript'&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot;&gt;
		$(function() {
			$('#password').keyup(function () {
				val = $('#password').val();
				$.ajax({
				type: &quot;POST&quot;,
				url: &quot;checkpass.php&quot;,
				data: &quot;password=&quot;+val,
				success: function(html){
					$(&quot;#indicator&quot;).html(html);
				}
				});
			});
		});
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		Пароль: &lt;input type=&quot;password&quot; name=&quot;password&quot; id=&quot;password&quot;/&gt;
		&lt;div id=&quot;indicator&quot;&gt;&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>В файле <strong>checkpass.php</strong> с помощью регулярных выражений будет производиться проверка, на содержание тех или иных символов в пароле. Степень сложности пароля будет храниться в переменной <strong>$strong</strong>. В зависимости от содержащихся символов, увеличиваем или оставляем неизменным значение переменной <strong>$strong</strong>. Пробел будет считаться недопустимым символом.</p>
<p>Файл <strong>checkpass.php</strong></p>
<pre class="brush: php;">
&lt;?php
$password = $_POST['password'];
//Проверяем, есть ли пробелы в пароле
if(preg_match(&quot;/([\s])/&quot;, $password))
{
    $html = '&lt;div style=&quot;background:#ff0000; width:100%; height:10px;&quot;&gt;&lt;/div&gt;';
	$html .= &quot;Недопустимые символы в пароле&quot;;
}
else
{
	if(strlen($password) &lt; 6)
	{
		$html = '&lt;div style=&quot;background:#ff0000; width:100%; height:10px;&quot;&gt;&lt;/div&gt;';
		$html .= &quot;Пароль должен быть не менее 6 символов&quot;;
	}
	else
	{
		$strong = 0;
		//Проверяем, есть ли в пароле числа
		if(preg_match(&quot;/([0-9]+)/&quot;, $password))
		{
			$strong++;
		}
		//Проверяем, есть ли в пароле буквы в нижнем регистре
		if(preg_match(&quot;/([a-z]+)/&quot;, $password))
		{
			$strong++;
		}
		//Проверяем, есть ли в пароле буквы в верхнем регистре
		if(preg_match(&quot;/([A-Z]+)/&quot;, $password))
		{
			$strong++;
		}
		//Проверяем, есть ли в пароле спецсимволы
		if(preg_match(&quot;/\W/&quot;, $password))
		{
			$strong++;
		}
		//В зависимости от сложности пароля выводим полоски
		if($strong == 1)
		{
			$html = '&lt;div style=&quot;background:#ff0000; width:25%; height:10px;&quot;&gt;&lt;/div&gt;';
			$html .= &quot;Очень слабый&quot;;
		}
		if($strong == 2)
		{
			$html = '&lt;div style=&quot;background:#edc431; width:50%; height:10px;&quot;&gt;&lt;/div&gt;';
			$html .= &quot;Слабый&quot;;
		}
		if($strong == 3)
		{
			$html = '&lt;div style=&quot;background:#edc431; width:50%; height:10px;&quot;&gt;&lt;/div&gt;';
			$html .= &quot;Простой&quot;;
		}
		if($strong == 4)
		{
			$html = '&lt;div style=&quot;background:#2dda2f; width:100%; height:10px;&quot;&gt;&lt;/div&gt;';
			$html .= &quot;Надежный&quot;;
		}
	}
}
echo $html;
?&gt;
</pre>
<p>В готовом виде, при надежном пароле индикатор будет выглядеть вот так:<br />
<a href="http://2coders.ru/wp-content/uploads/2009/10/passind.gif"  rel="lightbox[pics929]" title="Индикатор пароля" rel="sexylightbox"><img src="http://2coders.ru/wp-content/uploads/2009/10/passind.gif" alt="Индикатор пароля" width="215" height="68" class="attachment wp-att-959 " /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/sozdaem-indikator-slozhnosti-parolya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Русско-английский переводчик, с помощью Google AJAX Language API</title>
		<link>http://2coders.ru/russko-anglijskij-perevodchik-s-pomoshhyu-google-ajax-language-api/</link>
		<comments>http://2coders.ru/russko-anglijskij-perevodchik-s-pomoshhyu-google-ajax-language-api/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 11:38:59 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=882</guid>
		<description><![CDATA[
Google предоставляет разработчикам массу возможностей для работы со своими сервисами. Как вы наверное поняли из названия поста, я буду использовать Google AJAX API. Что же это такое и для чего это нужно можно прочитать здесь и здесь. Для работы нам понадобятся: php и jQuery.


Создадим 2 файла index.php и translate.php. В файле index.php у нас будет [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://2coders.ru/wp-content/uploads/2009/09/google_api-2.jpg"  rel="lightbox[pics882]" title="google api" rel="sexylightbox"><img src="http://2coders.ru/wp-content/uploads/2009/09/google_api-2.jpg" alt="google api" width="198" height="145" class="attachment wp-att-891 alignleft" /></a></p>
<p>Google предоставляет разработчикам массу возможностей для работы со своими сервисами. Как вы наверное поняли из названия поста, я буду использовать <strong>Google AJAX API</strong>. Что же это такое и для чего это нужно можно прочитать <a href="http://code.google.com/intl/ru-RU/apis/ajaxlanguage/documentation/">здесь</a> и <a href="http://code.google.com/intl/ru-RU/apis/ajax/">здесь</a>. Для работы нам понадобятся: <strong>php</strong> и <strong>jQuery</strong>.<br />
<br />
<span id="more-882"></span><br />
Создадим 2 файла <strong>index.php</strong> и <strong>translate.php</strong>. В файле index.php у нас будет поле, в которое будет вводиться текст для перевода и область в которой будет отображаться переведенный тест.</p>
<p><strong>index.php</strong></p>
<pre class="brush: xml;">
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Русско-английский переводчик&lt;/title&gt;
		&lt;script src='../js/jquery.js' type='text/javascript'&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
		 $(function() {
			$('#translate').click(function() {
				var text = $('#source').val();
				$.ajax({
					url: 'translate.php',
					type: 'POST',
					data: 'text=' + text,
					success: function(html) {
					$(&quot;#enText&quot;).html(html);
					}
				});
			});
		 });
		&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
		#wrap {
		margin: auto;
		width:700px;
		}
		#ruText {
		float:left;
		}
		#enText {
		margin-left:350px;
		}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
	&lt;div id=&quot;wrap&quot;&gt;
		&lt;div id=&quot;ruText&quot;&gt;
			&lt;textarea id=&quot;source&quot; rows=&quot;5&quot; cols=&quot;39&quot;&gt;&lt;/textarea&gt; &lt;br /&gt;
			&lt;input id=&quot;translate&quot; type=&quot;submit&quot; value=&quot;Перевести&quot; /&gt;
		&lt;/div&gt;
		&lt;div id=&quot;enText&quot;&gt;

		&lt;/div&gt;
	&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Файл <strong>translate.php</strong>. Здесь мы с помощью cURL&#8217;a передаем текст на перевод. После чего, вырезаем переведенный текст и выводим в div с id=&raquo;enText&raquo;.</p>
<p><strong>translate.php</strong></p>
<pre class="brush: php;">
&lt;?php
$text = urlencode($_POST['text']);
$ch = curl_init('http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;q=' . $text . '&amp;langpair=ru%7Cen&amp;callback=foo&amp;context=bar');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, '1');
preg_match('|&quot;translatedText&quot;:&quot;(.*?)&quot;|is', curl_exec($ch), $result);
curl_close($ch);
echo $result['1'];
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/russko-anglijskij-perevodchik-s-pomoshhyu-google-ajax-language-api/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>10 регулярных выражений для web-разработчиков</title>
		<link>http://2coders.ru/10-regulyarnyx-vyrazhenij-dlya-web-razrabotchikov/</link>
		<comments>http://2coders.ru/10-regulyarnyx-vyrazhenij-dlya-web-razrabotchikov/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 08:04:59 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=818</guid>
		<description><![CDATA[
Регулярные выражения, очень полезная штука для разработчиков. С помощью них можно найти одинаковые слова в тексте, проверить введенные данные и еще много полезных вещей. В этом посте я собрал 10 регулярных выражений, которые должны быть под рукой у любого web-разработчика.




Регулярное выражение
Значение


foo
Строка &#171;foo&#187;


^foo
&#171;foo&#187; в начале строки


foo$
&#171;foo&#187; в конце строки


^foo$
В строке содержится только одно слово&#187;foo&#187;


[abc]
a, b, или [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://2coders.ru/wp-content/uploads/2009/08/1247737917_20090716101252.jpg"  rel="lightbox[pics818]" title="regex tools" rel="sexylightbox"><img src="http://2coders.ru/wp-content/uploads/2009/08/1247737917_20090716101252.jpg" alt="regex tools" width="200" height="174" class="attachment wp-att-866 alignleft" /></a><br />
Регулярные выражения, очень полезная штука для разработчиков. С помощью них можно найти одинаковые слова в тексте, проверить введенные данные и еще много полезных вещей. В этом посте я собрал 10 регулярных выражений, которые должны быть под рукой у любого web-разработчика.</p>
<p><span id="more-818"></span></p>
<p></p>
<table border="1" width="100%">
<tr>
<th>Регулярное выражение</th>
<th>Значение</th>
</tr>
<tr>
<td>foo</td>
<td>Строка &laquo;foo&raquo;</td>
</tr>
<tr>
<td>^foo</td>
<td>&laquo;foo&raquo; в начале строки</td>
</tr>
<tr>
<td>foo$</td>
<td>&laquo;foo&raquo; в конце строки</td>
</tr>
<tr>
<td>^foo$</td>
<td>В строке содержится только одно слово&raquo;foo&raquo;</td>
</tr>
<tr>
<td>[abc]</td>
<td>a, b, или c</td>
</tr>
<tr>
<td>[a-z]</td>
<td>Все буквы в нижнем регистре</td>
</tr>
<tr>
<td>[^A-Z]</td>
<td>Любой символ, который не является буквой в верхнем регистре</td>
</tr>
<tr>
<td>[0-9.-]</td>
<td>Любая цифра, точка или дефис</td>
</tr>
<tr>
<td>^[a-zA-Z0-9_]{1,}$</td>
<td>Любое слово содержащее 1 букву, цифру или _</td>
</tr>
</table>
<p></p>
<p><strong>PHP функции для работы с регулярными выражениями</strong></p>
<table border="1" width="100%">
<tr>
<th>Функция</th>
<th>Описание</th>
<tr>
<td>preg_match()</td>
<td>Функция preg_match() ищет в заданном тексте  совпадения с шаблоном, если совпадене есть возвращает true, если нет то false</td>
</tr>
<tr>
<td>preg_match_all()</td>
<td>Функция выполняет поиск шаблона в статье</td>
</tr>
<tr>
<td>preg_replace()</td>
<td>Функция preg_replace() выполняет поиск и замену по регулярному выражению</td>
</tr>
<tr>
<td>preg_split()</td>
<td>Функция preg_split() разбивает строку по регулярному выражению</td>
</tr>
<tr>
<td>preg_grep()</td>
<td>Функция preg_grep() возвращает массив, состоящий из элементов входящего массива , которые соответствуют заданному шаблону</td>
</tr>
<tr>
<td>preg_ quote()</td>
<td>Функция preg_ quote() принимает строку  и добавляет обратный слеш перед каждым служебным символом. Проще говоря, она экранирует символы</td>
</tr>
</table>
<p><strong>Валидация имени домена</strong><br />
Проверяем имя домена.</p>
<pre class="brush: php;">
$url = &quot;http://2coders.ru/&quot;;
if (preg_match('/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/', $url)) {
    echo &quot;Все правильно&quot;;
}
else
{
    echo &quot;Вы ввели неправильное имя домена&quot;;
}
</pre>
<p><strong>Выделение определенного слова в тексте</strong><br />
Это регулярное выражение можно использовать, например, для того чтобы выделить найденые слов при поиске.</p>
<pre class="brush: php;">
$text = &quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque porttitor, odio at feugiat vulputate, neque nulla dignissim ante, ut posuere leo arcu at mauris.&quot;;
$text = preg_replace(&quot;/\b(odio)\b/i&quot;, '&lt;span style=&quot;background:#eef938&quot;&gt;\1&lt;/span&gt;', $text);
echo $text;
</pre>
<p><strong>Удаление повторяющихся слов</strong><br />
Написали пару одинаковых слов? Не проблема, с помощью этого регулярного выражения вы сможете их легко удалить.</p>
<pre class="brush: php;">
$text = preg_replace(&quot;/s(w+s)1/i&quot;, &quot;$1&quot;, $text);
</pre>
<p><strong>Удаление повторяющихся знаков препинания</strong><br />
Почти тоже самое, что и регулярное выражение выше, только будут удаляться знаки препинания.</p>
<pre class="brush: php;">
$text = preg_replace(&quot;/.+/i&quot;, &quot;.&quot;, $text);
</pre>
<p><strong>Автоматическая генерация смайликов</strong><br />
Замена смайликов на картинки.</p>
<pre class="brush: php;">
$text = &quot;Текст со смайликом =)&quot;;
echo str_replace('=)','&lt;img src=&quot;smileys/smile.png&quot;&gt;',$text);
</pre>
<p><strong>Проверка логина</strong><br />
Логин может состоять из букв, цифр, дефисов и подчёркиваний. Длина от 3 до 16 символов.</p>
<pre class="brush: php;">
!preg_match(&quot;/^[a-z0-9_-]{3,16}$/&quot;,$login)
</pre>
<p><strong>Проверка email </strong><br />
Email должен быть такого вида: логин@поддомен.домен.</p>
<pre class="brush: php;">
!preg_match(&quot;/^([a-z0-9_\.-]+)@([a-z0-9_\.-]+)\.([a-z\.]{2,6})$/&quot;,$email)
</pre>
<p><strong>Проверяем шестнадцатиричный цвет</strong><br />
Цвет может быть задан и без &laquo;#&raquo;;</p>
<pre class="brush: php;">
$color = &quot;#555555&quot;;
if (preg_match('/^#?([a-f0-9]{6}|[a-f0-9]{3})$/', $color))
{
echo &quot;Цвет введен правильно&quot;;
}
</pre>
<p><strong>Получаем title страницы</strong><br />
С помощью этого регулярного выражения, можно вытащить title страницы.</p>
<pre class="brush: php;">
$fp = fopen(&quot;http://www.2coders.ru&quot;,&quot;r&quot;);
while (!feof($fp) ){
    $page .= fgets($fp, 4096);
}

$title = eregi(&quot;&lt;title&gt;(.*)&lt;/title&gt;&quot;,$page,$regs);
echo $regs[1];
fclose($fp);
</pre>
<p><strong>Проверка времени</strong><br />
Время должно быть задано в таком виде: mm:hh.</p>
<pre class="brush: php;">
$time = &quot;10:11&quot;;
if (!preg_match('/^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/', $time))
{
	echo &quot;Время введено неправильно&quot;;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/10-regulyarnyx-vyrazhenij-dlya-web-razrabotchikov/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Система оценок на jQuery и PHP</title>
		<link>http://2coders.ru/sistema-ocenok-na-jquery-i-php/</link>
		<comments>http://2coders.ru/sistema-ocenok-na-jquery-i-php/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 10:41:14 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=801</guid>
		<description><![CDATA[Сегодня я покажу, как с помощью jQuery и php можно созадать простенькую систему оценок, как на oboobs.ru. Только оценивать мы будем не сиськи, а статьи. =) Всего у нас будет 2 файла, не считая jQuery. Для начала создадим таблицу articles, где у нас будут храниться статьи и оценки. 
Сразу скажу, данные о проголосовавшем пользователе не [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня я покажу, как с помощью <strong>jQuery</strong> и <strong>php</strong> можно созадать простенькую систему оценок, как на oboobs.ru. Только оценивать мы будем не сиськи, а статьи. =) Всего у нас будет 2 файла, не считая <a href="http://jquery.com/">jQuery</a>. Для начала создадим таблицу <strong>articles</strong>, где у нас будут храниться статьи и оценки. </p>
<p>Сразу скажу, данные о проголосовавшем пользователе не будут никуда записываться, т. е. один человек может голосовать много раз. Для более серьезной <strong>системы оценок</strong> вам понадобится отдельная таблица, в которой будут храниться данные проголосовавшего пользователя. </p>
<p>Таблица <strong>articles</strong>.</p>
<pre class="brush: sql;">
CREATE TABLE `articles` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(100) default NULL,
  `topic` text,
  `rating` int(11) default NULL,
  PRIMARY KEY  (`id`)
)
</pre>
<p>В <strong>title</strong> будет хранится заголовок статьи, в <strong>topic</strong> текст статьи, в <strong>rating</strong> рейтинг статьи.</p>
<p><span id="more-801"></span><br />
Теперь перейдем к скрипту отвечающему за вывод статей и выставление оценок.</p>
<pre class="brush: php;">
&lt;?php
require_once '../config/db.php'; //Подключаемся к БД
?&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;jQuery Rating&lt;/title&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			.article {
				border:1px solid black;
			}
			a {
				text-decoration:none;
			}
			a:hover {
				text-decoration:underline;
			}
			.plus {
				color:red;
				font-size:24px;
			}
			.minus {
				color:blue;
				font-size:24px;
			}
			.rateBar {
				font-size:25px;
				margin-left:25px;
				margin-right:10px;
				margin-top:5px;
				float:left;
			}
			.articles {
				padding-top:20px;
			}
			h2, p {
				margin:0px;
			}
			.clearing {
				clear:both;
			}
		&lt;/style&gt;
		 &lt;script src='../js/jquery.js' type='text/javascript'&gt;&lt;/script&gt;
         &lt;script type=&quot;text/javascript&quot;&gt;
            function setRate(id, operation) {
			$.ajax({
		            type: &quot;POST&quot;,
		            url: &quot;rates.php&quot;,
		            data: &quot;id=&quot; + id + &quot;&amp;operation=&quot; + operation,
		            success: function(html){
		            	$(&quot;#rating&quot; + id).html(html);
		            }
		        });
            }
        &lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
	   &lt;?php
		//Выбираем и выводим записи
		$result = mysql_query(&quot;SELECT
										id, title, topic, rating
								FROM
										articles
							 &quot;);
		while ($row = mysql_fetch_array($result)) {
		?&gt;
		&lt;div class=&quot;rateBar&quot;&gt;
			&lt;div&gt;&lt;a class=&quot;plus&quot; href=&quot;javascript:setRate(&lt;?=$row['id']?&gt;, 'plus')&quot;&gt;+&lt;/a&gt;&lt;/div&gt;
			&lt;div&gt;&lt;span id=&quot;rating&lt;?=$row['id']?&gt;&quot;&gt;&lt;?=$row['rating']?&gt;&lt;/span&gt;&lt;/div&gt;
			&lt;div&gt;&lt;a class=&quot;minus&quot; href=&quot;javascript:setRate(&lt;?=$row['id']?&gt;, 'minus')&quot;&gt;-&lt;/a&gt;&lt;/div&gt;
		&lt;/div&gt;
		&lt;div class=&quot;articles&quot;&gt;
			&lt;h2&gt;&lt;?=$row['title']?&gt;&lt;/h2&gt;
			&lt;p&gt;&lt;?=$row['topic']?&gt;&lt;/p&gt;
		&lt;/div&gt;
		&lt;div class=&quot;clearing&quot;&gt;&lt;/div&gt;
		&lt;?php
    	}
	?&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Разберем подробнее код. Чтобы поставить оценку нам нужно нажать на + или -, после чего id записи и тип операции будут переданы в функцию setRate(). Дальше данные передаются в rates.php (47 строчка), где они обрабатываются.</p>
<p>Файл <strong>rates.php</strong>.</p>
<pre class="brush: php;">
&lt;?php
require_once '../config/db.php'; //Подключаемся к БД
//Данные не фильтруются!
$id 		= $_POST['id']; //Получаем id записи
$operation 	= $_POST['operation']; //Вид операции +/-

$result = mysql_query(&quot;SELECT
								id, topic, rating
					   FROM
								articles
					   WHERE
					   			id = '$id'
						&quot;);
$row = mysql_fetch_array($result);
//Если +, то прибавляем 1, если -, то вычитаем
if ($operation == 'plus')
{
	$newRate = $row['rating'] + 1;
	//Обновляем значение в БД
        $upR = mysql_query(&quot;UPDATE
								articles
						SET
								rating = '$newRate'
						WHERE
								id = '$id'
						&quot;);
	echo $newRate; //Выводим новую оценку
}
else
{
	$newRate = $row['rating'] - 1;
        //Обновляем значение в БД
	$upR = mysql_query(&quot;UPDATE
								articles
						SET
								rating = '$newRate'
						WHERE
								id = '$id'
						&quot;);
	echo $newRate; //Выводим новую оценку
}
?&gt;
</pre>
<p>Я думаю в файле <strong>rates.php</strong> достаточно комментариев, для того, чтобы понять его работу.</p>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/sistema-ocenok-na-jquery-i-php/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Работа с JSON в PHP и jQuery</title>
		<link>http://2coders.ru/rabota-s-json-v-php-i-jquery/</link>
		<comments>http://2coders.ru/rabota-s-json-v-php-i-jquery/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 09:48:22 +0000</pubDate>
		<dc:creator>d4rkr00t</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=715</guid>
		<description><![CDATA[
JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.
Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования. Для многих [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.</p>
<p>Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.
</p></blockquote>
<p>Как-то при разработке одного сайта, мне понадобилось получать ответ от php-скрипта без перезагрузки страницы. Меня не интересовал вывод результата работы, например в див, что реализуется довольно таки просто. По этому мне пришлось искать решение и оно было найдено в использование<strong> json</strong>. Сейчас мы рассмотрим небольшой пример работы с ним.<br />
<span id="more-715"></span><br />
Начнем.</p>
<p>Для начала скачаем библиотеку <a href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js&#038;downloadBtn=">jquery</a>, желательно последней версии.  Теперь создадим файл который будет выводить поле для ввода текста, назовем его <strong>index.php</strong>.  Для примера мы будем шифровать  строку алгоритмом <strong>md5</strong>.  Наш файл:</p>
<pre>
<pre class="brush: xml;">
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
        &lt;title&gt;JSON&lt;/title&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
        &lt;style type=&quot;text/css&quot;&gt;
            #button
            {
               border: 0px;
               background-color: #11cff7;
               height: 22px;
            }
             #button:hover
            {
               background-color: #063b46;
               color: #fff;
            }
        &lt;/style&gt;

        &lt;script type=&quot;javascript&quot;&gt;

        &lt;/script&gt;

    &lt;/head&gt;
    &lt;body&gt;

        &lt;div align=&quot;center&quot; style=&quot;margin-top: 20%&quot;&gt;
        &lt;h2&gt;Шифрование строки:&lt;/h2&gt;

        &lt;input type=&quot;text&quot; name=&quot;md5&quot; id=&quot;md5&quot; size=&quot;50&quot;&gt; &lt;br/&gt;
        &lt;div id=&quot;notice&quot;&gt;&lt;/div&gt; &lt;br/&gt;
        &lt;input type=&quot;button&quot; value=&quot;Пуск&quot; id=&quot;button&quot; onclick=&quot;json()&quot;&gt;

    &lt;/div&gt;

    &lt;/body&gt;
&lt;/html&gt;
</pre>
</pre>
<p>Тут я думаю не должно возникнуть вопросов, мы  добавляем поле для ввода и кнопку для отправки строки на шифрование. Теперь добавим функцию<strong> json()</strong> , которая вызывается при нажатии на кнопку:</p>
<pre>
<pre class="brush: jscript;">
    function json()
    {
        var val; // Переменная для хранения строки

        $('#md5').each(function(){ // Получаем строку для шифрования
            val=this.value
        });

        if(val == '') { //Проверка заполнил ли пользователь поле для ввода текста
            $('#notice').html('Нужно ввести строку!'); // Если нет то выводим предупреждение
        }
        else {
             $('#notice').empty();

             // Отправляем json запрос

        }

    }
</pre>
</pre>
<p>Отправку запроса сделаем чуть позже, а пока добавим php-скрипт, который будет обрабатывать наши данные и возвращать их нашему скрипту. Для этого создадим файл <strong>json.php</strong> и добавим php код, следующего содержания:</p>
<pre>
<pre class="brush: php;">
&lt;?php
// Проверяем пришел ли запрос
if(isset($_REQUEST['md5']))
{
    $md5 = md5($_REQUEST['md5']); //Шифруем строку

    echo json_encode(array('orig' =&gt; $_REQUEST['md5'],'md5' =&gt; $md5)); // И возвращаем
}
?&gt;
</pre>
</pre>
<p>Я думаю по комментариям все понятно, объясню для чего возвращаю ту же строку, что и пришла от скрипта – это делается, что бы показать, как работать с несколькими параметрами.<br />
Осталось дописать отправку и получение <strong>json</strong> запроса:</p>
<pre>
<pre class="brush: jscript;">
$.getJSON('json.php', {v: val}, function(obj){
                 $('#md5').attr('value',obj.orig+'|'+obj.md5);
            });
</pre>
</pre>
<p>Немного опишу принцип его работы <strong>{v:val} </strong>– это то что мы отправляем нашему php-скрипту,  <strong>obj.orig</strong> и <strong>obj.md5</strong> – это то что он нам вернул и мы присваиваем значения нашему текстовому полю. На этом все, ниже приведены полные листинги файлов проекта.</p>
<p><strong>index.php</strong></p>
<pre>
<pre class="brush: xml;">
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
        &lt;title&gt;JSON&lt;/title&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
        &lt;style type=&quot;text/css&quot;&gt;
            #button
            {
               border: 0px;
               background-color: #11cff7;
               height: 22px;
            }
             #button:hover
            {
               background-color: #063b46;
               color: #fff;
            }
        &lt;/style&gt;

        &lt;script type=&quot;text/javascript&quot;&gt;

    function json()
    {
        var val; // Переменная для хранения строки

        $('#md5').each(function(){ // Получаем строку для шифрования
            val=this.value
        });

        if(val == '') { //Проверка заполнил ли пользователь поле для ввода текста
            $('#notice').html('Нужно ввести строку!'); // Если нет то выводим предупреждение
        }
        else {
            $('#notice').empty();

            // Отправляем json запрос

            $.getJSON('json.php', {v: val}, function(obj){
                 $('#md5').attr('value',obj.orig+'|'+obj.md5);
            });

    }

    }

        &lt;/script&gt;

    &lt;/head&gt;
    &lt;body&gt;

        &lt;div align=&quot;center&quot; style=&quot;margin-top: 20%&quot;&gt;
        &lt;h2&gt;Шифрование строки:&lt;/h2&gt;

        &lt;input type=&quot;text&quot; name=&quot;md5&quot; id=&quot;md5&quot; size=&quot;50&quot;&gt; &lt;br/&gt;
        &lt;div id=&quot;notice&quot;&gt;&lt;/div&gt; &lt;br/&gt;
        &lt;input type=&quot;button&quot; value=&quot;Пуск&quot; id=&quot;button&quot; onclick=&quot;json()&quot;&gt;

    &lt;/div&gt;

    &lt;/body&gt;
&lt;/html&gt;
</pre>
</pre>
<p><strong>json.php</strong></p>
<pre>
<pre class="brush: php;">
&lt;?php

// Проверяем пришел ли запрос
if(isset($_REQUEST['v']))
{
    $md5 = md5($_REQUEST['v']); //Шифруем строку

    echo json_encode(array('orig' =&gt; $_REQUEST['v'], 'md5' =&gt; $md5)); // И возвращаем
}

?&gt;
</pre>
</pre>
<p><a href="http://2coders.ru/wp-content/uploads/2009/07/json.rar">Файлы проекта.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/rabota-s-json-v-php-i-jquery/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Добавляем запись в твиттер с помощью PHP</title>
		<link>http://2coders.ru/dobavlyaem-zapis-v-tvitter-s-pomoshhyu-php/</link>
		<comments>http://2coders.ru/dobavlyaem-zapis-v-tvitter-s-pomoshhyu-php/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 15:20:10 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=650</guid>
		<description><![CDATA[
В последнее время твиттер приобрел просто бешеную популярность среди блогеров. Вот и мы с d4rkr00t&#8217;ом не стали отставать и тоже зарегистрировались в этом сервисе. Честно, я не понимаю, что же в твиттере такого уж замечательного. Ну да ладно, решил я написать небольшой скрипт на php для постинга в твиттер. Для работы нам понадобится библиотека CURL, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://2coders.ru/wp-content/uploads/2009/07/twiitter.gif" alt="твиттер" width="200" height="200" class="attachment wp-att-656 alignleft" /><br />
В последнее время <a href="http://twitter.com/">твиттер</a> приобрел просто бешеную популярность среди блогеров. Вот и мы с d4rkr00t&#8217;ом не стали отставать и тоже зарегистрировались в этом сервисе. Честно, я не понимаю, что же в твиттере такого уж замечательного. Ну да ладно, решил я написать небольшой <strong>скрипт на php</strong> для постинга в <strong>твиттер</strong>. Для работы нам понадобится библиотека <strong>CURL</strong>, что это за штука можно прочитать <a href="http://ru2.php.net/curl">здесь</a>.<br />
<br />
Итак, приступим.<br />
<span id="more-650"></span></p>
<pre class="brush: php;">
&lt;?php
$username = 'User';
$password = 'myVeryStrongPass';
//Сообщение, которое нужно написать
$message = &quot;Ё моё, да я же в твиттере&quot;;
//API адрес твиттера
$url = 'http://twitter.com/statuses/update.xml';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, &quot;$url&quot;);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, &quot;status=$message&quot;);
curl_setopt($ch, CURLOPT_USERPWD, &quot;$username:$password&quot;);
$result = curl_exec($ch);
curl_close($ch);
//Проверяем удалось ли запостить запись
if (empty($result))
{
    echo &quot;Сообщение не удалось отправить&quot;;
}
else
{
    echo &quot;Ура, я написал в твиттер&quot;;
}
?&gt;
</pre>
<p>В коде достаточно комментариев, для того, чтобы понять как работает скрипт. Если возникнут вопросы, задавайте их в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/dobavlyaem-zapis-v-tvitter-s-pomoshhyu-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Определение страны по IP на PHP</title>
		<link>http://2coders.ru/opredelenie-strany-po-ip-na-php/</link>
		<comments>http://2coders.ru/opredelenie-strany-po-ip-na-php/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 17:03:12 +0000</pubDate>
		<dc:creator>Max</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Полезные скрипты]]></category>

		<guid isPermaLink="false">http://2coders.ru/?p=515</guid>
		<description><![CDATA[Получать информацию по IP мы будем с этого сайта.

function getCountryByIp($ipAddress)
{
	$ipDetail=array();
	$f = file_get_contents(&#34;http://api.hostip.info/?ip=&#34;.$ipAddress);

	//Получаем название города
	preg_match(&#34;@&#60;Hostip&#62;(\s)*&#60;gml:name&#62;(.*?)&#60;/gml:name&#62;@si&#34;, $f, $city);
	$ipDetail['city'] = $city[2]; 

	//Получаем название страны
	preg_match(&#34;@&#60;countryName&#62;(.*?)&#60;/countryName&#62;@si&#34;, $f, $country);
	$ipDetail['country'] = $country[1];

	//Получаем код страны
	preg_match(&#34;@&#60;countryAbbrev&#62;(.*?)&#60;/countryAbbrev&#62;@si&#34;, $f, $countryCode);
	$ipDetail['countryCode'] = $countryCode[1];

	return $ipDetail;
}

Я думаю код в объяснениях не нуждается. Функция будет возвращать такой массив:

Array ( [city] => cityName [country] => countryName [country_code] => Code )

Теперь посмотрим [...]]]></description>
			<content:encoded><![CDATA[<p>Получать информацию по IP мы будем с этого <a href="http://www.hostip.info">сайта</a>.</p>
<pre class="brush: php;">
function getCountryByIp($ipAddress)
{
	$ipDetail=array();
	$f = file_get_contents(&quot;http://api.hostip.info/?ip=&quot;.$ipAddress);

	//Получаем название города
	preg_match(&quot;@&lt;Hostip&gt;(\s)*&lt;gml:name&gt;(.*?)&lt;/gml:name&gt;@si&quot;, $f, $city);
	$ipDetail['city'] = $city[2]; 

	//Получаем название страны
	preg_match(&quot;@&lt;countryName&gt;(.*?)&lt;/countryName&gt;@si&quot;, $f, $country);
	$ipDetail['country'] = $country[1];

	//Получаем код страны
	preg_match(&quot;@&lt;countryAbbrev&gt;(.*?)&lt;/countryAbbrev&gt;@si&quot;, $f, $countryCode);
	$ipDetail['countryCode'] = $countryCode[1];

	return $ipDetail;
}
</pre>
<p>Я думаю код в объяснениях не нуждается. Функция будет возвращать такой массив:</p>
<blockquote><p>
Array ( [city] => cityName [country] => countryName [country_code] => Code )
</p></blockquote>
<p>Теперь посмотрим работу функции getCountryByIp() в деле.<br />
<span id="more-515"></span></p>
<pre class="brush: php;">
$ipDetail = getCountryByIp('195.114.140.105');
echo &quot;Страна: &quot;.$ipDetail['country'].&quot;&lt;br /&gt;&quot;;
echo &quot;Город: &quot;.$ipDetail['city'].&quot;&lt;br /&gt;&quot;;
echo &quot;Код страны: &quot;.$ipDetail['countryCode'].&quot;&lt;br /&gt;&quot;;
</pre>
<p>По использованному выше будет следующая информация:</p>
<blockquote><p>
Страна: FRANCE<br />
Город: Nice<br />
Код страны: FR
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://2coders.ru/opredelenie-strany-po-ip-na-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
