• Записи 162
  • Теги 66
  • Комментарии 330

Компьютерное

Решение проблемы с mysql_connect в PHP 7

Как известно, в PHP7 окончательно удалили расширение mysql, и теперь функции вида mysql_connect, mysql_query вызывают ошибку "Call to undefined function". Тем не менее, еще встречается код, который использует именно эти функции, и который, зачастую, бывает сложно быстро исправить. Заставить работать такой код на PHP7 достаточно просто — нужно определить эти функции самостоятельно и вызывать в них соответствующие функции из расширения MySQLi. Недавно столкнулся с такой ситуацией и сделал небольшой файл mysql.php, в котором объявил наиболее часто используемые функции.


Подключить его можно следующим образом:


if (version_compare(PHP_VERSION, '7.0.0','>=')) include 'mysql.php';
Прикрепленные файлы:

32 комментария:

Показать еще 2 комментария
4X_Pro
0

Да, действительно нужная функция! Добавил!

Нет
https://eax.me/
0

Привет. Просто хотел сказать спасибо за скрипт. Для работы WordPress еще не хватает:

```
function mysql_get_server_info($res) {
return mysqli_get_server_info($res);
}

```

4X_Pro
0

Добавил и эту функцию, хотя сам Wordpress не пользуюсь (и, надеюсь, никогда больше не буду).

Нет
ЗероКул
0

Спасибо! помогло.

Нет
Алексей
0

Добрый день. Я хочу перевести Joomla с PHP 5.6 на PHP 7. Когда на хостинге устанавливаю PHP 7 и меняю базу в панели Joomla на MySQLI, после входа на сайт отображается такое Call to undefined function mysql_connect(). Подскажите более подробно пожалуйста для детей, куда какие коды вставлять и как исправить ситуацию чтобы сайт заработал на PHP 7. Спасибо

4X_Pro
0

Судя по ошибке, у вас по-прежнему используется не расширение MySQLi, а просто MySQL, из-за этого и возникает проблема.
Причин может быть две: либо переход на MySQLi почему-то не произошел, либо какое-то криво написанное расширение устанавливает собственное соединение с базой, игнорируя настройки Joomla.
Чтобы проверить, произошел ли переход, откройте (по FTP) файл configuration.php и посмотрите, чему равно значение переменной: $dbtype. Там должно быть прописано public $dbtype = 'mysqli'; Если нет, исправьте это вручную.
Если не поможет, то дальше есть два варианта действия. Простой вариант — скачать файл mysql.php по ссылке выше, сохранить его в каталог, где лежит корневой index.php, а в самом index.php дописать строчку if (version_compare(PHP_VERSION, '7.0.0','>=')) include 'mysql.php'; на следующей строке после первого <?php
Более сложный вариант: отключить все дополнения, посмотреть, будет ли ошибка без них. Если нет, то включать по одному, пока ошибка не появится снова, а затем обновить/заменить это дополнение.

Нет
Гость
0

Очень помогли!!!!

Нет
Гость
0

Помогло!!!
Ещё добавь в файлик:

function mysql_data_seek($res, $val) {
return mysqli_data_seek($res, $val);
}

Нет
Гость
0

Большое спасибо! Очень помогли!

Нет
Гость
0

Буду благодарен, если подскажите, куда именно поместить фрагмент кода "if (version_compare(PHP_VERSION, '7.0.0','>=')) include 'mysql.php';". Заранее спасибо!

4X_Pro
0

Зависит от конкретного скрипта. В большинстве случаев будет вполне уместно вставить его в начало вызываемого файла (обычно это index.php в корне сайта), сразу после открывающей конструкции <?php.

Нет
Сергей
0

Спасибо большое!
Можно ещё улучшить - сделать параметры по умолчанию как у оригинальных функций.
Я столкнулся с ошибкой
PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function mysql_connect(), 4 passed in .... and exactly 5 expected in .../mysql.php:10
Поменял на
function mysql_connect($server,$username,$password,$new_link,int $client_flags = 0)

4X_Pro
0

Сделал. Просто в PHP 7.0, на котором я этот файл тестировал, несовпадение числа параметров давало самый обычный warning. И только сейчас узнал, что в последующих версиях это уже fatal error.

Нет
Егор
0

Спасибо автору, помог. В bitrix скрипт

if (version_compare(PHP_VERSION, '7.0.0','>=')) include 'mysql.php';


нужно подключать в файле "/bitrix/php_interface/init.php"

dev.1c-bitrix.ru/learning/course/index.php?...
Нет
Егор
0

Увы решение оказалось не идеальным. Встречаю MySQL Query Error: [] или зависание запроса. Может по 5 секунд "думать" на некоторые запросы.

4X_Pro
0

Скорее всего, не хватает каких-то функций, так как в файле есть только самые востребованные. Включите error_reporting(E_ALL) и либо display_errors, либо посмотрите по логам, на что ругается.

