20 Ноября 2017, 16:44:54

Автор Тема: Последствия обновления PHP до 5.4.38  (Прочитано 4649 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alin12345

  • Ветеран
  • *****
  • Сообщений: 543
  • Репутация: 13
  • Пол: Мужской
После обновления PHP до 5.4.38 перестал работать сайт (DLE 9.0) и появилась ошибка "Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /home/vshosts/hosts/u18908/valiza.ru/www/engine/classes/mysqli.class.php on line 162"

mysql_escape_string - функция устарела, нужно использовать - mysql_real_escape_string

Как исправить без обновления движка?

Оффлайн -DRUM-

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 560
  • Репутация: 182
  • Пол: Мужской
  • Поехали!
    • Бесплатный хостинг от "Интернет Обсерватории"
Re: Последствия обновления PHP до 5.4.38
« Ответ #1 : 02 Марта 2015, 00:23:06 »
Смотрим, что об этом думают разрабы https://php.net/manual/ru/function.mysql-escape-string.php где пишут, что теперь нужно использовать mysql_real_escape_string().

Так же окончательно было отменено несколько функций:
Цитировать
call_user_method() использовать call_user_func()
call_user_method_array() использовать call_user_func_array()
ereg() использовать preg_match()
ereg_replace() использовать preg_replace()
eregi() использовать preg_match() с модификатором "i"
eregi_replace() использовать preg_replace() с модификатором "i"
set_magic_quotes_runtime() использовать magic_quotes_runtime()
session_register() использовать $_SESSION
session_unregister()  использовать $_SESSION
session_is_registered() использовать $_SESSION
set_socket_blocking() использовать stream_set_blocking()
split() использовать preg_split() или explode()
spliti() использовать preg_split() с модификатором "i"
mysql_db_query() использовать mysql_select_db() и mysql_query()
mysql_escape_string() использовать mysql_real_escape_string()

Примеры:
Код: (до) [Выделить]
if (eregi('^new\=([a-z0-9]+)', $_GET['src'], $matches)) {
Код: (после) [Выделить]
if (preg_match('/^new\=([a-z0-9]+)/i', $_GET['src'], $matches)) {
Код: (до) [Выделить]
if (eregi('^(f|ht)tps?://', $_GET['src'])) {
Код: (после) [Выделить]
if (preg_match('~^(f|ht)tps?://~i', $_GET['src'])) {
Код: (до) [Выделить]
if (ereg('^'.preg_quote($nice_docroot).'(.*)$', $nice_cachefile, $matches)) {
Код: (после) [Выделить]
if (preg_match('/^/'.preg_quote($nice_docroot).'(.*)$', $nice_cachefile, $matches)) {
Код: (до) [Выделить]
return ereg_replace('2037' . '$', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
Код: (после) [Выделить]
return preg_replace('/2037$/', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
Код: (до) [Выделить]
$str = split("\n",$which_text);
Код: (после) [Выделить]
$str = explode("\n",$which_text);
Код: (до) [Выделить]
$pieces = split('[[:space:]]+', $search_str);
Код: (после) [Выделить]
$pieces = preg_split('/[[:space:]]+/', $search_str);
Код: (до) [Выделить]
$temp_array = split($needle, $string);
Код: (после) [Выделить]
$temp_array = preg_split('/' . $needle . '/', $string);
Код: (до) [Выделить]
set_magic_quotes_runtime(0);
Код: (после) [Выделить]
ini_set("magic_quotes_runtime", 0);
Код: (до) [Выделить]
...
$mqr=get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
...
set_magic_quotes_runtime($mqr);
...
Код: (после) [Выделить]
...
//$mqr=get_magic_quotes_runtime();
ini_set("magic_quotes_runtime", 0);
...
//set_magic_quotes_runtime($mqr);

Почти всегда используется слеш / в качестве экрана. Но иногда он не срабатывает и появляется ошибка
Warning:preg_match() [function.preg-match]: Unknown modifier 'тут_любая_буква_или_знак' in home/.../файл.phpВ таких случаях используйте в качестве экрана ~…~ (или ~…~i) , вместо /…/ (или /…/i).

Такие предупрежденияPHP Deprecated:  Assigning the return value of new by reference is deprecated in
PHP Deprecated:  Call-time pass-by-reference has been deprecated in
говорят, что в функциях используется амперстанд &, его надо удалить:
Код: (до) [Выделить]
$contentElement =& new ContentElement( $xmlDoc );
Код: (после) [Выделить]
$contentElement = new ContentElement( $xmlDoc );
Код: (до) [Выделить]
preg_match_all( $pattern, $text, &$links, PREG_SET_ORDER );
Код: (после) [Выделить]
preg_match_all( $pattern, $text, $links, PREG_SET_ORDER );
//set_magic_quotes_runtime($mqr);

Если после замены mysql_escape_string() на mysql_real_escape_string() получаете:
Warning: mysql_real_escape_string(): A link to the server could not be established in...проверяйте код, т.к. обязательно перед этой функцией должна идти фукнция открытия соединения с базой.
« Последнее редактирование: 02 Марта 2015, 00:23:37 от -DRUM- »
billing.intobs.ru

Оффлайн PolarWolf

  • Песец когда песцы
  • Администратор
  • Ветеран
  • *****
  • Сообщений: 884
  • Репутация: 36
  • Пол: Мужской
    • BlogOfCoder.RU - блог начинающего кодера
Re: Последствия обновления PHP до 5.4.38
« Ответ #2 : 02 Марта 2015, 07:41:46 »
Да, и переходите на mysqli/pdo
При появлении каждой неправильной заявки на ИО умирает один белый пушной зверек. Пожалей песцов :'(
CSTLeague

Оффлайн Alexz

  • Администратор
  • Пользователь
  • **
  • Сообщений: 62
  • Репутация: 6
  • Пол: Мужской
    • FREE-BP.RU - Бесплатные книги о ПК
Re: Последствия обновления PHP до 5.4.38
« Ответ #3 : 02 Марта 2015, 12:38:21 »
После обновления PHP до 5.4.38...
Как исправить без обновления движка?

Попробуйте это:

НАЧИНАЕМ
engine\classes\mysqli.class.php изменить следующие
строчки

function safesql( $source )
{
if ($this->db_id) return
mysqli_real_escape_string ($this->db_id,
$source);
else return mysql_escape_string($source);
}

На это
function safesql( $source )
{
if ($this->db_id) return
mysqli_real_escape_string ($this->db_id,
$source);
else return ($source);
}

ДАЛЕЕ
Заходим \upload\engine\inc\dumper.php

Ищем
$row[$k] = isset($row[$k]) ? "'" .
mysql_escape_string($row[$k]) . "'" :
"NULL";

Заменяем на
$row[$k] = isset($row[$k]) ? "'" .
mysql_real_escape_string($row[$k]) .
"'" : "NULL";
« Последнее редактирование: 02 Марта 2015, 12:39:28 от Alexz »
FREE-BP.RU - Бесплатные компьютерные книги и журналы о ПК

Оффлайн Alexz

  • Администратор
  • Пользователь
  • **
  • Сообщений: 62
  • Репутация: 6
  • Пол: Мужской
    • FREE-BP.RU - Бесплатные книги о ПК
Re: Последствия обновления PHP до 5.4.38
« Ответ #4 : 02 Марта 2015, 23:43:49 »
Кстати, а что мешает обновить движок? Модулей вроде нет никаких.
Да и дизайн, собственно говоря, нуждается в обновлении... Регистрация вообще не пашет...
« Последнее редактирование: 02 Марта 2015, 23:44:25 от Alexz »
FREE-BP.RU - Бесплатные компьютерные книги и журналы о ПК

Оффлайн -DRUM-

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 560
  • Репутация: 182
  • Пол: Мужской
  • Поехали!
    • Бесплатный хостинг от "Интернет Обсерватории"
Re: Последствия обновления PHP до 5.4.38
« Ответ #5 : 03 Марта 2015, 15:04:28 »
Ну, может alin12345 хочет по разбираться с тем, что и как работает "изнутри".
Думаю, будет полезной вот эта статья .
billing.intobs.ru

Оффлайн alin12345

  • Ветеран
  • *****
  • Сообщений: 543
  • Репутация: 13
  • Пол: Мужской
Re: Последствия обновления PHP до 5.4.38
« Ответ #6 : 03 Марта 2015, 17:07:48 »
Проблема решена обновлением до 9.7
Всем спасибо!
Alexz изменения в engine\classes\mysqli.class.php я пробовал сразу-же - не помогло.
-DRUM- отдельное спасибо.  "разбираться с тем, что и как работает "изнутри" это для меня очень сложно.
В процессе настройки движка и шаблона ещё будут вопросы – буду спрашивать.