Записки самоучки

Февраль 6, 2007

WordPress 2.1 с поддержкой mysqli

Filed under: Движки,MySQL,PHP — 4matic @ 2:56 дп

У меня свой сервер. На нем поднят Apache и PHP 5.2.0. Так же есть сервер MySQL 5.0.27. У PHP стоят только те расширения, что мне нужно. В частности мне не нужно расширение mysql, но мне нужно расширение mysqli. Владея такой конфигурацией решил поставить Worpdress. К своему удивлению обнаружил, что WordPress не знает ничего о расширении mysqli. Так же есть пробелы при описании классов. В частности, при описании классов не описаны все поля класса, что для версий PHP5 не есть правильно. Но это на самом деле мелочи. Ниже я опишу процесс подключения поддержки расширения mysqli. Благодаря архитектуре WordPress, не составит большого труда наладить работу и с другими СУБД.

  1. Идем в директорию wp-includes. Делаем копию файла wp-db.php и даем копии имя db.php. Копию кладем в туже директорию, что и wp-db.php.
  2. Открываем файл и правим в нем все функции mysql_* на соответствующие им функции mysqli_*. При этом не забываем, что нужно обязательно указывать идентификатор ресурса результата запроса. Кстати, этот идентификатор не описан в классе. Поэтому выполняем пункт 3.
  3. Описываем в классе забытое, но нужное свойство $dbh, добавляя строку var $dbh где-то в районе дислокации всех var класса wpdb.
  4. Что-то какие-то непонятки с экранированием строк, которые поступают в запросы. Из-за каких-то непонятных мне причин разработчики решили просто прослешивать функцией addslashes():

    function escape($string) {
    return addslashes( $string ); // Disable rest for now, causing problems
    if( !$this->dbh || version_compare( phpversion(), ‘4.3.0’ ) == ‘-1’ )
    return mysql_escape_string( $string );
    else
    return mysql_real_escape_string( $string, $this->dbh );
    }

    Я вместо этого написал:

    function escape($string) {
    return mysqli_real_escape_string($this->dbh, $string);
    }

  5. Сохраняем изменения, закрываем файл. Или качаем db.php.
  6. Идем в директорию wp-admin.
  7. Делаем копию файл upgrade-functions.php и называем ее upgrade-ifunctions.php.
  8. Открываем upgrade-ifunctions.php и изменяем функцию:
  9. function wp_check_mysql_version() {
    global $wp_version;

    // Make sure the server has MySQL 4.0
    $mysql_version = preg_replace(‘|[^0-9\.]|’, », @mysql_get_server_info());
    if ( version_compare($mysql_version, ‘4.0.0’, ‘<‘) )
    die(sprintf(__(‘<strong>ERROR</strong>: WordPress %s requires MySQL 4.0.0 or higher’), $wp_version));
    }

    на

    function wp_check_mysqli_version() {
    global $wp_version;
    global $wpdb;

    // Make sure the server has MySQL 4.0
    $mysqli_version = preg_replace(‘|[^0-9\.]|’, », @mysqli_get_server_info($wpdb->dbh));
    if ( version_compare($mysqli_version, ‘4.0.0’, ‘<‘) )
    die(sprintf(__(‘<strong>ERROR</strong>: WordPress %s requires MySQL 4.0.0 or higher’), $wp_version));
    }

    Так же в этом файле поменяйте вызовы функции wp_check_mysql_version() на wp_check_mysqli_version() (2 раза).

  10. В директорию wp-admin находим файл setup-config.php и меняем в нем строку (у меня строка 154):

    require_once(‘../wp-includes/wp-db.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-content/db.php’) )
    require_once(‘../wp-includes/db.php’);
    else
    require_once(‘../wp-includes/wp-db.php’);

    Т.е. теперь, при наличии файла db.php — нашего враппера (обмертки) запросов к СУБД, WP попробует подключить его, а если не найдет этот файл, то подключит стандартный врапер, к которому и пальцем не прикасались.

  11. В той же директории находим файл install.php и меняем в нем строку (у меня строка 9):

    require_once(‘./upgrade-functions.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’) )
    require_once(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’);
    else
    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

    Т.е. теперь, при наличии файла upgrade-ifunctions.php — «нашего файла», WP попробует подключить его, а если не найдет этот файл, то подключит стандартный файл upgrade-functions.php, к которому и пальцем не прикасались.

  12. В той же директории находим файл admin.php и меняем в нем строку (у меня строка 92):

    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’) )
    require_once(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’);
    else
    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

  13. В той же директории находим файл upgrade.php и меняем в нем строку (у меня строка 8):

    require_once(ABSPATH . ‘/wp-admin/upgrade-functions.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’) )
    require_once(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’);
    else
    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

    Кстати, обратите внимание, что лишний слеш, потому что ABSPATH заканчивается слешем, а тут еще один прицепили.

  14. Последний рывок. Идем в корневую директорию распакованного движка, открываем файл wp-settings.php, находим строку (у меня строка 100):

    require_once (ABSPATH . WPINC . ‘/wp-db.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-includes/db.php’) )
    require (ABSPATH . ‘wp-includes/db.php’);
    else
    require_once (ABSPATH . ‘wp-includes/wp-db.php’);