Нет
free6k
0

туда же, старый SypexDumper например требует

function mysql_set_charset ($charset, $link_identifier = NULL) { if ($link===NULL) $link=$GLOBALS['mysql_oldstyle_link']; return mysqli_set_charset($link, $charset); }

4X_Pro
0

Добавил!

Нет
Евгений
0

Огромное вам человеческое спасибо! Мне надо было перевести сайт с php4 на php7, все получилось. Пришлось кое-что добавить в файл не касающееся БД. Сейчас правлю только мелкие косяки. Сама идея гениальная, я уж было хотел лопатить все файлы на компиляторе.

Нет
Евгений
0

Помогите пожалуйста, остался один глюк - не могу его решить.
Строка с коментами разраба ПО, но он сейчас не доступен, да и давно это было.
ereg_replace("\r\n","<Br>",html_entity_decode($db_sect['name'],ENT_QUOTES));
Если просто поменять ereg_replace на preg_replace ошибку не выдает, но текстовую строку не показывает, а должен.
/// echo "<Span Class=\"text-night\" Style=\"FONT-WEIGHT:normal;\">".$sectdata."</Span>\n";

4X_Pro
0

Лушче бы на форуме отдельную тему создать, ну да ладно.

В preg_replace строку с регулярными выражениями нужно обрамлять какими-либо небуквенными символами (как и в Perl, откуда регулярные выражения и пришли). Обычно используется либо /, либо |. Т.е. нужно писать так: preg_replace("|\r\n|","<br>",html_entity_decode($db_sect['name'],ENT_QUOTES));
Но вообще, для этого есть встроенная функция nl2br, которая работает куда быстрее, чем регулярные выражения, а кроме того, такое можно и через str_replace сделать.
Нет
Гость
0

есть PHP 7.4 и старый сайт, который писался для php 5 в sql.safe_mode = true.
функция mysql_connect там вызывается только с 3-мя параметрами, четвертый в сейфмоде sql не учитывался.
Fatal error: Uncaught ArgumentCountError: Too few arguments to function mysql_connect(), 3 passed in /home/... and at least 4 expected in /home/...mysql.php:10
что cделать? сорри я не программер)

4X_Pro
0

В четвертый параметр прописать значение false.
Или, как вариант, в моём файле привести заголовок функции mysql_connect к такому виду:

function mysql_connect($server,$username,$password,$new_link=false,$client_flags=0) {


Нет
Гость
0
4X_Pro, Здравствуйте подключили как и сказали но вот что пишет

Fatal error: Uncaught Error: Call to undefined function mysql_result() in /var/www/x_u_3592/data/www/sait/index.php:28 Stack trace: #0 {main} thrown in /var/www/x_u_3592/data/www/sait/index.php on line 28



Код из 28строки

count_site = mysql_result(mysql_query("SELECT COUNT(*) FROM `site` WHERE `id_category` = '".$category['id']."' AND `mod` = '1' AND `ban` = '0'"),0); $sql_count++;

4X_Pro
0

В файле есть не все функции, а только самые часто употребляемые. Прямого аналога mysql_result в MySQLi нет, но можно сделать что-то такое:

function mysql_result($res,$offset,$field=0) {   mysqli_data_seek($res,$offset);   mysqli_field_seek($res,$field);   return mysqli_fetch_field($res); }


Нет
vPro
0

все подключил вылезли ошибки:

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:\OpenServer\domains\adminltenew\pages\magdalena\auth\mysql_new.php on line 75 Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:\OpenServer\domains\adminltenew\pages\magdalena\auth\mysql_new.php on line 75 Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\OpenServer\domains\adminltenew\pages\magdalena\auth\mysql_new.php on line 17 Warning: mysqli_error() expects parameter 1 to be mysqli, null given in C:\OpenServer\domains\adminltenew\pages\magdalena\auth\mysql_new.php on line 58 Mysql error: Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\OpenServer\domains\adminltenew\pages\magdalena\auth\mysql_new.php on line 17 Warning: mysqli_error() expects parameter 1 to be mysqli, null given in C:\OpenServer\domains\adminltenew\pages\magdalena\auth\mysql_new.php on line 58 Mysql error:



Подскажите где копать?
4X_Pro
0
vPro, проверить, получается ли установить соединение с базой, и что попадает в глобальную переменную $GLOBALS['mysql_oldstyle_link']. Так как судя по всему, сейчас там NULL, а такое обычно бывает при ошибке соединения с БД.
Нет
seoonly.ru
0

норм тема)!

Нет
Эмиль
0

Чувак ты гений,мучался 2 дня . Спасибо огромное тебе

Нет
Гость
0

еще бы хорошо добавить в этот файл:
#define MYSQL_NUM = MYSQLI_NUM;

Написать комментарий


Задать вопрос