| Лексический парсер русского языка |
[12 Jul 2009|12:49pm] |
Захотелось написать простой движок для interactive fiction на php. И сразу возник вопрос лексического парсера, в котором я полный профан.
Не подскажите ли где посмотреть на алгоритмы разбора русских предложений?
Типа на входе имеем "Зажечь свечу огнивом", на выходе получаем структуру типа
действие: зажечь цель: свеча средство: огниво
Или "поговорить с гоблином об искусстве":
действие: поговорить цель: гоблин предмет: искусство
|
|
|
[11 Jul 2009|02:20pm] |
|
Вопрос к познавшим версию 5.3. Я правильно понимаю, что новый, банановый, сборщик мусора требуется явным образом включать через gc_enable() или ini.zend.enable-gc? Если да, то почему он не включён по умолчанию? Его включение приводит к каким-то заметным накладным расходам?
|
|
|
[10 Jul 2009|10:43pm] |
случилась такая ситуация, возможно простая, но решение мне нужно очень срочно, поэтому обращаюсь к вам в надежде на помощь так как сама в php разбираюсь крайне слабо.
сделала три баннера .swf (по сути один, просто на трех разных языках), и так как "на сайте для каждой языковой версии не предусмотрены разные баннеры" меня попросили "дописать код, чтобы 3 баннера подряд ротировались", каким образом это можно сделать на php?
спасибо заранее
|
|
| Обсудим достоинства и недостатки TransAjax |
[10 Jul 2009|10:14pm] |
Здесь я опубликовал небольшую, но на мой взгляд исчерпывающую заметку о быстром использовании библиотеки 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> );
|
|
| Освобождение памяти в PHP |
[10 Jul 2009|05:32pm] |
Вот тут подсмотрел, что, якобы, именно так правильно освобождать память в PHP:
$foo = new stdClass;
$foo = null;
unset($foo); Что сообщество думает по этому поводу?
Вопрос возник в связи с необходимостью написать на PHP демон и повесить его на прослушивание порта. Какие могут быть рекомендации и литература по этой теме?
|
|
| Ресайз изображений |
[10 Jul 2009|01:24pm] |
Когда пользователи заливают на сайт фотографии большого разрешения, скрипту, который их ресайзит, видимо не хватает памяти и он не справляется. Можно ли как-то ресайзить большие фотки (может как-то по частям), чтоб обходить это ограничение стандартных хостингов? Пользуюсь мастерхостом.
upd. Для мастерхоста решение - http://masterhost.ru/support/faq/technical/imagemagick/
|
|
| Хитрая регулярка |
[10 Jul 2009|09:24am] |
Добрый день! Есть строка типа 2;11;3 ,пытаюсь с помощью регулярных выражений проверить есть ли цифра 11 в ней (причем строка может быть и вида 2;3;11), при этом если в регулярку поставить 1 то оно должно возвращать ложь, но что-то неполучается, вот как я пробовал: ([11][^0-9]{1,})* ^([11][^0-9]{1,})*$
Подскажите в чем ошибка? Заранее спасибо!
UPDATE: Спасибо всем за помощь!
|
|
| Фильтрация вводимых данных (по мотивам предыдущего поста) |
[09 Jul 2009|11:56pm] |
Несколько простых правил
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
Исправляйте и дополняйте.
|
|
|
[09 Jul 2009|03:15pm] |
решил тут свою криворучкость переписать всю начал с вопросов безопасности, хоть это и для внутреннего употребления начитался разного, и получаю:
///////////////////// для проверки всех форм получаемых гетом ///////////////////////
// чистим стандартно $_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запросах вроде я разобрался и привел все к единому. Коряво, читается плохо, лишние переменные, може где ошибок не вижу. Если люди добрые поглядят да подскажут что - большое спасибо.
|
|
| Восстановлени потеряных строк. |
[07 Jul 2009|07:40pm] |
Добрый день, всем! Бьюсь над решением задачи уже 5 дней.
Конечная цель скрипта сформировать таблицу с ценами в зависимости от трех параметров. Таблица должна быть в подобном виде:
| p1 | p2 | p3 | p4 | p5 | | d1 | dn1 | 654 | 12 | 31 | | d1 | dn2 | 654 | 456 | 321 | | d1 | dn3 | 65 | 79 | 9429 | | d2 | dn1 | 65426 | 5426 | 641654 | | d2 | dn2 | 91981 | 9191 | 65464116 | | d2 | dn3 | 65465 | 6464 | 644 | | d3 | dn1 | 2342 | 353 | 3453 | | d3 | dn2 | 345 | 56 | 5645 | | d3 | dn3 | 4656 | 256 | 5656 |
берутся эти данные из SQL таблиц, где хранятся в таком виде:
| d1 | dn1 | p3 | 34565 | | d1 | dn1 | p4 | 3542 | | d1 | dn1 | p5 | 35465 | . . . . И так далее... Наверное это не самая сложная задача, но я ее решил и бы горд этим. Но задача усложнилась. Выяснилось, что первая таблица может иметь например такой вид. Крестиками обозначены места, где цены вовсе нет.
| p1 | p2 | p3 | p4 | p5 | | d1 | dn1 | 654 | x | 31 | | d1 | dn2 | 654 | 456 | 321 | | d1 | dn3 | 65 | x | x | | d2 | dn1 | x | x | 641654 | | d2 | dn2 | 91981 | 9191 | 65464116 | | d2 | dn3 | 65465 | 6464 | 644 | | d3 | dn1 | 2342 | 353 | 3453 | | d3 | dn2 | 345 | 56 | 5645 | | d3 | dn3 | 4656 | 256 | 5656 |
Т.е. вообще одна строка в этой таблице может содержать только одну цену. Вся сложность в том, что для цен, которых в таблице конечной нет, нету и строк в БД. Т.е. в идеале, для полной строки таблицы в БД должно быть 3 строки. Но в случае строки d1-dn3 это будет всего одна строка.
Как выводить все это хозяйста ума не приложу, так как что-то где-то обязательно сползает.
Буду очень благодарен за любую помощь. Если это является классической задачей программирования, которой например учат в институтах, скажите хотя бы как она называется, и я найду решение сам.
|
|
| Файлы и папочки и передовые IDE |
[06 Jul 2009|09:39am] |
|
«Утверждение, что следует развивать привычку думать о том, что мы делаем, часто повторяется в учебниках и в речах известных людей и является абсолютно ошибочной избитой фразой. Верно совершенно обратное. Развитие цивилизации связано с увеличением числа важных операций, которые мы можем выполнять не задумываясь.» Альфред Норф Уайтхед
Некто утверждал, что у него передовые инструменты разработки. Я сомневаюсь, что сейчас есть IDE, которая удовлетворит все мои потребности или хотя бы ее большую часть. Если кого-то неудовлетворяет то, как я программирую и представляю себе написание кода, скажу личшь, что каждый пишет в меру своих желаний, знаний, привычек и умений. Написание кода процесс индивидуальный.
( Read more... )
|
|
| Разбиение класса на файлы |
[04 Jul 2009|05:11pm] |
Есть класс, который содержит пару десятков функций, которые можно сгрупировать в 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 }
ЗАЧЕМ ЭТО НУЖНО Нужно это для того, чтобы не тратить свое время на скролинг по длинному файлу, а также чтобы группировать функции связанные по смыслу или назначению, и при этом не терять структуру класса.
|
|
| Переход на PHP 5.3.0 |
[04 Jul 2009|12:10pm] |
Здравствуйте, возникла мысль перевести боевой хостинг на 5.3. Но тут же возникла другая мысль - а как там с обратной совместимостью? Ведь, изменений довольно много. Тут и неймспесы и GC и еще что-то, что я навскидку уже не помню.
Дело в том, что сам хостинг состоит из кучи сайтов, где крутятся сравнительно древние CMS, написанные, порой, на коленке. Их когда-то проапгрейдили до PHP5, а до этого их отучали от register_globals, и они кое-как соответствуют веяниям времени. Вопрос в том, у кого, какие проблемы возникали на новой версии с такого рода древними (или не очень древними) скриптами?
|
|
| Всё, не могу! :) Помогите обработать массив |
[03 Jul 2009|10:59am] |
Привет всем! Мы с напарником тут очень интенсивно занялись обработкой одной БД (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
Тогда нужен такой алгоритм: Если в первом столбце две соседних клетки равны (содержание клеток равно), то следующую цену помещаем рядом в ряд. Не подскажете, как это можно реализовать? Заранее всем благодарен.
|
|
| Области видимости |
[02 Jul 2009|10:46pm] |
Как и многие амбициозные php-программисты или просто обыватели, я хочу написать свою cms. Упёрся в один вопрос, с которым мне гугл как-то не очень помог, хочу обратиться к вам, сообщество.
Я хочу иметь всегда под рукой объект класса mysqlClass, то есть хочу произвести изначально инициализацию класса, где в конструкторе будут все проверочки и так далее, чтобы в конструкторе mysqlClass у меня происходил mysql_connect, и далее я мог работать с этим объектом в любом месте моего кода.
Итак, вопрос, как мне, допустим, из класса News и его функции, например $this->ShowNews($id); нужно воспользоваться $db->Select("SELECT * FROM `News` WHERE ID='".(int)$id."'"); Как должно всё это выглядеть.
Хочется сразу уточнить, что брать готовые классы мне не хочется, но зато с удовольствием почитаю про то, как это должно быть реализовано.
|
|
| Бэкап MySQL средствами PHP |
[02 Jul 2009|06:15pm] |
Существует ли готовый скрипт на PHP, который заменяет в работе mysqldump? Проблема в том, что у хостинг-провайдера PHP работает в safe_mode и не дает исполнять внешние приложения. Могу и сам написать, но может уже есть готовое решение.
Про phpMyAdmin я естественно знаю.
|
|
| Копирование записи mySQL |
[02 Jul 2009|06:10pm] |
Коллеги, а как бы Вы организовали наиболее элегантнм способом такую универсальную функцию: Считать запись mySQL и сдублировать ее, т.е. сделать INSERT?
UPD. Всем спасибо, грамотный ответ получен. К сожалению, остальные комментарии в традиционном стиле "мы тут все крутые, а ты лох".
|
|
| pear Net/SMTP.php vs CLI |
[01 Jul 2009|09:43pm] |
Доброе время суток! У меня такая ерунда: имеется скрипт который, среди прочего, посылает почту (PEAR, Net/SMTP.php). Так вот, через броузер все работает отлично, а когда пытаюсь запустить с коммандной строки (cli) то ничего не посылается, хотя и не ругаеццо вовсе. Чтобы это значило?
запускаю так: C:\wamp\bin\php\php5.2.6>php c:\wamp\www\myscript.php
внутри скрипта: ( кусок кода ) Поправьте, если что, плз.
И чтоб два раза не вставать, как делается cron jobs в wamp-e? Контрольная панель - отсутсвует. :(
|
|
| navigation |
| [ |
viewing |
| |
most recent entries |
] |
| [ |
go |
| |
earlier |
] |
|
|
|
|