Home
PHP Developer's Journal [entries|friends|calendar]
PHP Developer

[ website | PHP.NET ]
[ userinfo | livejournal userinfo ]
[ calendar | livejournal calendar ]

Лексический парсер русского языка [12 Jul 2009|12:49pm]

fantaseour
Захотелось написать простой движок для interactive fiction на php. И сразу возник вопрос лексического парсера, в котором я полный профан.

Не подскажите ли где посмотреть на алгоритмы разбора русских предложений?

Типа на входе имеем "Зажечь свечу огнивом", на выходе получаем структуру типа

действие: зажечь
цель: свеча
средство: огниво

Или "поговорить с гоблином об искусстве":

действие: поговорить
цель: гоблин
предмет: искусство
27 comments|post comment

[11 Jul 2009|02:20pm]

david_m
Вопрос к познавшим версию 5.3. Я правильно понимаю, что новый, банановый, сборщик мусора требуется явным образом включать через gc_enable() или ini.zend.enable-gc? Если да, то почему он не включён по умолчанию? Его включение приводит к каким-то заметным накладным расходам?
4 comments|post comment

[10 Jul 2009|10:43pm]

papajka
случилась такая ситуация, возможно простая, но решение мне нужно очень срочно, поэтому обращаюсь к вам в надежде на помощь так как сама в php разбираюсь крайне слабо.

сделала три баннера .swf (по сути один, просто на трех разных языках), и так как "на сайте для каждой языковой версии не предусмотрены разные баннеры" меня попросили "дописать код, чтобы 3 баннера подряд ротировались", каким образом это можно сделать на php?

спасибо заранее
7 comments|post comment

Обсудим достоинства и недостатки TransAjax [10 Jul 2009|10:14pm]

shuchkin
Здесь я опубликовал небольшую, но на мой взгляд исчерпывающую заметку о быстром использовании библиотеки TransAjax. Ваше мнение...
Библитека стабильнее и ...привычнее по использованию нежели интегрированные методы jQuery или Prototype.

1) onclick="ajax('setrating.php?value=' + this.value', 'divResult')"

2)

function get_content( id ) {
  ajax('get_content.php?id=' + id, _get_content);
}
// предполагается, что вернётся JSON
function _get_content( r ) {
  if (r.success)
    alert(r.content);
  else
    alert('ОШИБКА!');
}

3) отправка формы (определяет есть ли файлы, если ДА то см 4)

ajax_submit( 'myFormID', 'divResult');

4) Реализована загрузка файлов через IFRAME

ajax_submit( <id_form>, <callback> );

12 comments|post comment

Освобождение памяти в PHP [10 Jul 2009|05:32pm]

kpobococ_
Вот тут подсмотрел, что, якобы, именно так правильно освобождать память в PHP:

$foo = new stdClass;
$foo = null;
unset($foo);

Что сообщество думает по этому поводу?

Вопрос возник в связи с необходимостью написать на PHP демон и повесить его на прослушивание порта. Какие могут быть рекомендации и литература по этой теме?
28 comments|post comment

Ресайз изображений [10 Jul 2009|01:24pm]

poteshnaya
Когда пользователи заливают на сайт фотографии большого разрешения, скрипту, который их ресайзит, видимо не хватает памяти и он не справляется. Можно ли как-то ресайзить большие фотки (может как-то по частям), чтоб обходить это ограничение стандартных хостингов?
Пользуюсь мастерхостом.

upd. Для мастерхоста решение -
http://masterhost.ru/support/faq/technical/imagemagick/
10 comments|post comment

Хитрая регулярка [10 Jul 2009|09:24am]

djmixar
Добрый день!
Есть строка типа 2;11;3 ,пытаюсь с помощью регулярных выражений проверить есть ли цифра 11 в ней (причем строка может быть и вида 2;3;11), при этом если в регулярку поставить 1 то оно должно возвращать ложь, но что-то неполучается, вот как я пробовал:
([11][^0-9]{1,})*
^([11][^0-9]{1,})*$

Подскажите в чем ошибка? Заранее спасибо!

UPDATE: Спасибо всем за помощь!
41 comments|post comment

Фильтрация вводимых данных (по мотивам предыдущего поста) [09 Jul 2009|11:56pm]

sontar
Несколько простых правил

1. Избавиться от слешей (magic_quotes), используется при каждом запуске

