Основы PHP
  Что такое PHP?
  Возможности PHP
  Преимущества PHP
  История развития
  Что нового в PHP5?
  «Движок» PHP
  Переход на PHP 5.3
New Переход на PHP 5.6
  Введение в PHP
  Изучение PHP
  Основы CGI
  Синтаксис PHP
  Типы данных PHP
  Переменные в PHP
  Константы PHP
  Выражения PHP
  Операторы PHP
  Конструкции PHP
  Ссылки в PHP
  PHP и ООП
  Безопасность
  Функции PHP
  Функции по категориям
  Функции по алфавиту
  Стандартные функции
  Пользовательские
  PHP и HTTP
  Работа с формами
  PHP и Upload
  PHP и Cookies
  PHP и базы данных
  PHP и MySQL
  Документация MySQL
  Учебники
  Учебники по PHP
  Учебники по MySQL
  Другие учебники
  Уроки PHP
  Введение
  Самые основы
  Управление
  Функции
  Документация
  Математика
  Файлы
  Основы SQL
  Дата и время
  CURL
  Изображения
  Стили
  Безопасность
  Установка
  Проектирование БД
  Регулярные выражения
  Подготовка к работе
  Быстрый старт
  Установка PHP
  Установка MySQL
  Конфигурация PHP
  Download / Скачать
  Скачать Apache
  Скачать PHP
  Скачать PECL
  Скачать PEAR
  Скачать MySQL
  Редакторы PHP
  Полезные утилиты
  Документация
  PHP скрипты
  Скачать скрипты
  Инструменты
  PHP в примерах
  Новости портала
 Главная   »  Сборник статей
 
 

Конвертация баз MySQL в dBase

Автор: Алимов Рустем

Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество программных комплексов и различных скриптов, работающих с данными в формате dBase. Появилась задача обратной совместимости.

Данный класс поможет Вам преобразовывать базы данных MySQL в dBase.

Для работы этого скрипта необходимо, чтобы PHP был скомпилирован с поддержкой dBase. Чтобы узнать это, достаточно вызвать функцию phpinfo(). Если в строке Configure Command сведений о версии PHP есть параметр --enable-dbase, значит Ваша версия поддерживает dBase (можно также посмотреть в разделе Additional Modules наличие строки dBase).

<?php

class ConvdBase

{

var $conv_dir; // каталог конвертации - здесь будут DBF-файлы

var $struct; // структура текущей таблицы,

// используется при конвертации данных

function ConvdBase($dir)

{

$this->setoutdir($dir);

}

// имя поля и его тип формата MySQL преобразуем к dBase

// например: code int(10), преобразуем к array('code', 'N', 10, 0)

// если $mysql == true, то возвращаем только тип int

// который записывается в $this->struct

function getfield($f_name, $f_type, $mysql = false)

{

$len = 0;

$perc = 0;

$pos = strpos($f_type, '(');

if($pos)

{

$type = strtolower(substr($f_type, 0, $pos));

sscanf(substr($f_type, $pos), '(%d,%d)', &$len, &$perc);

}

else

$type = strtolower($f_type);

if($mysql)

return $type;

switch($type)

{

case 'double': case 'float':

$len = 19; $perc = 3;

$type = 'N';

break;

case 'enum':

$len = 5;

case 'int': case 'tinyint': case 'smallint':

if(!$len)

$len = 19;

$perc = 0;

// break не нужен

case 'decimal':

$type = 'N';

break;

case 'tinytext': case 'text': case 'longtext':

case 'varchar': case 'char':

if(!$len || $len > 254)

$len = 254;

$type = 'C';

break;

case 'year': case 'datetime': case 'timestamp':

$len = $perc = 0;

$type = 'D';

break;

}

$field = array($f_name, $type, $len, $perc);

return $field;

}

// установка исходящего каталога

function setoutdir($dir)

{

$this->conv_dir = $dir;

@mkdir($this->conv_dir, 0777);

}

// конвертация данных

function convertdata($row)

{

$data = array();

for($i = 0; $i < sizeof($this->struct); $i++)

{

switch($this->struct[$i])

{

case 'year': case 'datetime': case 'timestamp':

$data[] = substr($row[$i], 0, 8);

break;

case 'tinytext': case 'text': case 'longtext':

case 'varchar': case 'char':

if(strlen($row[$i]) > 254)

{

$data[] = substr($row[$i], 0, 254);

break;

}

// break не нужен

case 'smallint': case 'double': case 'float': case 'enum':

case 'int': case 'tinyint': case 'decimal': case 'int':

$data[] = $row[$i];

break;

}

}

return $data;

}

// конвертируем базу

function convert($server, $user, $password, $db_name)

{

// отключить тайм-аут

if( !get_cfg_var('safe_mode') )

set_time_limit(0);

$link = mysql_connect($server, $user, $password);

if(!$link)

exit('Error connect');

mysql_select_db($db_name);

$tables_query = mysql_query('SHOW TABLES', $link);

$tek_table = 0; // порядковый номер таблицы - если обязательно

// требуется имя файла не более 8 символов

while($tables = mysql_fetch_array($tables_query, MYSQL_NUM) )

{

$table = $tables[0];

$field_array = array();

$this->struct = array();

// создаем структуру таблицы

$fields_query = mysql_query('SHOW FIELDS FROM ' . $table);

$tek_field = 0;

while ($field = mysql_fetch_array($fields_query, MYSQL_ASSOC) )

{

$f_name = $field['Field'];

// имена полей dBase не должны быть более 10 символов

if(strlen($f_name) > 10)

$f_name = sprintf('%s%03d', substr($f_name, 0, 7), sizeof($field_array) + 1);

$field_array[] = $this->getfield($f_name, $field['Type']);

$this->struct[] = $this->getfield($tek_field, $field['Type'], true);

}

if(strlen($table) > 8) // см.выше о именах таблиц более 8 символов

$table_name = sprintf('%s%03d', substr($table, 0, 5), $tek_table++);

else

$table_name = $table;

$base = dbase_create( $this->conv_dir . '/' . $table_name . '.DBF', $field_array);

if($base)

{

// таблица создана - перекидываем данные

$rows_query = mysql_query("SELECT * FROM " . $table);

while($row = mysql_fetch_array($rows_query, MYSQL_NUM))

{

$row = $this->convertdata($row);

if($row)

if( !dbase_add_record($base, $row) )

exit('Error add record');

}

dbase_close($base);

}

}

mysql_close($link);

}

}

?>

А теперь рассмотрим пример использования конвертатора.

$dir = './CONVERT_' . date('YmdHi'); // здесь будут DBF

$conv = new ConvdBase($dir);

$conv->convert('localhost', 'user', 'pass', 'base');

Если типы данных year, datetime, timestamp надо передавать в неизменном виде, приведите их к типу dBase "С", изменив функции getfield и convertdata.

 
 » Обсудить эту статью на форуме

 
 Сборник статей 
 Содержание раздела 
Есть еще вопросы или что-то непонятно - добро пожаловать на наш  форум портала PHP.SU 
 

 
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS