Думаю, что наступает пора заняться модернизацией кода для IPB 1.3 под PHP 7 для тех, кто до сих пор пользуется версией IPB 1.3 и не хочет с ней расставаться. В функционале PHP 7, по-быстрому говоря, теперь не признают бывшие стандартные функции, содержащие в своем названии mysql , - теперь все функции должны идти как mysqli: это касается абсолютно всех функций будь-то mysql_query() -> mysqli_query() , mysql_fetch_row() -> mysqli_fetch_row() и даже mysql_error() -> mysql_error(). Причем, ко всему прочему, данные функции i требуют обязательного указаниия, как минимум 2-х параметров, а где-то что-то должно быть целым итд. И это только начало. Далее по порядку, попытался насколько мог подправить код, но, все равно, хочется попросить еще помощи и от участников форума. Также необходимо, чтобы были установлены все патчи для PHP 5 (Включая PHP 5.4.x и выше из этой темы http://forums.ibresource.ru/topic/19364-php-5-direktivy-php-dlia-normalnoj-raboty-s-ipb-13/)и MySQL 5. 1) Файл: mySQL.php - тут правок полно. В частности, было:
итд по всему файлу, включая выводы ошибок. Подробно расписывать не буду - прикреплю лучше файл mySQL.php к посту, а там сами посмотрите. mySQL.php
2) index.php:
Там было вот такое:
class info {
var $member = array();
var $input = array();
var $session_id = "";
var $base_url = "";
var $vars = "";
var $skin_id = "0"; // Skin Dir name
var $skin_rid = ""; // Real skin id (numerical only)
var $lang_id = "en";
var $skin = "";
var $lang = "";
var $server_load = 0;
var $version = "v1.3";
var $lastclick = "";
var $location = "";
var $debug_html = "";
var $perm_id = "";
var $forum_read = array();
var $topic_cache = "";
var $session_type = "";
function _info () {
global $sess, $std, $DB, $INFO;
$this->vars = $INFO;
$this->vars['TEAM_ICON_URL'] = $INFO['html_url'] . '/team_icons';
$this->vars['AVATARS_URL'] = $INFO['html_url'] . '/avatars';
$this->vars['EMOTICONS_URL'] = $INFO['html_url'] . '/emoticons';
$this->vars['mime_img'] = $INFO['html_url'] . '/mime_types';
}
}
в PHP 7 это приводит к постоянному ворнингу на всех страницах:
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP
необходимо в этом классе function _info () заменить на: function __construct () То же самое нужно произвести практически в 85% файлах форума, где функция в классе имеет то же имя, что и сам класс (заменить функцию на function __construct ()) - проверил - работает и на версиях PHP 5.2.х и выше. 3)
index.php
Если у кого-то был установлен мод типа cookie IP ban, то
Если у кого установлен мод учета поисковиков mod_spider, то получаем ошибку:
Fatal error: 'break' not in the 'loop' or 'switch' context in
//-- mod_spider begin
if ($IN['act'] == "op" && $IN['code'] == "spider") {
if (file_exists(ROOT_PATH."sources/mods/spider/mod_spider_ad_func.php")) {
require ROOT_PATH."sources/mods/spider/mod_spider_ad_func.php";
} else {
die("Could not call required function from file 'sources/mods/spider/mod_spider_ad_func.php'<br>Does it exist?");
}
break;
}
//-- mod_spider end
if ( ! $member = @mysql_fetch_array( $query_id, MYSQL_ASSOC ) )
на:
if ( ! $member = @mysqli_fetch_array( $query_id, MYSQLI_ASSOC ) )
вот такое:
$query_id = @mysql_query("SELECT m.mgroup, m.password, m.name, m.id FROM {$db_info['tbl_prefix']}members m
WHERE m.name='".addslashes($username)."' LIMIT 1"
,$DB);
заменил на такое:
$query_id = @mysqli_query($DB, "SELECT m.mgroup, m.password, m.name, m.id FROM {$db_info['tbl_prefix']}members m
WHERE m.name='".addslashes($username)."' LIMIT 1"
);
это:
@mysql_close();
на это:
@mysqli_close($access);
прикреплю файл, т.к. еще там есть участки ipchat.php
6) jcounter.php (это файл, по-моему из мода статистики, в оригинальном IPB его нет, файл лежит в корне (где index.php)
postwarn.php (это файл, по-моему из мода предупреждений или защиты от перебора пароля Secure login - уже не помню, в оригинальном IPB его нет, файл лежит в \sources\misc\
function do_welcomepanel() {
global $DB, $ibforums, $std;
if ( $ibforums->vars['portal_welcomepanel'] )
{
if ($ibforums->member['id']) {
$DB->query("SELECT * FROM ibf_members WHERE id='".$ibforums->member['id']."'");
$member = $DB->fetch_row();
$avatar_size = $member['avatar_size'];
list($w,$h) = split("x","$avatar_size",2);
на это:
function do_welcomepanel() {
global $DB, $ibforums, $std;
if ( $ibforums->vars['portal_welcomepanel'] )
{
if ($ibforums->member['id']) {
$DB->query("SELECT * FROM ibf_members WHERE id='".$ibforums->member['id']."'");
$member = $DB->fetch_row();
$avatar_size = $member['avatar_size'];
list($w,$h) = explode("x","$avatar_size",2);
9) У кого установлен мод наград (Award mod) в Topics.php есть участок в конце функции:
// Parse the member info
//--------------------------------------------------------------
function parse_member($member=array()) {
, относящийся в данному моду:
$n = mysql_num_rows(mysql_query("SELECT * FROM ibf_awards WHERE mid='{$member['id']}'"));
if ($n > 0)
{
$member['awards'] = "Награды: <a href='{$ibforums->vars['board_url']}/index.php?act=Awards&id={$member['id']}'>$n</a>";
}
else
{
$member['awards'] = "Награды: <i>Нет</i>";
вот это хозяйство:
$n = mysql_num_rows(mysql_query("SELECT * FROM ibf_awards WHERE mid='{$member['id']}'"));
if ($n > 0)
{
$member['awards'] = "Награды: <a href='{$ibforums->vars['board_url']}/index.php?act=Awards&id={$member['id']}'>$n</a>";
}
else
{
$member['awards'] = "Награды: <i>Нет</i>";
}
в PHP 7 приводит к фатальной ошибке и для mysqli_query требуется задать еще параметры, поэтому удалил этот код:
10)
У тех, у кого установлены моды BB-кодов, Secure login (Для тех, кто не в курсе поясню, что пока (на момент написания этого поста есть сайт https://www1.rwb-essen.de/ibforen/index.php?ind=downloads&op=section_view&idev=1, где еще чего-то там кумекают по версии IPB 1.3 Прикреплю к данному посту еще файлы оттуда: Mod_mySQL5_1_0_2.zip - коррекция под MySQL 5.x . Mod_sec_update_131_2_8_0.zip - это обновление безопасности от немцев (последняя правка 14.06.2015), включающая навероты по безопасности, тот самый антибрут и пр. - ставить или не ставить - решайте сами. Update_IPB_13_131.zip - Это Обновление с IPB 1.3 до IPB 1.3.1)
Так вот, если уставолены указанные выше моды, в т.ч. мод enhanced_topics, то в файлах типа mod_enhanced_topics_install.php
найти:
$query_id = mysql_query($the_query);
if ($query_id) { mysql_free_result( $query_id ); };
11) Кстати, при тестировании на MySQL 5.7 на OpenServer необходимо в C:\OpenServer\userdata\config\MySQL-5.7_my.ini установить хотя бы:
sql-mode=""
т.е., убрать все между кавычками, иначе это будет приводить к ошибкам MySQL 5.7:
MySQL 5.7 (Apache 2.4, PHP 5.6 (еще даже!)). Так при тесте на локалке с условным именем БД ddd на индексной странице получил подарок:
mySQL query error: SELECT g.*, m.* FROM ibf_members m LEFT JOIN ibf_groups g ON (g.g_id=m.mgroup) WHERE m.last_activity >= '1471640400' AND m.mgroup <> '2' GROUP BY m.name ORDER BY m.last_activity DESC
mySQL error: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ddd.g.g_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
mySQL error code:
На showtopic получил:
mySQL query error: SELECT p.*,
m.id,m.name,m.mgroup,m.email,m.joined,m.avatar,m.avatar_size,m.posts,m.aim_name,m.icq_number,
m.signature, m.website,m.yahoo,m.integ_msg,m.title,m.hide_email,m.msnname, m.warn_level, m.warn_lastwarn,
g.g_id, g.g_title, g.g_icon, g.g_dohtml, s.login_type, s.running_time, g.g_hide_from_list, g.g_can_view_on_off
FROM ibf_posts p
LEFT JOIN ibf_members m ON (p.author_id=m.id)
LEFT JOIN ibf_groups g ON (g.g_id=m.mgroup)
LEFT JOIN ibf_sessions s ON (s.member_id=p.author_id AND s.member_id<>0 AND s.member_id IS NOT NULL)
LEFT JOIN ibf_pfields_content pc ON (pc.member_id=p.author_id)
WHERE p.topic_id=473 and p.queued != 1
GROUP BY pid ORDER BY p.post_date asc LIMIT 0, 30
mySQL error: Expression #48 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ddd.s.login_type' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
на showforum получил ошибку неявной записи:
mySQL query error: UPDATE ibf_sessions SET member_name='',member_id='0',member_group='2',login_type='0', running_time='1471718686', in_forum='332', in_topic='', location='SF,,' WHERE id='a85128f6bfeb1d83f6d48b296562257d'
mySQL error: Incorrect integer value: '' for column 'in_topic' at row 1
mySQL error code:
Постинговые, вроде, открываются. Например, вот такое: index.php?act=Post&CODE=06&f=332&t=473&p=714 При этом предпросмотр работает, а при отправке данных - ошибка БД абсолютно без информации в окне.
admin.php и индексная там - открываются. При этом страницы многих пунктов меню открываются, а, например, Настройка языковвыдает ошибку:
mySQL query error: select ibf_languages.*, count(ibf_members.id) as mcount from ibf_languages left join ibf_members on(ibf_members.language=ibf_languages.ldir) where (ibf_members.language is not null or ibf_members.language = 'en') group by ibf_languages.ldir order by ibf_languages.lname
mySQL error: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ddd.ibf_languages.lid' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
В MySQL 5.6 все работает. Как видно, в 5.7 надо решать вопросы нововведений, из-за которых идут ошибки
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.
Вопрос
dimitry
Думаю, что наступает пора заняться модернизацией кода для IPB 1.3 под PHP 7 для тех, кто до сих пор пользуется версией IPB 1.3 и не хочет с ней расставаться.
В функционале PHP 7, по-быстрому говоря, теперь не признают бывшие стандартные функции, содержащие в своем названии mysql , - теперь все функции должны идти как mysqli: это касается абсолютно всех функций будь-то mysql_query() -> mysqli_query() , mysql_fetch_row() -> mysqli_fetch_row() и даже mysql_error() -> mysql_error(). Причем, ко всему прочему, данные функции i требуют обязательного указаниия, как минимум 2-х параметров, а где-то что-то должно быть целым итд. И это только начало. Далее по порядку, попытался насколько мог подправить код, но, все равно, хочется попросить еще помощи и от участников форума.
Также необходимо, чтобы были установлены все патчи для PHP 5 (Включая PHP 5.4.x и выше из этой темы http://forums.ibresource.ru/topic/19364-php-5-direktivy-php-dlia-normalnoj-raboty-s-ipb-13/)и MySQL 5.
1)
Файл: mySQL.php - тут правок полно.
В частности, было:
Сделал так:
далее в файле:
$this->query_id = mysql_query($the_query, $this->connection_id);
заменено на:
$this->query_id = mysqli_query($this->connection_id, $the_query);
Т.е. параметры просто меняются местами.
далее:
$this->record_row = mysql_fetch_array($query_id, MYSQL_ASSOC);
заменено на:
$this->record_row = mysqli_fetch_array($query_id, MYSQLI_ASSOC);
итд по всему файлу, включая выводы ошибок. Подробно расписывать не буду - прикреплю лучше файл mySQL.php к посту, а там сами посмотрите.
mySQL.php
2)
index.php:
Там было вот такое:
в PHP 7 это приводит к постоянному ворнингу на всех страницах:
необходимо в этом классе function _info () заменить на: function __construct ()
То же самое нужно произвести практически в 85% файлах форума, где функция в классе имеет то же имя, что и сам класс (заменить функцию на function __construct ()) - проверил - работает и на версиях PHP 5.2.х и выше.
3)
index.php
Если у кого-то был установлен мод типа cookie IP ban, то
99*99*99*99 - вот это дело уже приводит к ворнингу
сделал так:
4)
admin.php:
Если у кого установлен мод учета поисковиков mod_spider, то получаем ошибку:
убираем из этого участка:
5)
ipchat.php:
заменен на:
на:
вот такое:
заменил на такое:
это:
на это:
прикреплю файл, т.к. еще там есть участки
ipchat.php
6)
jcounter.php (это файл, по-моему из мода статистики, в оригинальном IPB его нет, файл лежит в корне (где index.php)
вот такого там до черта:
переставил:
опять же, прикрепляю:
jcounter.php
7)
postwarn.php (это файл, по-моему из мода предупреждений или защиты от перебора пароля Secure login - уже не помню, в оригинальном IPB его нет, файл лежит в \sources\misc\
Файл мизерный. Вот его весь старый код:
переделал так:
8)
А вот это уже серьезно и из оригинального кода IPB:
functions.php:
Найти:
это приводит к ошибке, поэтому заменил split() на explode()
вот так:
то же для ad_member.php:
это
заменить на:
modules\mod_banka.php:
это:
на:
sources\Portal.php:
это:
на это:
9)
У кого установлен мод наград (Award mod) в Topics.php есть участок в конце функции:
, относящийся в данному моду:
вот это хозяйство:
в PHP 7 приводит к фатальной ошибке и для mysqli_query требуется задать еще параметры, поэтому удалил этот код:
10)
У тех, у кого установлены моды BB-кодов, Secure login (Для тех, кто не в курсе поясню, что пока (на момент написания этого поста есть сайт https://www1.rwb-essen.de/ibforen/index.php?ind=downloads&op=section_view&idev=1, где еще чего-то там кумекают по версии IPB 1.3
Прикреплю к данному посту еще файлы оттуда:
Mod_mySQL5_1_0_2.zip - коррекция под MySQL 5.x .
Mod_sec_update_131_2_8_0.zip - это обновление безопасности от немцев (последняя правка 14.06.2015), включающая навероты по безопасности, тот самый антибрут и пр. - ставить или не ставить - решайте сами.
Update_IPB_13_131.zip - Это Обновление с IPB 1.3 до IPB 1.3.1)
Так вот, если уставолены указанные выше моды, в т.ч. мод enhanced_topics, то в файлах типа mod_enhanced_topics_install.php
найти:
заменить на:
итп.
11)
Кстати, при тестировании на MySQL 5.7 на OpenServer необходимо в C:\OpenServer\userdata\config\MySQL-5.7_my.ini
установить хотя бы:
т.е., убрать все между кавычками, иначе это будет приводить к ошибкам MySQL 5.7:
MySQL 5.7 (Apache 2.4, PHP 5.6 (еще даже!)). Так при тесте на локалке с условным именем БД ddd на индексной странице получил подарок:
На showtopic получил:
на showforum получил ошибку неявной записи:
Постинговые, вроде, открываются. Например, вот такое: index.php?act=Post&CODE=06&f=332&t=473&p=714
При этом предпросмотр работает, а при отправке данных - ошибка БД абсолютно без информации в окне.
admin.php и индексная там - открываются. При этом страницы многих пунктов меню открываются, а, например, Настройка языков выдает ошибку:
В MySQL 5.6 все работает. Как видно, в 5.7 надо решать вопросы нововведений, из-за которых идут ошибки
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Изменено пользователем dimitryСсылка на комментарий
Поделиться на других сайтах
8 ответов на этот вопрос
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.