2. Желательно использовать при разработке скрипта и на рабочем хостинге register_globals = off. Никаких extract($_POST) и т.д.

3. Если данные ввёл гость (не администратор) - к ним применяется
а) для целых чисел преобразование типов: $id = (int)$_GET['id'];
б) для строк при вводе не применяется ничего, при выводе применяется htmlspecialchars();
в) если нужно пользователям дать возможность вводить html-код, то применить к вводимым данным XSS-фильтрацию, например так
г) хорошей практикой также является очистка от пробелов функцией trim. Как правило она оправдана всегда кроме случаев текстовых полей с кодом/красной строкой. Вместо неё можно использовать rtrim. Это больше относится к корректности введённых данных чем к безопасности.
д) Всегда старайтесь использовать для сравнения оператор ===, функцию in_array используйте с параметром strict=TRUE. Результат выполнения in_array('abc', array(0,1,2)) иногда может привести к неожиданному результату.

4. Для файлов.
а) Раньше был баг (сейчас не знаю) в функциях move_uploaded_file() и copy(), которые обрубали аргумент до вхождения некоторых символов, например \x00 (null-byte). Т.е. если загружать на сервер файл с именем data.php%00.jpg, функция strrchr() вернёт '.jpg', т.е. разрешённое расширение, но функции move_uploaded_file() и copy() скопируют файл как data.php. Чтобы избежать этого, нужно расширение файлу задавать вручную.
%00 - имеется ввиду null-byte
(Как я понял, суть в целевом имени файла, втором аргументе, т.е. если мы возьмём его равным $_FILES['filename']['name']).
б) недопустимые символы заменить на _
в) для предотвращения запуска php-скриптов нужно положить в каталог с файлами вот такой htaccess
php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp


5. Данные, вводимые админом с помощью WYSIWYG, как правило, не фильтруются от XSS, хотя это дело вкуса.

6. При сохранении в базу данных все целые приводятся к целому типу, все строки экранируются mysql_real_escape_string. В случае mysqli лучше пользоваться prepared statements -- данные пойдут в бинарном формате, без сомнительного слеш-эскейпинга.

7. (дополнительно, к фильтрации не относится)
a) Все критичные действия пользователей (удалить, выйти и т.д.) должны выполняться только post-запросом. Некритичные тоже =)
б) Формы должны сопровождаться рандомно генерируемым ключом. Т.е. при отрисовке формы вставляем input type="hidden" value="(рандомное)", и при получении формы проверяем, присутствует ли этот ключ. Та же форма, отправленная повторно, обработана не будет.
в) никогда не передавать самому себе данные через HIDDEN-поля и явные куки. Только сессии.

Почитать на тему
Почитать про CSRF

Исправляйте и дополняйте.
58 comments|post comment

[09 Jul 2009|03:15pm]

neps
решил тут свою криворучкость переписать всю
начал с вопросов безопасности, хоть это и для внутреннего употребления
начитался разного, и получаю:

///////////////////// для проверки всех форм получаемых гетом ///////////////////////

// чистим стандартно
$_GET = clearall($_GET);
function clearall($array)
{ foreach ($array as $id=>$value)
{ $array[$id] = mysql_real_escape_string($value); }
return $array;
}

// проверяем на наличие только разрешенных символов
function clearstring($array)
{ foreach ($array as $id=>$value)
{ if ($array[$id]!=null){ $array[$id] = preg_match("/^([а-яА-Яa-zA-Z0-9\/\:_.-\s\w]+)$/i", $value); if ($array[$id]==0) {пишемВлог("строка в лог"); print "<х1>ошибка<h1>"; exit;}}}
return $array;
}

clearstring($_GET);

extract($_GET);


////////////////////////////////// для проверки всех форм получаемых постом //////////////////

// проверяем на наличие только разрешенных символов
function clearstringSUB($array)
{ foreach ($array as $key =>$value)
{
$arrornot = is_array($value);

//если постом передали строку
if ($arrornot==0 and $value!=null){ $array = preg_match("/^([а-яА-Яa-zA-Z0-9.,\s]+)$/i", $value); if ($array==0) {пишемВлог("строка в лог"); print "<h1>Ошибка<h1>"; exit;}}

//если постом передали массив
if ($arrornot==1 and $value!=null){

foreach ($value as $key1 => $value1){ if ( $value1!=null){ $array = preg_match("/^([а-яА-Яa-zA-Z0-9.,]+)$/i", $value1); if ($array==0) {пишемВлог("строка в лог"); print "<h1>ошибка<h1>"; exit;}}}}

}

return $array;
}

