Тэг ‘php’

Установка PEAR, PHPUnit на Windows

Установка PEAR сводится к двум простым шагам:

  • скачать файл с архивом go-pear.phar в каталог с PHP
  • выполнить его командой  php go-pear.phar из консоли (cmd)

В процессе установки рекомендуется проверить правильность путей к ресурсам (12 всего), а в завершении - внести в реестр информацию из  PEAR_ENV.reg

Установка PHPUnit

Обновим PEAR-библиотеки:
pear update-channels
pear upgrade-all

Добавим каналы для PHPUnit:
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com

Установим
pear install phpunit/PHPUnit
* если при выполнении этой команды получен ответ:

No releases available for package “pear.phpunit.de/PHPUnit
install failed

поможет очистка кэша
pear clear-cache

И проверим корректность установки
phpunit --version

* Ошибка при подключения файла failed to open stream: No such file or directory in /usr/share/php/PHPUnit/Autoload.php - скорее всего установлена более ранняя версия PHPUnit

Установка XDebug

Скачиваем нужную версию с http://www.xdebug.org/download.php

Если есть сомнения в совместимости версий PHP и XDebug - можно воспользоваться инструментом на сайте XDebug
http://www.xdebug.org/find-binary.php - загрузить в textarea вывод функции php -i (или скопировать результат функции  phpinfo()) - и Вы получите полные инструкции по установке XDebug (как на Windows так и на Linux)

Опубликовано Сентябрь 12, 2011 | автор: levik  |  Нет комментариев »

В IE не работает post в jQuery - callback в internet Explorer

Собственно, из названия несложно догадаться, что во всех браузерах $JQuery.post(…) работает нормально, а в Internet Explorer - не совсем. Если точнее - не вызывается callback-функция после отправки параметров на сервер (на сервере действия происходят - проблема только в вызове Callback)

Как правило, достаточно настроить сервер для отдачи соответствующих заголовков: про решение проблемы с post jquery callback в IE

Опубликовано Август 5, 2011 | автор: levik  |  Нет комментариев »

PHP Zend Optimizer - как раскодировать файлы

PHP файл, закодированный с использованием Zend Optimizer (если быть точным, используется Zend Encoder) содержит частично скомпилированный (оптимизированный) код. Платный Zend encoder кодирует, а бесплатный zend optimizer (установленный на хостинге) - раскодирует обратно. Теоретически, выполнение заранее скомпилированного кода должно ускорять работу скрипта PHP. В случае с Zend Optimizer, однако, вопрос конфиденциальности скриптов, пожалуй, приоритетнее производительности. Однако, в любом случае, если потребуется внести исправления в закодированный файл, возникнут сложности..

дезендер есть… спроси у nulled.ws - у них вроде был…

How Does it Work?

The Zend Encoder compiles and converts plain-text PHP scripts into a platform-independent binary format known as a ‘Zend Intermediate Code’ file. These encoded binary files are the ones that are distributed instead of the human-readable PHP files. The performance of the encoded PHP application is completely unaffected!

The Zend Optimizer, a free download, is the run-time environment that enables end-users to transparently execute these files as if they were regular PHP scripts. The Zend Optimizer not only provides an additional level of increased security against reverse engineering, it also improves performance speed.

http://www.zend.com/store/products/optimizer-faq.php
http://www.zend.com/store/products/zend-encoder.php

PHP Dezend можно найти в упоминаниях. Некоторые предлагают его приобрести…

http://creotiv.in.ua/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/dezend-php-decompiler/

http://www.qinvent.com/cyrj/dezender/index-en.php

Однако, рекомендую не терять “оригинальные” незашифрованные ЗЕНДом версии файлов.

Опубликовано Март 1, 2011 | автор: levik  |  Нет комментариев »

Работа с Excel в PHP - классы, библиотеки, готовые решения

Phpexcel - Просто огромный (~20 Мб исходников) набор классов для работы с Excel из PHP. Возможно сделать практически всё, что можно сделать в Excel (например, поддерживается работа с формулами, с диаграммами… ). Требования к хостингу, однако, также на высоте - PHP 5.2 и выше, библиотеки Zip, XML и GD2
http://phpexcel.codeplex.com/

