natty

[PHP] Class สำหรับ convert DBF to MySQL

In Foxpro, PHP on September 22, 2008 at 7:05 pm

เนื่องจากมีโปรเจคหนึ่งที่ต้องทำส่วนหนึ่ง คือส่วนของการ convert DBF to MySQL เลยเอามาฝากกัน ที่ทำเพราะว่า ระบบนี้จะเป็นต้องอ่าน DBF file ใหม่ๆ ทุกวันเพื่อนำมาใช้ในระบบ แต่ developer อยากใช้กับ MySQL database ดังนั้นเก๋จึงทำ class ที่อ่าน dbf file มาลง mysql ให้เค้า โดยทำเป็นตารางที่หน้าตาเหมือนกันใน MySQL ให้

ระบบนี้มี table ชื่อเดิม แต่ต้องอัพเดทข้อมูลตาม dbf file ทุกวัน ดังนั้นเก๋จึงไม่ได้ทำ function ที่ให้สร้าง MySQL table หน้าตาเหมือนๆ กัน ทำแค่ให้ insert ข้อมูลลงไปใน MySQL ได้ นั่นหมายความว่า หากต้องการนำ class นี้ไปใช้ ต้องสร้าง table ที่หน้าตาเหมือนกับ dbf file ไว้ก่อน แล้วค่อยเอา class นี้ไปช่วยในการ insert ข้อมูลให้

ใจจริง อยากทำ function ที่ให้ create table เหมือนกัน แต่ติดที่ว่า วิธีการอ่าน dbf file คือเก๋ใช้ dbase function ซึ่งเป็นการ read wirte dbf file แต่ไม่ใช่การ query ด้วยคำสั่ง SQL ดังนั้นจึงคิดวิธีการ get property ของ field ไม่ออก ว่าต้องทำยังงัย ก็เลยคิดว่า หากวันนึงอยากใช้ create table function ขึ้นมาจริงๆ คงต้องใช้ ODBC เข้าช่วย เพราะคำสั่ง SQL สามารถ get property ได้

มีไฟล์ที่เกี่ยวข้อง 3 ไฟล์ คือ DBFMySQL.php, iDBFMySQL.php และ test.php

เก๋กำหนดให้มี interface เอาไว้ จะเห็นว่า createTable โดน comment ไว้ แสดงว่ามันจะ coming soon ฮ่าๆ


<?php

/*created by Nattanicha Rittammanart
* Created date: Sep 22, 2008 */

interface iDBFMySQL{
/*
fromDBF: dbf with the right path
toMySQL: define table name in MySQL
myDB: MySQL database to put MySQL table
myUser: MySQL username
myPass: MySQL password
myHost: MySQL Host

*/

/**/
public static function convertDBFToMySQL($fromDBF, $toMySQL, $myDB, $myUser, $myPass, $myHost);
public static function readDBFToArray($fromDBF);
public static function persistToMySQL($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost);
//public static function createMySQLTable($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost);
}

function convertDBFToMySQL เป็นฟังก์ชั่นที่ให้ผู้ใช้เรียกใช้เพื่อ convert dbf to mysql โดยตรง โดยฟังก์ชั่นอื่น เป็นฟังก์ชั่นที่ใช้งานร่วมกับมันเท่านั้น ก็คือใส่ parameters ให้ครบ มันก็จะให้สิ่งที่ต้องการออกมา ฟังก์ชั่นนี้ เรียก readDBFToArray และ persistToMySQL มาใช้งาน


public static function convertDBFToMySQL($fromDBF, $toMySQL, $myDB, $myUser, $myPass, $myHost){
$arrTable = array();
$arrTable = DBFMySQL::readDBFToArray($fromDBF);
DBFMySQL::persistToMySQL($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost);
}

function readDBFToArray รับ path ของ dbf file เพื่อเอามาใส่ลง array โดยจะ return เป็น array 2 ชุดใหญ่ คือ ชุด column name กับชุดของ data โดยชุดของ data ก็จะเก็บเป็น array ย่อยลงไปอีก โดย array นี้จะ prepare เอาไว้ให้ function persistToMySQL เป็นคนเรียก


