Как сделать, чтобы Sypex Dumper работал с MySQLi InnoDB на PHP 7

Sypex Dumper 2.0.11 не работает под PHP 7.0, из-за того, что седьмой Похапе не поддерживает MySQL, а SXD поддерживает только это расширение. Исправить это не просто, а очень просто.

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

error_reporting(0);

В подтверждение того, что мы всё делаем правильно появится следующая ошибка.

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in sxd/index.php:185 Stack trace: #0 sxd/index.php(167): Sypex_Dumper->connect() #1 sxd/index.php(22): Sypex_Dumper->init(false) #2 {main} thrown in sxd/index.php on line 185

Во-вторых необходимо заменить все вхождения mysql_ на mysqli_ и где это необходимо добавить идентификатор соединения. Например вот это

mysql_query('set names utf8');

меняем на это

mysqli_query($this->mysqli, 'set names utf8');

Обратите внимание, что в функциях mysql_fetch_ идентификатор соединения дописывать не надо.

mysqli_fetch_assoc($result);

Сам идентификатор подключения создаётся следующим образом.

$this->mysqli = mysqli_connect(...);

Особое внимание следует обратить на небуферизованные запросы. Тут следует заменить mysql_unbuffered_query на mysqli_query и дописать параметр MYSQLI_USE_RESULT.

mysqli_query(..., MYSQLI_USE_RESULT);

Кроме того, в PHP 7 возникает следующая ошибка.

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Sypex_Dumper has a deprecated constructor in sxd/index.php on line 24

Следует заменить function Sypex_Dumper() { на function __construct() {.

Если вы используете подсистему хранения данных InnoDB вместо MyISAM, то можете столкнуться с тем, что не все таблицы будут экспортированы из-за того, что в InnoDB не хранится точное количество записей в таблице. И если там 0, а по факту больше нуля, то записи просто не эскпортируются. Чтобы этого избежать, необходимо внутри цикла while($item = mysqli_fetch_assoc($r)), который, в свою очередь, находится внутри foreach($queries AS $query), сразу же после { добавить следующие строчки.

$r2 = mysqli_query($this->mysqli, 'select count(*) from `'.$n.'`') or sxd_my_error();
$i2 = mysqli_fetch_row($r2);
$item['Rows'] = $i2[0];

Таким образом, количество записей прочитается принудительно, запросом.

Если экспортировать только структуру, то возникает ошибка несоответствия типов (?). Чтобы её исправить, следует строчку

$item['Rows'] = $item['Data_length'] = '';

заменить на

$item['Rows'] = $item['Data_length'] = 0;

Комментарии

    • 185.153.132.199

    Спасибо большое! Выручил

    • 35.172.195.49

    Текст вашего комментария

    • 35.172.195.49