Spreadsheet_Excel_Reader небольшой класс для чтения информации из Excel. Подойдет для обработки (импорта файлов XLS). Из найденных “глюков” - дата может быть смещена на единичку - исправляем значения
define(’SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS’ ,    25570); //25568
define(’SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904′, 24108); //24107
http://sourceforge.net/projects/phpexcelreader/

Доработанный вариант -  PHP Excel Reader - довольно удобная библиотека для работы с Excel в PHP. Последняя версия ещё не так сильно устарела. Однако, проблемы с датой остались и в этой версии - не всегда корректно определяется время.
http://code.google.com/p/php-excel-reader
http://groups.google.com/group/php-excel-reader-discuss?pli=1

Spreadsheet_Excel_Writer - класс из PEAR, поддерживает картинки, формулы, изображения форматирование текста и ячеек (заливка, границы). Не рекомендуется к использованию (т.к. не “совсем” поддерживает новый - BIFF8 - формат EXCEL)
* PHP 4.1.0
* PEAR Installer 1.4.0b1
* OLE 0.5
http://pear.php.net/package/Spreadsheet_Excel_Writer

По аналогии с работой в Word через COM, можно организовать и работу с Excel через COM-объекты. Однако, этот вариант возможен лишь на Windows-хостинге и установленном Excel , либо на локальном компьютере пользователя через JavaScript в Internet Explorer (опять же,требуется установленный Excel)

Не забываем, что экспорт в Excel по требуемому шаблону можно сделать без дополнительных классов, исключительно средствами PHP

Опубликовано Февраль 25, 2011 | автор: levik  |  Нет комментариев »

PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext

При запуске из командной строки в Windows php ругается кучей однотипных warning-ов:
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\…

PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\php_curl.dll’ - =х эрщфхэ єърчрээvщ ьюфєы№. in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\php_gd2.dll’ - =х эрщфхэ єърчрээvщ ьюфєы№. in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\php_mbstring.dll’ - =х эрщфхэ єърчрээvщ ьюфєы№. in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\php_mysql.dll’ - =х эрщфхэ єърчрээvщ ьюфєы№. in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\php_mysqli.dll’ - =х эрщфхэ єърчрээvщ ьюфєы№. in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\php_pdo.dll’ - =х эрщфхэ єърчрээvщ ьюфєы№. in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/php5/ext\php_pdo_mysql.dll’ - =х эрщфхэ єърчрээvщ ьюфєы№. in Unknown on line 0

Переводя кракозябры, получаем что-то вроде “Не найден указанный модуль“.

Как правило, всё дело в том, что в php.ini не правильно задан путь к расширениям:
;Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/local/php5/ext"

Следует исправить на “нормальный” для windows путь (не забываем заключительный слэш) - должно получиться что-то вроде такого:
; Directory in which the loadable extensions (modules) reside.
extension_dir = "C:\program files\servers\usr\local\php5\ext\"

Такого рода проблема может появиться у многих windows-серверов для локальной разработки: Xampp, Wampp, Denwer

Опубликовано Февраль 10, 2011 | автор: levik  |  Нет комментариев »

php - прячем информацию от разработчиков

Задача:  написать непрозрачный объектно-ориентированный код на php.
Есть система, которая работает с некоторыми секретными данными. Данные хранятся в xml, и закрыты ассиметричным ключом. Закрытый ключ хранится в коде внутри финализированного метода внутри класса. Класс накрыт зендом и поднимается только через дизасм. Скрепя сердце начальство признало этот способ безопасным. Доступ к классу осуществляется через https соединение. Столкнулся с проблемой, которая разорвала мне мозги: вся эта система ходит по рукам, но всё время остается закрытой для сторонних разработчиков за исключением того, что у системы есть документированное API. А значит на эту систему вешаются сторонние модули.Несмотря на то, что сам класс, который парсит xml с секретными данными финализированный и всё, что можно находится в private, добрые люди намекнули, что эта система пробиваема на Ура. Способ обхода очень странный: самый верхний объект прогоняется через var_dump, результат вывода кэшируется, а затем кэш парсится. Получается, что если мой объект расшифровал секретный xml, то он хранит распарсированные конфиги у себя в private свойствах, потом его сканирует сторонний модуль через var_dump или print_r и грабит секретную статическую информацию производителя системы, которая одинакова на всех копиях системы. На сколько мне известно, var_dump и print_r могут получить доступ к всем свойствам (в том числе private и protected). Уязвимостью это язык не поворачивается, это дыра, в которую можно пешком пройти.