Если я ничего не забыл, то все готово для инсталяции WordPress на сервере с конфиграцией PHP5 с расширением mysqli, но без расширения mysql, а так же самой СУБД MySQL. Если что-то упустил — комментируйте, но сначала попробуйте отладить самостоятельно!

P.S. Отредактированные файл выложить не могу — не позволяют настройки WordPress.

Предупреждение. Если вы выделяете и копируете тексты из блога, то исправляйте кавычки. В блоге кавычки обратные и скрипт с такими кавычками корректно работать не будет!!!!!

Реклама

Январь 31, 2007

У SharePoint неудобный форум

Filed under: Движки,Ссылки — 4matic @ 12:37 пп

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

  1. Если разворачиваешь сообщения, то видно только часть (начало) сообщения, а не весь текст. Развернуть сообщения можно только в режиме дерева.
  2. Когда даешь ответ, то не видишь, на какое сообщение ты даешь ответ.
  3. Пока еще этой проблемы нет (создали несколько топиков), но нет возможности создавать структуру форума в виде Раздел/подраздел. На сколько я понял SPPS допускает только один уровень иерархии, а это не удобно при большом количестве тем.
  4. Субъективное предположение. Сужу по той навигации, которая есть. Навигация по форуму будет неудобной, когда форум разрастется.

Я так понимаю, что MS не считает форум одним из основных средств коммуникации между сотрудниками. Именно поэтому такой скудный функционал.

Из форумов (бесплатных), которые я пользовал, мне нравятся: PHPBB, Drupal.

Кстати. Если вы выбираете форум, то вам, возможно, будет интересен ресурс http://forummatrix.org. Это ресурс на котором собрана информация об основных движках форумов. Вы можете выбрать интересующие вас форумы и сравнить их между собой. Все достаточно просто и удобно. Сравнить форумы можно в несколько кликов.

Декабрь 6, 2006

Остановить ботов при регистрации на форуме

Filed under: Движки,Идеи — 4matic @ 11:40 дп

Недавно, для экспериментов, я установил форум phpBB. После того, как форум стал виден в поисковиках пошел трафик ботов, которые автоматически регистрируются на форуме.

Городить какие-то моды с оригинальными тестами Тьюринга банальная лень, поэтому в голову пришла идея. А что если я элементу формы, в которую вносятся данные с CAPTCHA, дам нестандартное имя? Например, поле логина будет иметь атрибут name от атрибута поля для CAPTCHA, а атрибуту поля для CAPTCHA дам имя от поля логина. Естественно, нужно будет поправить скрипт, который обрабатывает форму регистрации.

Увеличится число ботов — проверю, как это работает. Заодно и узнаю, на сколько «умные» движки у ботов.

P.S. Наверное, такое примитивное решение не сработает на хорошо посещаемых ресурсах.

Сентябрь 8, 2006

В wordpress’е некорректно обрабатываются клиентские данные

Filed under: Глюки,Движки — 4matic @ 5:07 пп

Не ожидал такого от WP. На странице администрирования, ну, там где виден список поисковых слов, вместо текста — элементы управления. Т.е. поисковая фраза состояла из тега, который WP некорректно переварил, выдавая на клиента. В частности, поисковая фраза выглядит как

<input type checked>+javascript

А на странице видно поле для ввода данных. Я не собираюсь крутить это дыру, но не исключаю варианта, что через поисковый запрос можно выполнить неприятный XSS. Единственное замечу, что так не должно быть: ни с точки зрения безопасности, ни с точки зрения отображения.
В общем, бдите, господа программисты и будьте более внимательны при написании приложений!

Более родвинутые знатоки движка WP меня могут поправить. AFAIK, WP обрезает поисковую строку. И еще замечание. По поисковому запросу-эксплоиту должен быть найден блог.

Не в тему. Мой блог был найден по фразе «не крути мне яйца» :-))). Без комментариев.

Август 14, 2006

Вышла вторая бета третьей версии известного движка для форума phpBB.

Filed under: Движки,Это жизнь — 4matic @ 10:51 дп

Что бы не говорили о дырах, но, на мой взгляд, phpBB — один из наиболее удачных оупенсорсных движков форума. Как я понял, кодовое название PHPBB3 — Olimpus. На сколько я знаю phpBB3 использует Ajax. Так же плюс, что при использовании СУБД MySQL можно работать с СУБД с помощью расширения MySQLi (например, я пользуюсь PHP5 и полностью отказался от модуля MySQL в пользу MySQLi).

Первая бета была 17 июня. После выхода первой беты было озвучено около 267 баг-репортов. Т.е. очень много работы проделано и, естественно, очень много работы впереди. На сколько я знаю, пока что нет скрипта, который переносит базу с движка phpBB2 на phpBB3. Думаю, что как только phpBB3 выйдет из беты, тогда и будет написан скрипт по конвертации.

Сама новость от разработчика расположена по адресу: http://www.phpbb.com/phpBB/viewtopic.php?f=14&t=427216
Основные возможности форума описаны по адресу: http://area51.phpbb.com/docs/features.html

Блог на WordPress.com.