Форумы » Webserv24.com - Панель управления хостингом »

Исправление проблем в php5.3 и php5.4



363
Максим
Выкладывает решения проблем и ошибок возникшие при переносе сайта от версии php5.2 на версию php5.3 / php5.4
363
Максим
Движок - Joomla

Ошибка: Warning: Parameter 1 to modMainMenuHelper::buildXML() expected to be a reference
Не отображается главное меню
Решение:
Ищем файл: modules/mod_mainmenu/helper.php
Меняем это:
function buildXML(&$params)
на это:
function buildXML($params)
363
Максим
Fatal error: Cannot redeclare quoted_printable_encode() in C:\home\test.ru\www\index.php on line 60

Функция с именем quoted_printable_encode уже есть в PHP 5.3+ . Если Вы хотите написать свою заглушку для PHP ниже 5.3, тогда:


[quote]if (!function_exists('quoted_printable_encode')) {
function quoted_printable_encode(...) {
...
}
}[/quote]
363
Максим
Warning: Parameter 3 to showItem() expected to be a reference, value given in /home/.../.../.../includes/Cache/Lite/Function.php on line 100

Исправление, меняем
1.
это: $result = call_user_func_array(array($class, $method), $arguments);
на это:$result = call_user_func_array(array($class, $method), &$arguments);

2.
это: $result = call_user_func_array(array($$object_123456789, $method), $arguments);
на это: $result = call_user_func_array(array($$object_123456789, $method), &$arguments);

3.
это: $result = call_user_func_array($target, $arguments);
на это: $result = call_user_func_array($target, &$arguments);

Еще одна распространенная ошибка
Warning: call_user_func_array() expects parameter 2 to be array, null given in /home/user/domain.ru/libraries/joomla/cache/cache.php on line 143
Warning: call_user_func_array() expects parameter 2 to be array, null given in /home/user/domain.ru/libraries/joomla/session/session.php on line 272
В обоих файлах исправляется одинакого:
это: if(call_user_func_array( array( trim($class), 'test' ), [b]null[/b]))
на это: if(call_user_func_array( array( trim($class), 'test' ), [b]array()[/b]))


Отредактировано Максим - 16.06.2013
363
Максим
сегодня столкнулся еще с такой ошибкой
движок joomla
компонент - Savant

[quote]Warning: Parameter 1 to Savant2_Plugin_ahrefreview::plugin() expected to be a reference, value given in /home/.../.../.../components/com_mtree/Savant2.php on line 1127[/quote]
решение
идет в [b]/components/com_mtree/Savant2/[/b]
там есть файлы с началом - Savant2_Plugin_***
открываем файл и находим параметр -[b] function plugin( &$link, ............ )[/b]
удаляем символ [b]&[/b]
и так пробегаем все файлы Savant2_Plugin_***
363
Максим
[b]Заменяем ereg на preg_match[/b]

Теперь разработчики в срочном порядке исправляют свой код заменяя функции ereg, eregi, ereg_replace, ereg_replacei соответствующими PCRE аналогами, благо замена получилась довольно простой:

1. заменить ereg и eregi на preg_match, ereg_replace и ereg_replacei на preg_replace;
2. добавить // разделители в начало и конец регулярного выражения;
3. если POSIX функция кончается на i (eregi, ereg_replacei) то добавить i в конец регулярного выражения после разделителя.
4. заменить POSIX спецсимволы соответствуюущими PCRE аналогами: [:alnum:] - \w или [0-9a-z], [:digit:] - \d или [0-9], [:space:] - \s, [:alpha:] - [a-z]

примеры:

ereg('expression') -> preg_match('/expression/')

eregi('expression') -> preg_match('/expression/i')

eregi('^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$') -> preg_match('/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i')

eregi("/", $val) -> preg_match("/\//i", $val)
или лучше такой вариант:
eregi("/", $val) -> substr_count($val,"/")

eregi_replace('/filter/([0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+)', '', url::current()) -> preg_replace('/\/filter\/([0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+)/i', '', url::current())
eregi('finance/pincode', url::current()) -> preg_match('/finance\/code/i', url::current())


Отредактировано Максим - 11.02.2013
363
Максим
Deprecated: Function set_magic_quotes_runtime()

находим в вашем скрипте строку:
set_magic_quotes_runtime(0);

