19 oktober, 2007

Databas: PHP och Access 2007

Artikeln tillägnad mig själv och alla ni som håller fast vid Access
istället för MySQL eller någon annan databaslösning.


Förord
I denna artikeln ska jag gå igenom hur man ansluter till en Microsoft Access 2007 databas av typen "accdb". Varför? För att det nästan inte finns några guider om hur man åstadkommer detta på Internet. Häng med när vi kopplar ihop ett öppen källkods projekt med en Microsoft produkt, som jag i fortsättningen hänvisar till namnet Access 2007.

Introduktion
För inte så länge sedan släpptes nya Microsoft Office 2007 och i Enterprise paketet följer Access 2007 med. Om du är utvecklare inom PHP och vill använda en databas skapad i det programmet så kan du stöta på problem. Den här artikeln hoppas jag ska lösa era problem så ni slipper få ont i huvudet för att ni inte får det att fungera. Annars kan ni ju alltid använda MySQL som ju är gratis och så mycket smidigare att använda med PHP (sök på LAMP på Google om ni vill veta mer om det).

Formatet
Tidigare har Microsoft använt MDB som filtyp för sina Access databaser men i senaste versionen används ACCDB. Några förbättringar har gjorts och säkerheten har blivit bättre än tidigare.

Installera stöd för ACCDB
Om ni vill ha stöd för ACCDB på databasservern måste den ha Office 2007 installerat eller ett smidigt litet paket som går att ladda ner gratis från Microsofts hemsida. Det är inte så vanligt att en server har Office 2007 installerat så därför ska vi hämta paketet. Navigera till nerladdningssida för Access Database Engine och klicka på Download högre upp på sidan. En stor nackdel är att det ligger på ungefär 25MB så det kan vara besvärligt att lägga till det i ett komplett installationspaket för enklare distribution.

Installera paketet på någon av Windows versionerna som stöds (exv. Windows XP) och kontrollera sedan om allt fungerar genom att öppna "Data Sources (ODBC)" i administrationsverktyg på kontrollpanelen. På fliken "Drivers" letar ni upp "Microsoft Access Driver (*.mdb, *.accdb)". Hittar ni den kan ni starta om datorn för att försäkra er om att det har installerats korrekt i registret.

Testa anslutning till ACCDB med PHP
Nu kommer vi till testning av systemet. Jag har skrivit några enkla rader i PHP som ansluter till en simpel databas skapad i Access 2007.

Kod (simple_odbc.php):

<?php
/**
* Get all tables and return them in an array
*
* @param resource $conn
* @return array $tables
*/
function odbc_get_tables(&$conn)
{
$tables = array();
$result = odbc_tables($conn) or die('Kan inte hämta tabeller!');

// Hämta alla tabeller och lagra i vektorn $tables
while (odbc_fetch_row($result)) {
if(odbc_result($result,'TABLE_TYPE')=='TABLE') {
$tables[] = odbc_result($result,'TABLE_NAME');
}
}

return $tables;
}

define('DB_PATH', 'D:/wwwroot/project/xxx');
define('DB_NAME', 'projekt_xxx.accdb');
define('DB_PASSWORD', '');

$db_conn = odbc_connect(
'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};
DBQ='. DB_PATH . DB_NAME,
'DODB.Connection',
DB_PASSWORD,
'SQL_CUR_USE_ODBC'
) or die('Kan inte ansluta till databasen!');

// Visa alla tabeller i databasen
$tabeller = odbc_get_tables($db_conn);
print_r($tabeller);

// Stäng anslutningen
odbc_close($db_conn);
?>


Inspiration till koden kommer från NinethSense där man ansluter till en vanlig MDB databas.

Slutord
Det var allt för den här gången. Hoppas ni får det att fungera utan problem.

Källor
http://www.phpbuilder.com/board/showthread.php?t=10316318
http://www.thescripts.com/forum/thread594515.html
http://blog.ninethsense.com/php/microsof-access-database-mdb-from-php/
http://aspn.activestate.com/ASPN/Cookbook/PHP/Recipe/123709
http://www.connectionstrings.com/?carrier=access2007 -- Mycket bra sida om ni har glömt hur man skapar en anslutning på någon typ av databas. Funkade dock inte för mig när jag försökte få ACCDB att fungera. Skriv gärna en kommentar till artikeln om ni får det att fungera med exemplen i källan.

3 kommentarer:

Anonym sa...

Hej, jag hittade din sida via google när jag sökte på php och mdb. Jag får det att fungera men jag vet inte hur jag skall gå vidare med tabellerna?

Hur gör jag för att välja en tabell och börja plocka ut data ur den? I mysql så kör jag ju en mysql_query, men nu vet jag inte vad jag skall göra.

Waschman sa...

Hej Per! Kul o se att du också gillar PHP och databaser.

Funktionen odbc_exec($conn, $sql) kör SQL-strängar mot databasen. Den fungerar som mysql_query(). Man får tillbaka ett resultat som sedan används i t.ex odbc_fetch_row(). Se mitt exempel här nedanför:

$conn = odbc_connect(...);
$sql = "SELECT * FROM Kategori ORDER BY KategoriNamn";
$result = @odbc_exec($conn, $sql) or odbc_errormsg();

while (@odbc_fetch_row($result)) {
for ($i=1; $i <= @odbc_num_fields($result); $i++) {
echo @odbc_result($result, $i) .",";
}//EndFor

Ungefär något i den stilen gör man. Nu kan jag inte testa detta men principen funkar om man testar sig fram. Jag använder nämligen nästan bara MySQL så mina kunskaper är lite risiga.

Hoppas du får det att fungera.

Anonym sa...

Hej,
Tack för svaret. Jag har fått det att fungera nu efter lite pill.

Tack för en bra blogg.

Välkomna till bloggen

Välkomna ska ni vara kära besökare. Jag skriver om IT för att det är kul och för att jag vill dela med mig av information och kunskap. Jag försöker hålla bloggen så kategoriserad som möjligt för att ni enklare ska hitta intressanta länkar och artiklar.