final class Center {

private static $domSecret = 'DOM';public function makeProfit($a){

return self::$domSecret.$a;

}

public function __construct(){

exit("error");

}

}

echo Center::makeProfit('::Profit');

//а тут - вылетает с ошибкой

$c = new Center();

Вариации на тему^
private function __construct(){}

http://www.php.ru/forum/viewtopic.php?t=29560

Опубликовано Февраль 2, 2011 | автор: levik  |  Нет комментариев »

Фильтрация данных в PHP

you should always be wary of any data provided by outside services

Все данные, поступающие в php-скрипт (да и вообще в любую программу) “извне” следует проверять на “корректность”. Это может быть как защита “от дурака”, так и от “злобного хакера”.

Характерные уязвимости в PHP-скриптах и фильтрация данных

0. Убедитесь, что переменная “та, что надо” (при включении register_globals, существует возможность вместо $_SESSION или $_COOKIE переменной обратиться к $_GET или $_POST; не лишним будет проверить HTTP_REFERER)
1. Все переменные, которые предполагают числовое (целое,дробное, дата-время) значение следует привести к соответствующему типу;
1* Имеет смысл проверить на допустимость (неотрицательное, меньше допустимого максимума,несуществующая дата) в зависимости от контекста;
2. Все строковые переменные, которые имеют ограничение по длине следует “укоротить”
3. Все строковые переменные следует “очистить” от недопустимых символов (можно воспользоваться, например, функцией preg_replace с заданием соответствующего шаблона регулярного выражения - для email, для имени домена, для логина пользователя и т.д.)
4. Во всех данных, попадающих в запрос к базе данных следует экранировать спецсимволы (addslashes/mysql_escape_string… - кавычки, проценты в LikE и т.д.) SQL-инъекции (SQL injection)
5. Все данные, которые выводятся в браузер следует “почистить” от недопустимых HTML-тэгов (xss-уязвимости через тэги начиная от

Начиная с версии 5.2.0 в PHP присутствуют специальные функции для фильтрации данных, см. filter_var. Встроенные константы позволяют не задумываться о регулярных выражениях для email, например (хотя, общее понимание лишним не будет)

Конечно, статья не претендует на полный и исчерпывающий перечень рекомендаций по безопасности и фильтрации в PHP. Это скорее очень краткий обзор некоторых уязвимостей PHP-скриптов (не самого PHP) и информации, как их не допустить в собственных скриптах.

Если будут рекомендации по дополнению списка или корректировке - добро пожаловать в комментарии. Или Orphus =)

Ссылки по фильтрации данных в PHP
http://ru.php.net/manual/en/book.filter.php
http://phpclub.ru/detail/article/2003-12-01
http://phpclub.ru/detail/article/2003-09-23
http://itstep.wordpress.com/2010/05/31/php-vs-aspx/
http://www.webpeeps.ru/article/12

Опубликовано Январь 8, 2011 | автор: levik  |  Нет комментариев »

Сортировка массивов в PHP

В PHP есть несколько функций для сортировки массивов. Практически на все случаи жизни :)

sort - сортирует массив. После завершения работы функции элементы массива будут расположены в порядке возрастания.

arsort - сортирует массив в обратном порядке таким образом, что сохраняются отношения между ключами и значениями. Она полезна, в основном, при сортировке ассаоциативных массивов, когда важно сохранить отношение ключ => значение

asort -  сортирует массив таким образом, что сохраняются отношения между ключами и значениями. Она полезна, в основном, при сортировке ассоциативных массивов, когда важно сохранить отношение ключ => значение

ksort - cортирует массив по ключам, сохраняя отношения между ключами и значениями. Функция полезна, в основном, для работы с ассоциативными массивами

natsort - реализует алгоритм сортировки, при котором порядок буквенно-цифровых строк будет привычным для человека. Такой алгоритм называется “natural ordering”. (img2<img10)

natcasesort - регистронезависимый natsort

rsort - сортирует массив в обратном порядке (от большего к меньшему)

usort - сортирует массив по значениям используя пользовательскую функцию для сравнения элементов (для любителей эксклюзива)

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

array_multisort - может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями. Эта функция сохраняет соответствие между ключами и соответствующими им значениями.
Однако, для случая, когда нужно отсортировать многомерный массив “по строкам” можно использовать следующую функцию:


function array_orderby()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
?>
The sorted array is now in the return value of the function instead of being passed by reference.
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
// Pass the array, followed by the column names and sort flags
$sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
?>

Для сортировки по “рядам” такой метод как раз сгодится.

Опубликовано Ноябрь 2, 2010 | автор: levik  |  Нет комментариев »

virtuemart при добавлении товара белый экран-пустая страница

При входе в форму добавления товара virtuemart радует белым экраном ( в браузер выводится пустой html-документ). Обычно является это признаком fatal error в PHP. Заглядываем в LOG-файл - действительно:

[error] PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 49 bytes) in …/includes/database.php on line 491

Итак, при выводе “пустой” страницы добавления товара скрипту не хватает памяти (32 МБ, конечно не так уж много, но куда??). Что самое интересное, при редактировании товара (страница та же, только установлен параметр product_id) ошибка не возникает. И ещё, раньше такого вроде не было.

В database.php на 491 строке ничего особо интересного нет - подсказка, что выводится LIST (чего - не совсем ясно)… Элементы “складируются” в массив.. и на очередном не хватает памяти.

Предварительная диагностика подсказывает, что “глюк” из-за большого количества товаров (~22 тыс). Протестировал с “обрезанной” до 7 тыс товаров - всё работает. И правда, в товарах проблема.

Смотрим в сторону файла с формой добавления/редактирования товара
administrator/components/com_virtuemart/html/product.product_form.php

Но как связана страница добавления/редактирования одного товара с количеством товаров? Точно! Есть ведь связанные товары.. Большой multiselect связанных товаров и правда содержит все записи.. однако он выводится и при редактировании товаров.. Странно.. но всякое бывает - проверяем (закомментировать строчку с выводом мультиселекта).. Ан нет.. не влияет.

Ладно.. пробуем по-другому ищем product_id (ведь для имеющегося товара все в порядке.. белый экран только при добавлении Нового товара). Из “сомнительных” (cомнительное в смысле без проверки на “корректность” product_id) мест использования этой переменной видим такое:

$db_items = $ps_product->items_sql($product_id);

После которого идет вывод формы с подстановкой значений.

Проверяем совсем наглым образом - убираем эту строку и последующие, и открываем страницу добавления товара - Открывается! :) Добавляем строку (без продолжения) - ошибка.

перейти к решению проблемы пустого экрана

Опубликовано Сентябрь 15, 2010 | автор: levik  |  Комментарии (4) »

Экспорт в excel при помощи php

Параллельно с формированием бланков в rtf-формате, и работой с word из PHP или javascript иногда требуется сформировать средствами PHP документ EXCEL по уже готовому шаблону.

Готовых php-классов для работы с файлами xls (формат программы Microsoft excel) на сегодняшний день хватает. Однако, при заполнении таблицы предусмотреть все необходимые операции для нормального отображения (увеличение высоты строки, ширины строки и т.д.) довольно сложно.

Задачу экспорта в формате Excel решал на php следующим образом…

Тут стоит оговориться, все же основная хитрость не в конкретном языке, а в подходе - аналогичным способом можно поступить и с использованием любого другого языка, будь то серверный perl, python, или даже C-pascal без красивого оконного интерфейса. И даже при программировании под Windows использование такого способа даёт небольшой плюс - для формирования Excel-документа нам не требуется установленный на компьютере “офис”.

… продолжение статьи экспорт в EXCEL средствами PHP и не только

Опубликовано Сентябрь 13, 2010 | автор: levik  |  Комментарии (4) »