PHP Script to convert .DBF files to .MYSQL
Asked Answered
F

4

5

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.

thanks before.

Farquhar answered 11/1, 2013 at 1:27 Comment(2)
Did you Google php convert dbf to mysql?Winkle
yes i did, but the result was an errorFarquhar
O
9

Try the code below...

<?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();
            }
        }
    }

?>
Oligocene answered 14/12, 2013 at 14:29 Comment(2)
Just be alert that php_dbase.dll must be present in php/ext folder and must be uncommented/created in php.ini. (Thats because it's not default for php 5.4+ or xampp folks).Actress
Wow. This saved my time.!!Hame
N
2

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.

Narvik answered 21/8, 2013 at 17:22 Comment(0)
B
0

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

Call to undefined function dbase_open()

in which case (centos)

yum install php-dbase

Here is the updated code for $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();

?>
Bonin answered 5/12, 2017 at 21:32 Comment(0)
B
0

<?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();

?>
Bluebill answered 19/10, 2019 at 9:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.