Call to undefined function eregi

Полет нормальный. Без происшествий.

Переход на PHP7: работа над ошибками

Итак, у вас есть старенький, но уж очень милый сердцу сайт, который вы решаетесь из жалости (или, возможно, перечитав Хабра) перевести на PHP7. С волнением ожидая резкого роста производительности, вы смахиваете пыль с бедного сайта и решительно переключаете в панели управления хостингом версию PHP.

Если сайт уже давно не молод, то с большой долей вероятности чудо не произойдет. В лучшем случае начнут появляться разного рода ошибки, а в худшем — вы увидите белый экран, дзен веб-разработки. В этот момент хочется по-быстрому переключить все обратно и забыть о своей внезапной слабости.

Но предположим, что ваша сильная сторона — настойчивость, к тому же вы располагаете некоторым количеством времени для экспериментов. Давайте попробуем все починить.

Резервные копии

Делаем резервные копии сайта (а заодно и баз данных). Ведь кто не делает резервные копи — сам себе враг, верно? Для разного рода экспериментов имеет смысл добавить еще один сайт на хостинге и скопировать в него файлы, которые мы сейчас будем править.

Журналы ошибок

Настроим ведение журнала ошибок PHP в файл .htaccess (если он не был настроен ранее):

php_value display_errors 0
php_value log_errors 1
php_value error_log /home/vasya/domains/mysite.ru/logs/error.log

Работа с MySQL

Допустим, сайт использует базы данных, и вы видите ошибки вроде такой:

Fatal error: Uncaught Error: Call to undefined function mysql_connect()

Это оттого, что в современных версиях PHP (начиная с PHP 5.5.0) оригинальное расширение MySQL не поддерживается. Разработчики рекомендуют использовать MySQLi или PDO. Попробуем перейти на MySQLi, это просто:

Читайте также:  Как закрыть профиль в обновленном инстаграме

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

$link = mysql_connect(‘localhost’, $user, $password)
mysql_select_db($dbname, $link)
mysql_query(‘set names cp1251’)

можно заменить на:

$link = mysqli_connect(‘localhost’, $user, $password, $dbname)
mysqli_query($link, ‘set names cp1251’)

Другие популярные функции легко меняются на их аналоги с буквой ‘i’:

mysqli_fetch_array()
mysqli_fetch_row()
mysqli_fetch_assoc()
mysqli_fetch_array()
mysqli_num_rows()
mysqli_insert_id()
mysqli_close()

В результате этих несложных действий данные из БД должны успешно собираться и отправляться.

Кодировка

Настоящий олдскул — это сайт в CP1251 (как минимум). Всё превратилось в ромбики или прочие козяблики?

Скорее всего, достаточно будет указать кодировку в .htaccess таким образом:

php_value default_charset «cp1251»

Регулярные выражения

Также вы можете наблюдать ошибки следующего рода:

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

Это означает, что модификатор /e, который позволял передать произвольной функции результат регулярного выражения, теперь не поддерживается. В таких случаях рекомендуется использовать функцию preg_replace_callback

Допустим, у нас есть такое регулярное выражение:

с заменой на preg_replace_callback оно должно выглядеть вот так:

$string=preg_replace_callback(«/:([a-z]<1,10>):/», create_function(‘$matches’, ‘return print_smile($matches[1])’), $string)

здесь все просто, регулярное выражение теперь указывается в качестве первого аргумента (без модификатора /e, разумеется), а в качестве второго аргумента указывается анонимная функция (которая будет выполнена после применения регулярного выражения) с двумя аргументами: массив $matches, где будут сохранены данные, совпадающие с регулярным выражением и вызов внешней функции с аргументами. В данном примере внешняя функция называется print_smile и ей передается аргументом первое найденное вхождение. То, что в preg_replace было \1 (первое найденное вхождение) станет $matches[1] (если аргументов было больше, то будет $matches[2], $matches[3] и так далее).

Читайте также:  Как пользоваться картридером на компьютер

Вот еще один пример, посложнее:

$out=preg_replace_callback(‘/ (.*?) /s’, create_function(‘$matches’, ‘return feed_out_sub_rm($matches[2], «‘.$base_prefix.’», «‘.$nick.’», «‘.$id_entry.’») ‘), $out)

здесь легко запутаться в кавычках, будьте внимательны.

Копаясь в регулярных выражениях, можно вспомнить еще про две функции, которые с версии PHP 5.3.0 считаются устаревшими (и не поддерживаются). Симптомы следующие:

Fatal error: Uncaught Error: Call to undefined function ereg_replace()

Если регулярное выражение в ereg_replace простое, то можно обойтись просто установкой граничных символов, как здесь:

Fatal error: Uncaught Error: Call to undefined function split()

Если регулярное выражение посложнее, то пробуем преобразовать к preg_split.

На этом пока все. Удачной отладки.
Много полезных материалов по теме можно найти на сайте разработчиков.

Если что-то не получается, или ваш случай совсем не похож на наши примеры — пишите комментарии, попробуем разобраться вместе.

Для того, чтобы оставлять комментарии к посту, авторизуйтесь, используя свой аккаунт в социальных сетях ВКонтакте/FaceBook, или аккаунт в Google/Яндекс.

below code is giving me the fatal error in php 7

is there any way to make it compatible with php 7?

2 Answers 2

Switch to preg_replace Docs and update the expression to use preg syntax (PCRE) instead of ereg syntax (POSIX) where there are differences Docs (just as it says to do in the manual for ereg_replace Docs ).

Your above code should be this way:

ereg_replace function was DEPRECATED in PHP 5.3.0, and REMOVED in PHP 7.0.0. So you must have to use preg_replace() function instead of ereg_replace()

Linked

Related

Hot Network Questions

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.1.10.35756

Читайте также:  Лучшие игры на плейстейшен 4 2018

Тут мы заменили функцию preg_replace(), на preg_replace_callback(), удалили модификатор e в первом аргументе, которым является регулярное выражение. Второй аргумент заменили анонимной функцией, которая будет выполнятся после применения регулярного выражения. Анонимная функция содержит массив $match , элементы массива заменяют совпадения, например, было: $1 , стало: $match[1] ; было: $2 , стало: $match[2] , и так далее. Убрали кавычки и символ экранирования (обратный слеш ).

В завершении об ошибки несуществующего модификатора e , покажу ещё пару примеров замены кода. Строку:

Устаревшая функция ereg_replace()
Как сообщил официальный сайт PHP: http://php.net/:

То есть: ereg_replace заменили на: preg_replace, в начало и конец регулярного выражения добавили слеши.
Тоже самое и с функцией ereg.

Замена MYSQL_* на MYSQLI_*
Функции mysql_* уже давно были объявлены устаревшими, а в PHP 7 они удалены, есть mysqli_*, вот на эти функции и будем менять.
И так, например, сейчас у нас такой код: