( Read more... )
анти-спам
July 27th, 2007
Honey-pots в виде лишних элементов форм не работают.. уменьшают количество спама, но не фильтруют на 100% =( Проверено на этом блоге.. Все таки CAPTCHA гораздо эффективнее, но прикручивать лень :-/
PHP, foreach и reference
June 21st, 2007
Угадайте с одного раза, что выведет следующий скрипт:rn
rn<?phprn$a = array('a', 'b', 'c');rnforeach ($a as &$e) {};rnforeach ($a as $e) {rn echo ' ' . $e;rn};rn?>rnrnЕсли вы думаете, что "a b c", вынужден вас огорчить, будет - "a b b" =)rnПричину этого можно проследить на следующем примере:rnrn<?phprn$a = array('a', 'b', 'c', 'd', 'e');rnforeach ($a as &$e) {};rnforeach ($a as $e) {rn echo $e;rn print_r($a);rn};rn?>rnКак видите - после первого цикла в переменной $e осталась ссылка на последний элемент массива $a, поэтому во время второго цикла по адресу $e записываются элементы массива $a, а в последнец итерации там остается предпоследний элемент..rnХотел уже на радостях постить баг, но оказалось это богус еще с 5.0.1rnЧтобы избавиться от этой проблемы достаточно сделать unset($e) после первого цикла.
i = ++i + ++i
May 13th, 2007
НавеяноrnrnPHP:rn
<?phprn$i = 5;rn$i = ++$i + ++$i;rnecho $i; // 13rn?>rnrnJS:rnvar i = 5;rni = ++i + ++i;rnalert(i); // 13rnrnMySQL:rnrnmysql> set @i = 5;rnQuery OK, 0 rows affected (0.00 sec)rnrnmysql> select @i := ++@i +++@i;rn+------------------+rn| @i := ++@i +++@i |rn+------------------+rn| 10 |rn+------------------+rn1 row in set (0.00 sec)
предзащита..
May 4th, 2007
не.. ну такого подвоха, как "а почему MySQL вы не сами написали? скачали из интернета что ли?" я не ожидал..
^..^
March 29th, 2007
разодрала туалетную бумагу
играет с фисташками
пытается закопать блюдце с кефиром (в линолиум)
жрет только китикет, со всем остальным играет
царапаетсо..
играет с фисташками
пытается закопать блюдце с кефиром (в линолиум)
жрет только китикет, со всем остальным играет
царапаетсо..
мяу
March 24th, 2007
Объекты vs. Хеши
February 24th, 2007
Кому как больше нра?
или
$Config->load($PTH['configs'] . 'site.ini', 'CNF');
$db = Database::instance(
$CNF['database']['host'],
$CNF['database']['user'],
$CNF['database']['pass'],
$CNF['database']['name'],
'0111'
);
или
$Config->load($PTH['configs'] . 'site.ini', 'CNF');
$db = Database::instance(
$Config->CNF->database->host,
$Config->CNF->database->user,
$Config->CNF->database->pass,
$Config->CNF->database->name,
'0111'
);
PHP и переменные
February 20th, 2007
Ночью не хочется работать.. хотя надо.. открываю редактор и эксперементирую всякой ерундой..
В начале выдержка из мануала:
1. Переменная транслируется сама в себя..:
Для начала, что-нибудь простое..
2. Переменная c именем - цифрой:
В мануале сказано, что имя переменной должно начинаться с буквы? Вам наврали =)
3. Переменная без имени =)
Ну, и гвоздь нашей программы - переменная без имени:
или так:
Не верьте мануалам ;)
В начале выдержка из мануала:
Basics
Variables in PHP are represented by a dollar sign followed by the name of the variable. The variable name is case-sensitive.
Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Note: For our purposes here, a letter is a-z, A-Z, and the ASCII characters from 127 through 255 (0x7f-0xff).
1. Переменная транслируется сама в себя..:
Для начала, что-нибудь простое..
<?php
$a = 'a';
echo $$a; // 'a'
echo $$$$a; // 'a'
echo $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$a; // 'a'
?>2. Переменная c именем - цифрой:
В мануале сказано, что имя переменной должно начинаться с буквы? Вам наврали =)
<?php
$a = '1';
$$a = 'one';
echo ${1}; // 'one'
?>3. Переменная без имени =)
Ну, и гвоздь нашей программы - переменная без имени:
<?php
$a = '';
$$a = ':)';
echo $${''}; // ':)'
?>или так:
<?php
$a = null;
$$a = ':)';
echo ${null}; // ':)'
?>Не верьте мануалам ;)
экспромт 2 / скроллинг
February 8th, 2007
Курумизава попросил сделать скользящий контент при выборе пунктов меню.. ушел в общей сложности час.
PS: кстати, ссылки кликабельны, открываются в новом окне тоже
PS: кстати, ссылки кликабельны, открываются в новом окне тоже
js/задачка..
January 12th, 2007
Даны два элемента списка (<LI>), как узнать который из них выше (левее/первее) наиболее простым способом?
Обработка PUT/DELETE и т.п. запросов в PHP
January 9th, 2007
Возьмем модную архитектуру построения веб-сервисов REST и попробуем построить серверную часть на PHP.
И тут сразу же облом - PHP пока что не умеет обрабатывать другие запросы помимо POST и GET, поэтому PUT, DELETE и остальные (о которых я впервые услышал) идут лесом. Этот факт сразу же дал мне повод плюнуть в сторону RESTа и поглядывать на XML-RPC, SOAP и другие способы взаимодействия веб-сервисов, однако потом подумалось "чем мы хуже рельсов", если рельсы могут - то и мы запросто. Открываю любимый зенд и начинаю эксперементировать.
Эксперимент 1. Отправка PUT запроса.
Для начала нужно отправить этот самый PUT запрос. Проблема #1 - не только PHP не умеет принимать PUT, но и браузеры не умеют его отсылать (за исключением всяких вымерших монстров, типа нетскейпа.. и то не уверен), поэтому поставить в форме method="PUT" не получится, она все равно отошлет GET запрос. Но не для того же мы используем REST, чтобы принимать данные из формы простым сабмитом. Поэтому отправляем PUT запрос через XHR, при этом данные посылаем также как и в случае с POST запросом, а метод при этом ставим PUT.
XHR - думаю, понятно, что это XMLHttpRequest объект (или ActiveX компонент в ИЕ).
На принимающей стороне выводим следующие переменные:
при этом наших данных нет, зато $_SERVER['REQUEST_METHOD'] = 'PUT'.. уже кое-что.. но куда подевались данные? Я их честно пытался найти в переменной $_SERVER, однако там содержатся данные только по серверным переменным и полученным заголовкам.
Эксперимент 2. Ищем данные.
В принципе данные оказалось найти несложно, они ведь посылаются в теле запроса, а не в заголовках. Следовательно, нужно открыть входящий поток и оттуда получить данные. Побродив, по php.net нахожу этот входящий поток: php://input называется.
Пробуем:
Получаем что-то вроде: a=1&b=2, что нам и требовалось получить.. теперь используем магическую функцию parse_str и кладем данные в массив $_PUT, а также присоединяем к $_REQUEST. Единственная проблема заключается в том, что массив $_PUT не будет суперглобальным, однако, это уже не такая большая помеха.
В итоге получаем код:
Осталось добавить свитч (или еще как-нибудь) на $_SERVER['REQUEST_METHOD'] и добавить обработку DELETE, HEAD, OPTIONS etc. запросов. Спасибо за внимание.
PS: с терминологией у меня неважно, прошу простить, если допустил ошибки и указать в комментах.. буду исправляться.
И тут сразу же облом - PHP пока что не умеет обрабатывать другие запросы помимо POST и GET, поэтому PUT, DELETE и остальные (о которых я впервые услышал) идут лесом. Этот факт сразу же дал мне повод плюнуть в сторону RESTа и поглядывать на XML-RPC, SOAP и другие способы взаимодействия веб-сервисов, однако потом подумалось "чем мы хуже рельсов", если рельсы могут - то и мы запросто. Открываю любимый зенд и начинаю эксперементировать.
Эксперимент 1. Отправка PUT запроса.
Для начала нужно отправить этот самый PUT запрос. Проблема #1 - не только PHP не умеет принимать PUT, но и браузеры не умеют его отсылать (за исключением всяких вымерших монстров, типа нетскейпа.. и то не уверен), поэтому поставить в форме method="PUT" не получится, она все равно отошлет GET запрос. Но не для того же мы используем REST, чтобы принимать данные из формы простым сабмитом. Поэтому отправляем PUT запрос через XHR, при этом данные посылаем также как и в случае с POST запросом, а метод при этом ставим PUT.
XHR.open('PUT', '/path/to/api', true);
XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
XHR.send(data);
XHR - думаю, понятно, что это XMLHttpRequest объект (или ActiveX компонент в ИЕ).
На принимающей стороне выводим следующие переменные:
print_r($_REQUEST, 1);
print_r($_SERVER, 1);
при этом наших данных нет, зато $_SERVER['REQUEST_METHOD'] = 'PUT'.. уже кое-что.. но куда подевались данные? Я их честно пытался найти в переменной $_SERVER, однако там содержатся данные только по серверным переменным и полученным заголовкам.
Эксперимент 2. Ищем данные.
В принципе данные оказалось найти несложно, они ведь посылаются в теле запроса, а не в заголовках. Следовательно, нужно открыть входящий поток и оттуда получить данные. Побродив, по php.net нахожу этот входящий поток: php://input называется.
Пробуем:
if ($put = fopen('php://input', "r")) {
while (!feof($put)) {
$data = fgets($put, 1024);
}
fclose('php://input');
} else {
echo 'nope';
}
Получаем что-то вроде: a=1&b=2, что нам и требовалось получить.. теперь используем магическую функцию parse_str и кладем данные в массив $_PUT, а также присоединяем к $_REQUEST. Единственная проблема заключается в том, что массив $_PUT не будет суперглобальным, однако, это уже не такая большая помеха.
В итоге получаем код:
$_PUT = array();
if ($put = fopen('php://input', "r")) {
while (!feof($put)) {
$data = fgets($put, 1024);
}
fclose('php://input');
parse_str($data, $_PUT);
$_REQUEST += $_PUT;
}
Осталось добавить свитч (или еще как-нибудь) на $_SERVER['REQUEST_METHOD'] и добавить обработку DELETE, HEAD, OPTIONS etc. запросов. Спасибо за внимание.
PS: с терминологией у меня неважно, прошу простить, если допустил ошибки и указать в комментах.. буду исправляться.
Ищу PHP-разработчиков
January 3rd, 2007
Требуются 2 PHP программиста для участия в оплачиваемом проекте.
Условие работы: в офисе или удаленно - на выбор (но в Ташкенте).
Требование к кандидатам:
- знать следующие слова и словосочетания: intranet, framework, MVC, API, AJAX, DOM, шаблонизатор, кеширование, командная разработка, спиральная модель..
- стойко переносить следующие реплики: "поиграйте со шрифтами", "эту надпись надо сделать кликабельной" и т.д.
Вопрос об оплате решается следующим образом: по результату собеседования выясняется роль в проекте и определяется оплата.
Заинтересованным стучать в ICQ: 244849584, кидать CV на irokez@gmail.com
Условие работы: в офисе или удаленно - на выбор (но в Ташкенте).
Требование к кандидатам:
- знать следующие слова и словосочетания: intranet, framework, MVC, API, AJAX, DOM, шаблонизатор, кеширование, командная разработка, спиральная модель..
- стойко переносить следующие реплики: "поиграйте со шрифтами", "эту надпись надо сделать кликабельной" и т.д.
Вопрос об оплате решается следующим образом: по результату собеседования выясняется роль в проекте и определяется оплата.
Заинтересованным стучать в ICQ: 244849584, кидать CV на irokez@gmail.com


rn
