Библиотека резервного копирования Codigniter создает неправильный запрос вставки

я создаю резервную копию, используя библиотеку codigniter «dbutil», и у меня есть поля в моей базе данных mysql, которые имеют бит данных при использовании приведенного ниже кода

 public function run_backup()
{
$filename="MembersPro_database_$this->curr_date.sql";
$filepath="application/upload/DatabaseBackup/$filename";
$dbfilepath="MembersPro/application/upload/DatabaseBackup/$filename";

$prefs = array(
'ignore'        => array(),                     // List of tables to omit from the backup
'format'        => 'sql',                       // gzip, zip, txt
'filename'      =>$filepath,                   // File name - NEEDED ONLY WITH ZIP FILES
'add_drop'      => TRUE,                        // Whether to add DROP TABLE statements to backup file
'add_insert'          => TRUE,
"foreign_key_checks"  =>FALSE
/* 'newline'       => "\n",*/
// Newline character used in backup file
);
$backup="CREATE DATABASE IF NOT EXISTS `MembersManagmentSystem`; USE `MembersManagmentSystem` ";
$backup .= $this->dbutil->backup($prefs);
if(!write_file($filepath, $backup))
{
echo "Error";die;
}
else
{
$_SESSION['sucessmsgbackup']="true";
}
$this->insert_into_datbase($filename,$dbfilepath);
redirect("ViewDatabaseBackup");
}

неверный вывод

INSERT INTO `User` (`userId`, `userRoleId`,`userActive`, `userIsDelete`) VALUES ('20000046', '20001','1', '0');

в указанных выше полях запроса «userActive» и «userIsDelete», имеющих тип данных «бит», и запрос, созданный библиотекой DbUtil, обрабатывает его как строку, поэтому я получаю предупреждение об ошибке в mysql

"out of range column value"

1

Решение

Читайте здесь Почему вы не должны использовать BIT столбцы в MySQL

О проблеме сообщили здесь в Github

Посмотрите в папку и измените основные классы так, чтобы это не убежит, например для драйвера mysqli

system/database/drivers/mysqli

https://github.com/bcit-ci/CodeIgniter/blob/develop/system/database/drivers/mysqli/mysqli_utility.php#L159

и найти файл mysqli_utility.php

найти строку

$is_int[$i] = in_array(strtolower($field->type),
array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'),
TRUE);

Введите номера

numerics
-------------
BIT: 16
TINYINT: 1
BOOL: 1
SMALLINT: 2
MEDIUMINT: 9
INTEGER: 3
BIGINT: 8
SERIAL: 8
FLOAT: 4
DOUBLE: 5
DECIMAL: 246
NUMERIC: 246
FIXED: 246

и добавьте ваш тип данных в массив выше, как показано ниже

$is_int[$i] = in_array($field->type,
array(16, 1, 2, 9, 3, 8),
TRUE);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector