• Записи 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 комментария:

Показать еще 10 комментариев
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;

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


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