Проблема, с которой сталкиваются многие программисты после перевода площадки на современную версию PHP, — вероятная полная или частичная потеря работоспособности программного обеспечения на одном или нескольких сайтах площадки. Не предавайтесь панике, всё решаемо!

Использование функций mysql_connect(), mysql_select_db(), mysql_query() и т.д.

В PHP 7 разработчики отказались от расширения mysql, все использования функций расширения приводят к фатальной ошибке (Call to undefined function).

Использование функций mysql_connect(), mysql_select_db(), mysql_query() и т.д.
Использование функций mysql_connect(), mysql_select_db(), mysql_query() и т.д.

Как заменить неработающие функции mysql_connect(), mysql_select_db(), mysql_query()? Ошибка «PHP Fatal Error: Call to undefined function»

Решения проблемы есть и даже не одно!

Есть достойная альтернатива mysql — расширение mysqli. Функции расширения соответствуют старым (большая часть):

mysqli_fetch_array() //расширение mysqli
mysql_fetch_array()  //расширение mysql

1. Если у вас небольшой проект, вам будет несложно через поиск найти несколько строк в коде с функциями, начинающимися с «mysql_*» расширения mysql. Вручную отредактируйте код, заменив «mysql_*» на «mysqli_*».

2. Если у вас большой проект или вы очень активно пользовались функциями расширения mysql, вам будет непросто поменять все упоминания устаревших функций. В таком случае вам поможет следующее решение. Создайте PHP-файл, в котором определите функции с именами исключённых, которые будут ссылаться на соответствующие функции расширения mysqli.

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

<?
function mysql_connect($server, $username, $password, $new_link = NULL, $client_flags = NULL) {
  $GLOBALS['mysql_oldstyle_link'] = mysqli_connect($server, $username, $password);
  return $GLOBALS['mysql_oldstyle_link'];
 }
function mysql_query($sql) {
  return mysqli_query($GLOBALS['mysql_oldstyle_link'], $sql);
 }
function mysql_fetch_row($res) {
  return mysqli_fetch_row($res);
 }
function mysql_fetch_assoc($res) {
  return mysqli_fetch_assoc($res);
 }
function mysql_fetch_array($res) {
  return mysqli_fetch_array($res);
 }
function mysql_fetch_object($res) {
  return mysqli_fetch_object($res);
 }
function mysql_affected_rows($link = NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_affected_rows($link);
 }
function mysql_insert_id($link = NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_insert_id ($link);
 }
function mysql_select_db($database_name) {
  return mysqli_select_db($GLOBALS['mysql_oldstyle_link'], $database_name);
 }
function mysql_errno($link = NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_errno($link);
 }
function mysql_error($link = NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_error($link);
 }
function mysql_num_rows($res) {
  return mysqli_num_rows($res);
 }
function mysql_free_result($res) {
  return mysqli_free_result($res);
 }
function mysql_close($link) {
  return mysqli_close($link);
 }
function mysql_real_escape_string($sql, $link = NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_real_escape_string($link, $sql);
 }
function mysql_get_server_info($link = NULL) {
  if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link'];
  return mysqli_get_server_info($link);
 }
 ?>

Данный код сохраните в файл, назовите его, например, deletedmysql.php и сохраните в корне сайта (на одном уровне с index.php главной страницы сайта).

В каждый PHP-файл, в котором встречается ошибка, добавьте строку в самое начало файла, после открывающего кода:

<?
include_once 'deletedmysql.php';
/* далее старый PHP-код */

Совсем идеально будет добавить проверку на версию PHP, так как при переезде на другую площадку или понижении версии PHP до 5.x вы получите ошибку PHP: Fatal error: Cannot redeclare…

if (version_compare(PHP_VERSION, '7.0.0', '>=')) include_once 'deletedmysql.php';

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


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

В PHP 7 функция spit() — разбиение строки на массив по регулярному выражению, — была исключена. Альтернатива есть, функции preg_split(), str_split(), explode().

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

В приведённом примере разбить командную строку можно любой функцией. Лично я предпочитаю explode().

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

пять × 4 =

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.