2011-06-28 42 views
3

在我們的內部系統中,我們有csv &從我們的MySQL數據庫爲用戶(phpexcel)生成的xls文件,但是我的老闆問是否可以創建一個mdb文件。如何用php創建一個新的.MDB文件?

我從來沒有遇到任何關於即時創建新MDB文件的示例,我想知道是否有可能。我不是任何機會的專家級程序員,但是如果有人能指導我如何繼續下去,我可以管理。

我們正試圖通過向他們提供mdb而不是CSV來將用戶負載/錯誤減少到必須導入到Access中。目前他們必須將超過100個csv文件導入到Access中。

謝謝。

+0

您的服務器上啓用COM類? –

回答

4

可以使用COM用於訪問MDB司機,還有位於phpclasses一個簡單的類充當這樣的包裝,你可以直接使用它的靈感或端口,無論哪種方式,這是完全有可能:

<?php  
class mdb 
{ 
    var $RS = 0; 
    var $ADODB = 0; 

    var $RecordsAffected; 

    var $strProvider = 'Provider=Microsoft.Jet.OLEDB.4.0'; 
    var $strMode  = 'Mode=ReadWrite'; 
    var $strPSI  = 'Persist Security Info=False'; 
    var $strDataSource = ''; 
    var $strConn  = ''; 
    var $strRealPath = ''; 

    var $recordcount = 0; 
    var $ok = false; 


    /** 
    * Constructor needs path to .mdb file 
    * 
    * @param string $dsn = path to *.mdb file 
    * @return boolean success 
    */ 
    function mdb($dsn='Please enter DataSource!') 
    { 
    $this->strRealPath = realpath($dsn); 
    if(strlen($this->strRealPath) > 0) 
    { 
     $this->strDataSource = 'Data Source='.$this->strRealPath; 
     $result = true; 
    } 
    else 
    { 
     echo "<br>mdb::mdb() File not found $dsn<br>"; 
     $result = false; 
    } 

    $this->RecordsAffected = new VARIANT(); 

    $this->open(); 

    } // eof constructor mdb() 


    function open() 
    { 
    if(strlen($this->strRealPath) > 0) 
    { 

     $this->strConn = 
     $this->strProvider.';'. 
     $this->strDataSource.';'. 
     $this->strMode.';'. 
     $this->strPSI; 

     $this->ADODB = new COM('ADODB.Connection'); 

     if($this->ADODB) 
     { 
     $this->ADODB->open($this->strConn); 

     $result = true; 
     } 
     else 
     { 
     echo '<br>mdb::open() ERROR with ADODB.Connection<br>'.$this->strConn; 
     $result = false; 
     } 
    } 

    $this->ok = $result; 

    return $result; 
    } // eof open() 


    /** 
    * Execute SQL-Statement 
    * @param string $strSQL = sql statement 
    * @param boolean $getrecordcount = true when a record count is wanted 
    */ 
    function execute($strSQL, $getrecordcount = false) 
    { 

    $this->RS = $this->ADODB->execute($strSQL, &$this->RecordsAffected); 

    if($getrecordcount == true) 
    { 

     $this->RS->MoveFirst(); 
     $this->recordcount = 0; 

     # brute force loop 
     while($this->RS->EOF == false) 
     { 
     $this->recordcount++; 
     $this->RS->MoveNext(); 
     } 
     $this->RS->MoveFirst(); 

    } 


    } // eof execute() 

    function eof() 
    { 
    return $this->RS->EOF; 
    } // eof eof() 

    function movenext() 
    { 
    $this->RS->MoveNext(); 
    } // eof movenext() 

    function movefirst() 
    { 
    $this->RS->MoveFirst(); 
    } // eof movefirst() 

    function close() 
    { 

    @$this->RS->Close(); // Generates a warning when without "@" 
    $this->RS=null; 

    @$this->ADODB->Close(); 
    $this->ADODB=null; 
    } // eof close() 

    function fieldvalue($fieldname) 
    { 
    return $this->RS->Fields[$fieldname]->value; 
    } // eof fieldvalue() 

    function fieldname($fieldnumber) 
    { 
    return $this->RS->Fields[$fieldnumber]->name; 
    } // eof fieldname() 

    function fieldcount() 
    { 
    return $this->RS->Fields->Count; 
    } // eof fieldcount() 

} // eoc mdb 
?> 

和示例:

這裏是類,源鏈路提供如下

include 'class_mdb.php'; 

$mdb = new mdb('mymdbfile.mdb'); // your own mdb filename required 
$mdb->execute('select * from table'); // your own table in the mdb file 

# 
# first example: using fieldnames 
# 

while(!$mdb->eof()) 
{ 
    echo $mdb->fieldvalue('description'); // using your own fields name 
    echo ' = '; 
    echo $mdb->fieldvalue(1); // using the fields fieldnumber 
    echo '<br>'; 
    $mdb->movenext(); 
} 

echo '<br><hr><br>'; 

# 
# Going back to the first recordset for the second example 
# 
$mdb->movefirst(); 

# 
# This works, too: Make each Field an object. The values change 
# when the data pointer advances with movenext(). 
# 
$url = $mdb->RS->Fields(1); 
$bez = $mdb->RS->Fields(2); 
$kat = $mdb->RS->Fields(3); 

while(!$mdb->eof()) 
{ 
    # works! 
    echo $bez->value; 
    echo ' = '; 
    echo $url->value; 
    echo '<br>'; 
    $mdb->movenext(); 
} 

$mdb->close(); 

來源:http://www.phpclasses.org/package/1700-PHP-Access-Microsoft-Access-mdb-database-files.html

+0

<3 !!!太感謝了。 – SueBella

+0

您可以使用我的答案左側的向上箭頭和標記接受打勾表示您的謝意,但歡迎您。 – RobertPitt

+1

糾正我,如果我錯了,但這似乎沒有創建一個新的mdb文件的方法。我想有人可能會創建一個空的mdb文件並複製它,然後將表插入它... – horatio

2

要創建一個新的空Microsoft Access數據庫,我們可以使用ADOX。

下面的代碼創建C中的空Test.mdb的文件:\

$adox_catalog  = new COM("ADOX.Catalog"); 

    $adox_catalog->create('Provider = Microsoft.Jet.OLEDB.4.0; Data Source=c:\Test.mdb'); 

    $adodb_conection = $adox_catalog->activeconnection(); 
+0

終於!在我從這個網站和其他地方閱讀並嘗試了一打「解決方案」之後,這種方法無效(其中一些很長,使用class.mdb.php等),這是一個簡單的很短的一個工程!你必須是一個真正的人。 謝謝user1202495! – Apostolos

+0

但有一個問題:最後一條語句(activeconnection())是什麼?在創建mdb文件的過程中不需要... – Apostolos