public static function readDBFToArray($fromDBF){
		// open in read-only mode
		$db = dbase_open($fromDBF, 0);
		$records = array();

		if ($db) {
		// read some data ..
			$record_numbers = dbase_numrecords($db);
			$field_numbers = dbase_numfields($db);
			for ($i = 1; $i <= $record_numbers; $i++) {
				$row = dbase_get_record_with_names($db, $i);
				array_push($records,array_values($row));
			}
			$columnHeader = array_keys($row);
			$arrTable = array($columnHeader,$records);
			dbase_close($db);
		}
		return $arrTable;
	}

function persistToMySQL รับ array มาจาก readDBFToArray เพื่อนำมาลง MySQL table ใน field ที่ถูกต้อง

public static function persistToMySQL($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost){

		$connect = mysql_connect($myHost, $myUser, $myPass) or die("cannot connect to database");
		mysql_select_db($myDB, $connect);

		$columnHeader = $arrTable[0];
		$records = $arrTable[1];

		for($i=0;$i<sizeof($columnHeader)-1;$i++){
				$temp = $columnHeader[$i].",";
				$prepareFields=$prepareFields.$temp;
		}

		$prepareFields = substr($prepareFields, 0, -1);

		for($j=0;$j<sizeof($records);$j++){
			$prepareRecords='';
			for($i=0;$i<sizeof($records[$j])-1;$i++){
				$temp = "'".trim($records[$j][$i])."'".",";
				$prepareRecords=$prepareRecords.$temp;
			}
			$prepareRecords = substr($prepareRecords, 0, -1);
			$sql = "INSERT INTO $toMySQL ($prepareFields) VALUES ($prepareRecords)";
			$test = mysql_query($sql);
		}
	}

วิธีการใช้งานก็ง่ายมากๆ เลย ทำแบบนี้

<?php

/*created by Nattanicha Rittammanart
* Created date: Sep 22, 2008 */

include 'DBFMySQL.php';

$fromDBF='D:\PO_McDonald\INVORDD0.DBF';
$toMySQL='INVORDD0';
$myDB='db_mcdonald';
$myUser='root';
$myPass='root';
$myHost='localhost';

DBFMySQL::convertDBFToMySQL($fromDBF, $toMySQL, $myDB, $myUser, $myPass, $myHost);

?> 

ในอนาคตอาจจะมีการเพิ่มเติมฟังก์ชั่นเข้าไปอีกค่ะ หากเป็นประโยชน์ก็ช่วยบอกด้วยนะคะ

ดาวน์โหลด sourcecode ได้ที่นี่ ค่ะ

Advertisements
  1. […] เก๋จะให้ตัวอย่างสำหรับการทำ SimpleTest ของ blog ตอนหนึ่ง คือ [PHP] Class สำหรับ convert DBF to MySQL […]

  2. เจ้ ทำไมไม่ให้ โหลด ด้วยอะ

  3. link มันเสีย เด๋วค่อยอัพให้ใหม่วันจันทร์ละกัน

  4. แก้ไขลิงค์เรียบร้อยแล้วค่ะ ดาวน์โหลดไปใช้งานได้เลย

  5. มันจะมีปัญหาเกี่ยวกับ dbf ที่มีข้อมูลในฟิลด์ เป็นภาษาไทยมั้ยครับ

  6. เท่าที่ทำมายังไม่มีปัญหาเรื่องภาษาไทยค่ะ

  7. พี่เก๋ เราสามารถให้มันคิวรี่เอาเฉพาะข้อมูลเท่าที่เราต้องการได้มั้ยนิ โดยที่ไม่ต้องแปลงทั้งหมดก็ได้

  8. […] [PHP] Class สำหรับ convert DBF to MySQL September 2008 7 comments 5 […]

  9. ซึ้งมากสำหรับ [PHP] Class สำหรับ convert DBF to MySQL ตอนนี้นวยได้นำมันไปใช้แล้วปรากฏว่าได้ผมดีมาก ซึ้งจริงๆ

  10. เยี่ยมเลยพี่นวย ไว้ผมจะเอาไปใช้บ้างนะ

  11. ผ่านมาอ่านครับ ขอบคุณครับสำหรับ Class ดีๆ น่านำไปประยุกต์ใช้ต่อมากครับ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: