การแปลงข้อมูลจาก DBF เป็น MySQL (โดย PHPBB)

PHP Knowledge เป็น บอร์ดรวามความรู้ php เน้นบทความ แนวทางการเขียนโปรแกรม บันทึกกันลืม เพื่อให้สมาชิกได้เขียนความรู้ที่ตัวเองมีให้สมาชิกท่านอื่นๆ ได้ เข้ามาอ่าน และ ไว้อ่านเองกันลืมด้วย

Moderator: mindphp, ผู้ดูแลกระดาน

buay
PHP Super Member
PHP Super Member
โพสต์: 250
ลงทะเบียนเมื่อ: 02/06/2014 9:55 am

การแปลงข้อมูลจาก DBF เป็น MySQL (โดย PHPBB)

โพสต์ที่ยังไม่ได้อ่าน โดย buay »

การแปลงข้อมูลจาก DBF เป็น MySQL จะแปลงเมื่อไฟล์ DBF มีการเปลี่ยนแปลง โดยการเช็คค่าจากวันที่ที่มีการเปลี่ยนแปลง เมื่อมีไฟล์ DBF มีการเปลี่ยนแปลง ก็จะทำการ insert ข้อมูลลงฐานข้อมูล mySQL โดยการ insert นั้นจะทำการแบ่งเป็นช่วง insert ทีละ 500 แถว เพื่อแก้ปัญหา time out ในกรณีที่ข้อมูลเยอะ

ตัวอย่าง

โค้ด: เลือกทั้งหมด

set_time_limit ( 0 ); // set time limit = 0 
$cn = odbc_connect("pro_mdb2", "", "") or die("ติดต่อฐานข้อมูลไม่ได้");//ติดต่อฐานข้อมูลผ่าน ODBC

$sql_con = "SELECT * FROM `convert` ";//select ตาราง convert เก็บชื่อตาราง และ วันที่ ที่ file DBF มีการเปลี่ยนแปลง        
$re_con = $db->sql_query($sql_con);//ทำการ query 
$date_check = array();// สร้างตัวแปร $date_check ให้เป็น array
//ทำการเปลี่ยนให้ ชื่อตารางเป็น key และ วันที่เป็น value ของ array
foreach($re_con as $u => $h){ 
    $u = $h['tb_name']; 
    $date_check[$u] = $h['date_save']; 
}
//วน loop ชื่อตาราง ($tb คือ array ของตาราง อยู่ในหน้า config)
foreach($tb as $k){    
        $tb_name    =    $dbf_path.strtoupper( $k ).'.DBF'; //$tb_name = ที่อยู่ไฟล์
        $time           =       date('Y-m-d', filectime($tb_name));//$time = วันที่ที่มีการเปลี่ยนแปลง
        //ตรวจสอบว่าวันที่ ในฐานข้อมูล SQL กับ DBF มีค่าเท่ากันหรือไม่ ถ้าเท่า ก็จะไม่ทำการ insert ลงใน SQL 
        if($date_check[$k] >= $time){
            continue;
        }
        $rs = odbc_exec($cn, 'SELECT * FROM '.$k.' ') or die("รัน SQL ไม่ผ่าน");//select ข้อมูลจาก DBF
        $data_arr = array();
        //ทำการวน loop ข้อมูลที่ได้
        while( $row = odbc_fetch_array($rs) ) {
            $data_arr[] = $row; //เก็บข้อมูลที่ได้ไว้ใน $data_arr   
        } 
        //ตรวจสอบว่าข้อมูลมีค่าหรือไม่ 
        if(!empty($data_arr)){
            $name_field = array_keys($data_arr[0]);//เก็บชื่อ field
        }
            $limit = 500; //สร้าตัวแปรมาเก็บค่า limit = 500
            $count = count($data_arr);// นับจำนวนที่ select มาทั้งหมด
            $loop = ceil($count/$limit);//จำนวนทั้งหมด หาร ด้วย limit จะได้จำนวนรอบทั้งหมด ปัดเศษขึ้น
            $field = array();
            //สั่งให้เคลียตารางใน SQL
            $sql_cr = "TRUNCATE TABLE `".$k."` ";
            $db->sql_query($sql_cr);
            //วน loop ตามจำนวนรอบ
            for($i=0;$i<$loop;$i++){ 
                    $sql = 'INSERT INTO '.$k.' ('.  implode(',', $name_field).') VALUES '; 
                    $arr = array();
                    //วน loop รอบละ 500 
                    for($j = $limit * $i, $c = $j + $limit; $j < $c; $j++) {
                        //ตรวจสอบถ้าข้อมูลครบตามจำนวนที่นับมาให้ทำการหยุด
                        if($j == $count){
                            break;
                        }
                        if($k == 'WDATA'){
                            if($data_arr[$j]['DAYOUT'] == ''){
                                $data_arr[$j]['DAYOUT'] = '0000-00-00';
                            }
                            if($data_arr[$j]['TMOUT'] == ''){
                                $data_arr[$j]['TMOUT'] = '00:00:00';
                            }
                            if($data_arr[$j]['DAYIN'] == ''){
                                $data_arr[$j]['DAYIN'] = '0000-00-00';
                            }
                            if($data_arr[$j]['TMIN'] == ''){
                                $data_arr[$j]['TMIN'] = '00:00:00';
                            }
                            $data_arr[$j]['PRICE'] = (int)$data_arr[$j]['PRICE'];
                            $data_arr[$j]['RATE'] = (int)$data_arr[$j]['RATE'];
                            $data_arr[$j]['VAT_R'] = (int)$data_arr[$j]['VAT_R'];
                            $data_arr[$j]['W1'] = (int)$data_arr[$j]['W1'];
                            $data_arr[$j]['W2'] = (int)$data_arr[$j]['W2'];
                            
                        } 
                        if($k == 'USERLIST'){
                            $pass_w   = iconv( 'TIS-620', 'UTF-8', $data_arr[$j]['PASS_W']);
                            $arr[] = " ('".$data_arr[$j]['CODE']."','".$data_arr[$j]['NAME']."','".$data_arr[$j]['TRUSTEE']."',
                                        '".$pass_w."','".$data_arr[$j]['REMARKS']."') ";  
                            
                        }else{
                            $arr[] = " ('".iconv( 'TIS-620', 'UTF-8', implode("','", $data_arr[$j]))."') ";
                        }    
                   }
                $sql .= implode(',', $arr); //นำ sql มาต่อกัน
                $db->sql_query($sql); //ทำการ query
            } 
                //ตรวจสอบว่าตัวแปรมีอยู่หรือไม่
                if(isset($date_check[$k])){
                     $sql = "UPDATE `convert` SET date_save = '". $time."' WHERE tb_name = '".$k."' ";
                     $db->sql_query($sql);     
                }else{
                    $sql = "INSERT INTO `convert` (tb_name,date_save) VALUES ('".$k."','". $time."') ";
                    $db->sql_query($sql);
                }          
}

exit('complete');
odbc_close($cn);
 
เขียน php ติดต่อ dbf โดย ไม่ต้องพึ่ง ODBC dbf คืออะไร php กับฐานข้อมูลรุ่นเก่า ตัวอย่างโค้ด PHP อยู่หน้าสองนะครับ
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 72