将 .DBF 文件转换为 .MYSQL 的 PHP 脚本

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14270236/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 06:58:39  来源:igfitidea点击:

PHP Script to convert .DBF files to .MYSQL

phpmysqlsqlphpmyadmindbf

提问by dani

Just wondering if anyone can point me in the direction of some tips / a script that will help me create an mysql from an original dbf File, using PHP.

只是想知道是否有人可以向我指出一些提示/脚本的方向,该脚本将帮助我使用 PHP 从原始 dbf 文件创建 mysql。

thanks before.

之前谢谢。

回答by user3102351

You can try bellow code

你可以试试下面的代码

<?php
$tbl = "cc";
$db_uname = 'root';
$db_passwd = '';
$db = 'aa';
$conn = mysql_pconnect('localhost',$db_uname, $db_passwd);

// Path to dbase file
$db_path = "dbffile/bbsres12.dbf";

// Open dbase file
$dbh = dbase_open($db_path, 0)
or die("Error! Could not open dbase database file '$db_path'.");

// Get column information
$column_info = dbase_get_header_info($dbh);

// Display information
//print_r($column_info);

$line = array();

foreach($column_info as $col)
{
switch($col['type'])
{
case 'character':
$line[]= "`$col[name]` VARCHAR( $col[length] )";
break;
case 'number':
$line[]= "`$col[name]` FLOAT";
break;
case 'boolean':
$line[]= "`$col[name]` BOOL";
break;
case 'date':
$line[]= "`$col[name]` DATE";
break;
case 'memo':
$line[]= "`$col[name]` TEXT";
break;
}
}
$str = implode(",",$line);
$sql = "CREATE TABLE `$tbl` ( $str );";

mysql_select_db($db,$conn);

mysql_query($sql,$conn);
set_time_limit(0); // I added unlimited time limit here, because the records I imported were in the hundreds of thousands.

// This is part 2 of the code

import_dbf($db, $tbl, $db_path);