и заменяем её на:
ini_set("magic_quotes_runtime", 0);
363
Максим
Функция split() устарела.
Решение
вместо split напишите explode
6600
admiral
Ошибка Joomla 1.5 + на php 5.3:
[b]Warning: Parameter 1 to JHTMLGrid::access() expected to be a reference, value given in /home/user/site.ru/libraries/joomla/html/html.php on line 87[/b]
Открываем файл libraries\joomla\html\html.php и начиная со строки 87 заменяем эту часть кода:
[code]if (is_callable( array( $className, $func ) ))
{
$args = func_get_args();
array_shift( $args );
return call_user_func_array( array( $className, $func ), $args );
}
else
{
JError::raiseWarning( 0, $className.'::'.$func.' not supported.' );
return false;
}[/code]
На это:
[code]if (is_callable( array( $className, $func ) ))
{
$temp = func_get_args();
array_shift( $temp );
$args = array();
foreach ($temp as $k => $v) {
$args[] = &$temp[$k];
}
return call_user_func_array( array( $className, $func ), $args );
}
else
{
JError::raiseWarning( 0, $className.'::'.$func.' not supported.' );
return false;
}[/code]
6600
admiral
[quote=Максим]Функция split() устарела.
Решение
вместо split напишите explode[/quote]
Если в функции split() используются регулярные выражения, то можно попробовать заменить её на [url=http://php.net/manual/ru/function.preg-split.php]preg_split[/url] а не на explode, в некоторых случаях помогает исправить ошибки
6600
admiral
Часто при установки старых скриптов на php5.3 можно увидить предупреждения начинающиеся с:
[quote]Deprecated: ...[/quote]
Что такок депрекация читаем тут - http://ru.wikipedia.org/wiki/Депрекация
Самое простое решение это скрыть эти предупреждения в файле .htaccess, добавив где нибудь в верху этого файла пару строк:
[quote]php_flag display_errors off
php_flag log_errors off[/quote]
Но такое решение может скрыть реальные ошибки, поэтому не забываем что отключаем и не всегда именно это решение может являться правильным, а устранение этих предупреждений иногда занимает достаточно много времени

PS незабывайте обновлять скрипты, если они поддерживаются разработчиками.
363
Максим
joomla

Deprecated: Assigning the return value of new by reference is deprecated in /home/LOGIN/DOMAIN/lib/kernel.php on line 94

открывает файл в текстовом редакторе
находим строку 94
TClasses::$instances[$ClassName] = &new $ClassName ();
удаляем символ &

получается так
TClasses::$instances[$ClassName] = new $ClassName ();
сохраняем

PS это касается всех предупреждений типа [b]Deprecated: Assigning the return value of new by reference is deprecated[/b]


Отредактировано Максим - 26.11.2012
6600
admiral
Избавляемся от сообщений вида:
1. [b]Deprecated: Assigning the return value of new by reference is deprecated in /home/user/путь_до_файла.php on line 42[/b]
Ищем файл /home/user/путь_до_файла.php, строку в нем - on line [b]42[/b] и удаляем в этой строку знак [b]&[/b]

2. [b]Deprecated: Function call_user_method() is deprecated in /home/user/путь_до_файла.php on line 101[/b]
Смотрим строку на которую выдается сообщение - on line [b]101[/b] и заменяем в ней функцию call_user_method на аналогичную для php5.3 - call_user_func c соблюдением синтаксиса, например:
elseif($this->isAction(index)) call_user_method(index,$this);
заменяем на:
elseif($this->isAction(index)) [color=red]call_user_func(array[/color]([color=red]&[/color]$this, index)[color=red])[/color];
Тут перед первой переменной ($this) ставится [b]&[/b], переменная пишется впереди, параметр (index) должен быть после переменных

Еще один пример:
if($this->isAction($method_name)) $this->set($method_name,call_user_method($method_name,$this));
Заменяем на:
if($this->isAction($method_name)) $this->set($method_name,[color=red]call_user_func(array[/color]([color=red]&[/color]$this, $method_name)[color=red])[/color]);
363
Максим
[color=red][b]Проблема с php 5.4[/b][/color]


Strict Standards: Only variables should be assigned by reference in /home/логин/папка-домена/engine/aApplication.php on line 22

Решение

открываем engine/aApplication.php строки 22, 23, 24

[code] $this->page =& Page::getInstance();
$this->user =& $this->page->getUser();
$this->cache =& Cache::getInstance();[/code]
удаляем [b]&[/b]

[b]Проблема в скриптах Magento[/b]

Находим файл: lib/Zend/Db/Select.php

ЗАМЕНЯЕМ:

[code]$correlationName = current(array_keys($this->_parts[self::FROM]));[/code]
НА:

[code]$arrayKeys = array_keys($this->_parts[self::FROM]);
$correlationName = current($arrayKeys);[/code]
363
Максим
[color=red][b]Проблема php5.4[/b][/color]

[b]Fatal error: 'continue' operator with non-constant operand is no longer supported in /home/USER/DOMAIN.ru/wp-content/themes/ШАБЛОН/functions.php on line 67
[/b]

Был

foreach( $_POST['extra'] as $key=>$value ){
[b] if( empty($value) )
continue delete_post_meta($post_id, $key);[/b]
update_post_meta($post_id, $key, $value);
}

Исправляем

foreach( $_POST['extra'] as $key=>$value ){
[b] if( empty($value) ) {delete_post_meta($post_id, $key); continue; }[/b]
update_post_meta($post_id, $key, $value);
}
6600
admiral
[b][color=red]Проблема php5.4[/color][/b]

[b]Strict Standards: Declaration of JParameter::loadSetupFile() should be compatible with JRegistry::loadSetupFile() in /home/user/domain.ru/libraries/joomla/html/parameter.php on line 0[/b]

Находим в файле [b]/home/user/domain.ru/libraries/joomla/html/parameter.php[/b] функцию [b]function loadSetupFile[/b] и исправляем:
[quote]public function loadSetupFile($path)[/quote]
на:
[quote]public function loadSetupFile($path[color=red]=null[/color])[/quote]
6906
Render
[color=red][b]Проблема php5.4[/b][/color]

Плагин [b]wp-pagenavi[/b] в cms [b]Wordpress[/b] выдаёт ошибку:
Strict Standards: Declaration of PageNavi_Options_Page::validate() should be compatible with scbAdminPage::validate($new_data, $old_data) in /home/user/domain.ru/wp-content/plugins/wp-pagenavi/admin.php on line 0

в файле [b]/home/user/domain.ru/wp-content/plugins/wp-pagenavi/admin.php[/b]
[quote]function validate( $options ) {[/quote]
заменить на
[quote]function validate( $new_data, $old_data ) {
$options = wp_parse_args($new_data, $old_data);[/quote]
6906
Render
[color=red][b]Проблема php5.4[/b][/color]

Ошибка в старых версиях DLE < 10.
[b]Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /home/user/domain.ru/engine/classes/mysqli.class.php on line 162[/b]

Находим в файле строки
[quote]function safesql( $source )
{
if ($this->db_id) return mysqli_real_escape_string ($this->db_id, $source);
else return mysql_escape_string($source);
}[/quote]
заменяем на

[quote]function safesql( $source )
{
if ($this->db_id) return mysqli_real_escape_string ($this->db_id, $source);
else return mysql_real_escape_string($source);
}[/quote]
[color=blue]в случае если после замены появляется ошибка:[/color]
[quote]Warning: mysql_real_escape_string(): Access denied for user ''@'localhost' (using password: NO) in /home/user/domain.ru/engine/classes/mysqli.class.php on line 162 Warning: mysql_real_escape_string(): A link to the server could not be established in /home/user/domain.ru/engine/classes/mysqli.class.php on line 162[/quote]
заменить тогда на
[quote]function safesql( $source ) {
if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST);

if ($this->db_id) return mysqli_real_escape_string ($this->db_id, $source);
else return addslashes($source);
}[/quote]
363
Максим
[color=red][b]Проблема php5.4[/b][/color]

[b] Fatal error: Call-time pass-by-reference has been removed in /home/user/domain.ru/plugins/content/jw_disqus/jw_disqus.php on line 40[/b]

Открываем файл [b]/home/user/domain.ru/plugins/content/jw_disqus/jw_disqus.php[/b] находим строку [b]40[/b]
[code]$this->onContentPrepare('com_content.article', &$row, &$params, $limitstart );[/code]
Удаляем символ [color=red][b]&[/b][/color]

[code]$this->onContentPrepare('com_content.article', $row, $params, $limitstart );[/code]

Это закрытая тема - нельзя отправлять сообщения.

© 2008-2020 vmeste.eu
Контакты | Группа | Privacy и Cookie | Правила