clearstringSUB($_POST);

extract($_POST);


php5. В вопросах кавычек в musqlзапросах вроде я разобрался и привел все к единому.
Коряво, читается плохо, лишние переменные, може где ошибок не вижу.
Если люди добрые поглядят да подскажут что - большое спасибо.
43 comments|post comment

Восстановлени потеряных строк. [07 Jul 2009|07:40pm]

speedkill
Добрый день, всем!
Бьюсь над решением задачи уже 5 дней.

Конечная цель скрипта сформировать таблицу с ценами в зависимости от трех параметров.
Таблица должна быть в подобном виде:
p1p2p3p4p5
d1dn16541231
d1dn2654456321
d1dn365799429
d2dn1654265426641654
d2dn291981919165464116
d2dn3654656464644
d3dn123423533453
d3dn2345565645
d3dn346562565656

берутся эти данные из SQL таблиц, где хранятся в таком виде:
d1dn1p334565
d1dn1p43542
d1dn1p535465
.
.
.
.
И так далее...
Наверное это не самая сложная задача, но я ее решил и бы горд этим. Но задача усложнилась. Выяснилось, что первая таблица может иметь например такой вид. Крестиками обозначены места, где цены вовсе нет.


p1p2p3p4p5
d1dn1654x31
d1dn2654456321
d1dn365xx
d2dn1xx641654
d2dn291981919165464116
d2dn3654656464644
d3dn123423533453
d3dn2345565645
d3dn346562565656

Т.е. вообще одна строка в этой таблице может содержать только одну цену. Вся сложность в том, что для цен, которых в таблице конечной нет, нету и строк в БД. Т.е. в идеале, для полной строки таблицы в БД должно быть 3 строки. Но в случае строки d1-dn3 это будет всего одна строка.

Как выводить все это хозяйста ума не приложу, так как что-то где-то обязательно сползает.

Буду очень благодарен за любую помощь. Если это является классической задачей программирования, которой например учат в институтах, скажите хотя бы как она называется, и я найду решение сам.

19 comments|post comment

Паттерн кэширования для моделей [07 Jul 2009|06:49pm]

parizhskiy
enA caching pattern for models

ruПаттерн кэширования для моделей

uaПаттерн кешування для моделей

Это паттерн для моделей использующих Zend_Cache и магический метод __call.

Простая идея
Изначальный смысл в том, что модель должна иметь возможность возвращать не кэшированные или кэшированные вызовы, без постоянной инициализации определенного объекта. Должно происходить легкое переключение между двумя вызовами, и кэш должен приходить уже с моделью объекта.
Читать далее... )
13 comments|post comment

Файлы и папочки и передовые IDE [06 Jul 2009|09:39am]

miteigi_nemoto

«Утверждение, что следует развивать привычку думать о том, что мы делаем, часто повторяется в учебниках и в речах известных людей и является абсолютно ошибочной избитой фразой. Верно совершенно обратное. Развитие цивилизации связано с увеличением числа важных операций, которые мы можем выполнять не задумываясь.»

Альфред Норф Уайтхед
 


Некто утверждал, что у него передовые инструменты разработки. Я сомневаюсь, что сейчас есть IDE, которая удовлетворит все мои потребности или хотя бы ее большую часть. Если кого-то неудовлетворяет то, как я программирую и представляю себе написание кода, скажу личшь, что каждый пишет в меру своих желаний, знаний, привычек и умений. Написание кода процесс индивидуальный.

 

Read more... )
52 comments|post comment

Разбиение класса на файлы [04 Jul 2009|05:11pm]

miteigi_nemoto
Есть класс, который содержит пару десятков функций, которые можно сгрупировать в 3-4 группы по назначению. Мне бы было удобно если эти группы функций вынести в отдельные файлы, но при этому не потерять структуру класса, чтобы класс отсался классом. Мне надоело скролить длинные файлы с классами.

Т.е. я хочу чтобы один и тот же класс был представлен несколькими файлами:
power_class.php
power_class_g1.php
power_class_g2.php
power_class_g3.php

Как это реализовать граммотно?

UPDATE:

1. У меня есть один класс, на котором построен сайт. В этом классе есть общие функции, а есть индивидуальные для каждого раздела. Мне не хочется под каждый раздел писать классы. Мне было бы удобнее из этого класса вынести функции по файлам. Плодить классы тоже геморой.

2. У меня стоит Zend Studio мне не нравится эта концепция сворачивания классов, разворачивания. Все эти IDE редакторы морально устарели. В крупных проектах приходится скакать по папкам и файлам, как спортсмен, открывать десятки файлов и прочий геморой.

Я бы вообще сделал так: каждая функция это файл. А потом чтобы это собиралось как-то автоматически в один или несколько файлов и заливалось на сервак... Или например вообще в реляцонных БД хранить функции...но это уже другая песня.

Хотел бы чтобы редакторы могли виртуально собирать нужные сейчас функции в одно окно редактирования. Например, 1 функцию из файла x.php, другую из файла z.php, одну функцию из класса такого-то другую из другого...

3. Мне кажется, что мышление программиста сдерживают файловая система и концепция тектовых редакторов. Мы мыслим на уровне папочек и файлов, в то время как давно существуют базы данных.

Например, выбрать функции с названием Convert в крупном проекте - это нужно ждать когда поиск обойдет все папки и файлы, а если это на удаленном сервере - то пиши все пропало. А потом если попробовать их отредактировать - это значит открыть десять файлов с десятью окнами....

РЕШЕНИЕ

Я вижу такое решение своей задачи.

1. Вызывается функция, которая собирает класс из нескольких файлов в один файл class_power.php
действует просто как шаблонизатор
function compile_class(){
}
2. Затем инклудится сгенерированный class_power.php
3. Структура класса, который собирается в class_power.php
class_main.php - файл, в котором описана структура класса
Class PowerClass
{
     var $var1;
     #class_part1.php#
     #class_part2.php#
     #class_part3.php#
}
class_part1.php - часть класса в виде набора функций
class_part2.php - часть класса в виде набора функций
class_part3.php - часть класса в виде набора функций

Таким образом можно собирать несколько файлов с одинаковыми функциями, что мне видится может быть также полезным.

еще один пример решения приводит zupernintendo

function load_mclass($class="power_class"){
$res[]="class $class{\n";
foreach(glob($class."*") as $c)
$res[]=удалить "<?php", строку "class $class{", завершающий "}", "?>" из file_get_contents($c);
$res[]="\n}";
записать $res в файл $class.m.php
подключить $class.m.php
}

ЗАЧЕМ ЭТО НУЖНО
Нужно это для того, чтобы не тратить свое время на скролинг по длинному файлу, а также чтобы группировать функции связанные по смыслу или назначению, и при этом не терять структуру класса.
167 comments|post comment

Переход на PHP 5.3.0 [04 Jul 2009|12:10pm]

die_slogan
Здравствуйте, возникла мысль перевести боевой хостинг на 5.3. Но тут же возникла другая мысль - а как там с обратной совместимостью? Ведь, изменений довольно много. Тут и неймспесы и GC и еще что-то, что я навскидку уже не помню.

Дело в том, что сам хостинг состоит из кучи сайтов, где крутятся сравнительно древние CMS, написанные, порой, на коленке. Их когда-то проапгрейдили до PHP5, а до этого их отучали от register_globals, и они кое-как соответствуют веяниям времени.
Вопрос в том, у кого, какие проблемы возникали на новой версии с такого рода древними (или не очень древними) скриптами?
29 comments|post comment

Всё, не могу! :) Помогите обработать массив [03 Jul 2009|10:59am]

pravdazhizni
Привет всем!
Мы с напарником тут очень интенсивно занялись обработкой одной БД (MSSQL) и вот застряли. Я на ПХП недавно начал кодить, поэтому многим вопрос покажется несложным.
В общем, так..
Есть таблица, где представлены туристические пакеты в виде:
   
2009-07-02 00:00:00.000    8    7    281
2009-07-02 00:00:00.000    8    7    356
2009-07-02 00:00:00.000    8    7    281

2009-07-02 00:00:00.000    10    9    377
2009-07-02 00:00:00.000    10    9    451
2009-07-02 00:00:00.000    10    9    600
2009-07-02 00:00:00.000    10    9    451
2009-07-03 00:00:00.000    4    3    327
2009-07-03 00:00:00.000    4    3    370

