Во многих предприятиях, разместивших свои ресурсы в интернете, осталось большое количество программных комплексов и различных скриптов, работающих с данными в формате 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;
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; }
$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);