function import_dbf($db, $table, $dbf_file)
{
global $conn;
if (!$dbf = dbase_open ($dbf_file, 0)){ die("Could not open $dbf_file for import."); }
$num_rec = dbase_numrecords($dbf);
$num_fields = dbase_numfields($dbf);
$fields = array();

for ($i=1; $i<=$num_rec; $i++){
$row = @dbase_get_record_with_names($dbf,$i);
$q = "insert into $db.$table values (";
foreach ($row as $key => $val){
if ($key == 'deleted'){ continue; }
$q .= "'" . addslashes(trim($val)) . "',"; // Code modified to trim out whitespaces
}
if (isset($extra_col_val)){ $q .= "'$extra_col_val',"; }
$q = substr($q, 0, -1);
$q .= ')';
//if the query failed - go ahead and print a bunch of debug info
if (!$result = mysql_query($q, $conn)){
print (mysql_error() . " SQL: $q
\n");
print (substr_count($q, ',') + 1) . " Fields total.

";
$problem_q = explode(',', $q);
$q1 = "desc $db.$table";
$result1 = mysql_query($q1, $conn);
$columns = array();
$i = 1;
while ($row1 = mysql_fetch_assoc($result1)){
$columns[$i] = $row1['Field'];
$i++;
}
$i = 1;
foreach ($problem_q as $pq){
print "$i column: {$columns[$i]} data: $pq
\n";
$i++;
}
die();
}
}
}


?>

回答by Cyprezz

You can try composer package hisamu/php-xbase (https://github.com/hisamu/php-xbase) to read dbf file and insert into your database. Had the same problem and this was most suitable solution.

您可以尝试使用 composer package hisamu/php-xbase ( https://github.com/hisamu/php-xbase) 来读取 dbf 文件并插入到您的数据库中。有同样的问题,这是最合适的解决方案。

回答by Nelles

UPDATED: in the event that your did not compile PHP with dbase library you could get the following error:

更新:如果您没有使用 dbase 库编译 PHP,您可能会收到以下错误:

Call to undefined function dbase_open()

in which case (centos)

在这种情况下(centos)

yum install php-dbase

Here is the updated code for $mysqli

这是 $mysqli 的更新代码

<?php

$mysqli = new mysqli("localhost", "DBusername", "DBpassword", "tableName");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}


$tbl = "yourTableName";
$db = 'YourDBName';

// Path to dbase file
$db_path = "/path/dbaseFileName.dbf";

// Open dbase file
$dbh = dbase_open($db_path, 0)
or die("Error! Could not open dbase database file '$db_path'.");

// Get column information
$column_info = dbase_get_header_info($dbh);

$line = array();

foreach($column_info as $col) {
 switch($col['type']){

  case 'character':
   $line[]= "`$col[name]` VARCHAR( $col[length] )";
   break;
 
  case 'number':
   $line[]= "`$col[name]` FLOAT";
   break;

  case 'boolean':
   $line[]= "`$col[name]` BOOL";
   break;

  case 'date':
   $line[]= "`$col[name]` DATE";
   break;

  case 'memo':
   $line[]= "`$col[name]` TEXT";
   break;
 }
}

$str = implode(",",$line);
$sql = "CREATE TABLE `$tbl` ( $str );";

//mysql_select_db($db,$conn);

//mysql_query($sql,$conn);
$mysqli->query($sql);
set_time_limit(0); // I added unlimited time limit here, because the records I imported were in the hundreds of thousands.

// This is part 2 of the code

import_dbf($db, $tbl, $db_path, $mysqli);

function import_dbf($db, $table, $dbf_file,$mysqli){
 //global $conn;
 global $mysqli;
 if (!$dbf = dbase_open ($dbf_file, 0)){ die("Could not open $dbf_file for import."); }
 $num_rec = dbase_numrecords($dbf);
 $num_fields = dbase_numfields($dbf);
 $fields = array();

 for ($i=1; $i<=$num_rec; $i++){
 $row = @dbase_get_record_with_names($dbf,$i);
 $q = "insert into $db.$table values (";
 foreach ($row as $key => $val){
 if ($key == 'deleted'){ continue; }
 $q .= "'" . addslashes(trim($val)) . "',"; // Code modified to trim out whitespaces
 }

 if (isset($extra_col_val)){ $q .= "'$extra_col_val',"; }
 $q = substr($q, 0, -1);
 $q .= ')';
 //if the query failed - go ahead and print a bunch of debug info
 // if (!$result = mysql_query($q, $conn)){
 if (!$result = $mysqli->query($q)){
  print (mysql_error() . " SQL: $q\n");
  print (substr_count($q, ',') + 1) . " Fields total.";

  $problem_q = explode(',', $q);
  $q1 = "desc $db.$table";
  //$result1 = mysql_query($q1, $conn);
  $result1 = $mysqli->query($q1);
  $columns = array();

  $i = 1;

  while ($row1 = $result1->fetch_assoc()){
   $columns[$i] = $row1['Field'];
   $i++;
  }

  $i = 1;
  foreach ($problem_q as $pq){
   print "$i column: {$columns[$i]} data: $pq\n";
   $i++;
  }
  die();
 }
}
}

$mysqli->close();

?>

回答by vasanth kumar

<?php

$mysqli = new mysqli("localhost", "DBusername", "DBpassword", "tableName");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}


$tbl = "yourTableName";
$db = 'YourDBName';

// Path to dbase file
$db_path = "/path/dbaseFileName.dbf";

// Open dbase file
$dbh = dbase_open($db_path, 0)
or die("Error! Could not open dbase database file '$db_path'.");

// Get column information
$column_info = dbase_get_header_info($dbh);

$line = array();

foreach($column_info as $col) {
 switch($col['type']){

  case 'character':
   $line[]= "`$col[name]` VARCHAR( $col[length] )";
   break;
 
  case 'number':
   $line[]= "`$col[name]` FLOAT";
   break;

  case 'boolean':
   $line[]= "`$col[name]` BOOL";
   break;

  case 'date':
   $line[]= "`$col[name]` DATE";
   break;

  case 'memo':
   $line[]= "`$col[name]` TEXT";
   break;
 }
}

$str = implode(",",$line);
$sql = "CREATE TABLE `$tbl` ( $str );";

//mysql_select_db($db,$conn);

//mysql_query($sql,$conn);
$mysqli->query($sql);
set_time_limit(0); // I added unlimited time limit here, because the records I imported were in the hundreds of thousands.

// This is part 2 of the code

import_dbf($db, $tbl, $db_path, $mysqli);

function import_dbf($db, $table, $dbf_file,$mysqli){
 //global $conn;
 global $mysqli;
 if (!$dbf = dbase_open ($dbf_file, 0)){ die("Could not open $dbf_file for import."); }
 $num_rec = dbase_numrecords($dbf);
 $num_fields = dbase_numfields($dbf);
 $fields = array();

 for ($i=1; $i<=$num_rec; $i++){
 $row = @dbase_get_record_with_names($dbf,$i);
 $q = "insert into $db.$table values (";
 foreach ($row as $key => $val){
 if ($key == 'deleted'){ continue; }
 $q .= "'" . addslashes(trim($val)) . "',"; // Code modified to trim out whitespaces
 }

 if (isset($extra_col_val)){ $q .= "'$extra_col_val',"; }
 $q = substr($q, 0, -1);
 $q .= ')';
 //if the query failed - go ahead and print a bunch of debug info
 // if (!$result = mysql_query($q, $conn)){
 if (!$result = $mysqli->query($q)){
  print (mysql_error() . " SQL: $q\n");
  print (substr_count($q, ',') + 1) . " Fields total.";

  $problem_q = explode(',', $q);
  $q1 = "desc $db.$table";
  //$result1 = mysql_query($q1, $conn);
  $result1 = $mysqli->query($q1);
  $columns = array();

  $i = 1;

  while ($row1 = $result1->fetch_assoc()){
   $columns[$i] = $row1['Field'];
   $i++;
  }

  $i = 1;
  foreach ($problem_q as $pq){
   print "$i column: {$columns[$i]} data: $pq\n";
   $i++;
  }
  die();
 }
}
}

$mysqli->close();

?>