2009-07-04 00:00:00.000    4    3    320
2009-07-04 00:00:00.000    4    3    295
2009-07-04 00:00:00.000    4    3    295
2009-07-04 00:00:00.000    6    5    317
2009-07-04 00:00:00.000    6    5    222
2009-07-04 00:00:00.000    6    5    264


то есть сначала идет дата вылета (date), затем, количество дней, количество ночей и цена

Из этого надо получить следующий вид:

2009-07-02 00:00:00.000    8    7    281      356     281           -
2009-07-02 00:00:00.000    10   9   377     451      600        451
2009-07-03 00:00:00.000    4    3    327      370        -             -
2009-07-04 00:00:00.000    4    3    320      320      295        295
2009-07-04 00:00:00.000    6    5    317      222      264         -

Короче, надо, чтоб на каждое уникальное сочетание (Дата + Дни + Ночи) цены выстраивались в ряд справа от сочетания.
У меня есть такая идея:
объединить в одной клетке Дату + Дни + Ночи, чтоб в изначальном массиве осталось два столбца. В виде

2009-07-02    8-7    |   281
2009-07-02    8-7    |  356
2009-07-02    8-7    |  281

2009-07-02     10-9 |   377
2009-07-02     10-9 |   451

Тогда нужен такой алгоритм: Если в первом столбце две соседних клетки равны (содержание клеток равно), то следующую цену помещаем рядом в ряд.
Не подскажете, как это можно реализовать?
Заранее всем благодарен.

22 comments|post comment

Области видимости [02 Jul 2009|10:46pm]

ctepeo
Как и многие амбициозные php-программисты или просто обыватели, я хочу написать свою cms. Упёрся в один вопрос, с которым мне гугл как-то не очень помог, хочу обратиться к вам, сообщество.

Я хочу иметь всегда под рукой объект класса mysqlClass, то есть хочу произвести изначально инициализацию класса, где в конструкторе будут все проверочки и так далее, чтобы в конструкторе mysqlClass у меня происходил mysql_connect, и далее я мог работать с этим объектом в любом месте моего кода.

Итак, вопрос, как мне, допустим, из класса News и его функции, например $this->ShowNews($id); нужно воспользоваться $db->Select("SELECT * FROM `News` WHERE ID='".(int)$id."'"); Как должно всё это выглядеть.

Хочется сразу уточнить, что брать готовые классы мне не хочется, но зато с удовольствием почитаю про то, как это должно быть реализовано.
77 comments|post comment

Бэкап MySQL средствами PHP [02 Jul 2009|06:15pm]

maul
Существует ли готовый скрипт на PHP, который заменяет в работе mysqldump? Проблема в том, что у хостинг-провайдера PHP работает в safe_mode и не дает исполнять внешние приложения. Могу и сам написать, но может уже есть готовое решение.

Про phpMyAdmin я естественно знаю.
9 comments|post comment

Копирование записи mySQL [02 Jul 2009|06:10pm]

katterfeld
Коллеги, а как бы Вы организовали наиболее элегантнм способом такую универсальную функцию:
Считать запись mySQL и сдублировать ее, т.е. сделать INSERT?

UPD. Всем спасибо, грамотный ответ получен. К сожалению, остальные комментарии в традиционном стиле "мы тут все крутые, а ты лох".
30 comments|post comment

Небольшой тест (unset) [02 Jul 2009|01:14pm]

sontar
Не запуская код ответьте что покажут следующие примеры (содержимое массива $a):
Read more... )
3 comments|post comment

pear Net/SMTP.php vs CLI [01 Jul 2009|09:43pm]

wildwife
Доброе время суток!
У меня такая ерунда: имеется скрипт который, среди прочего, посылает почту (PEAR, Net/SMTP.php). Так вот, через броузер все работает отлично, а когда пытаюсь запустить с коммандной строки (cli) то ничего не посылается, хотя и не ругаеццо вовсе.
Чтобы это значило?

запускаю так:
C:\wamp\bin\php\php5.2.6>php c:\wamp\www\myscript.php

внутри скрипта: кусок кода )
Поправьте, если что, плз.

И чтоб два раза не вставать, как делается cron jobs в wamp-e? Контрольная панель - отсутсвует. :(
18 comments|post comment

navigation
[ viewing | most recent entries ]
[ go | earlier ]

Advertisement