Verbinden met MS SQL 6.x+ via Openlink/PHP/ODBC mini-HOWTO

Zili Zhang, silen@silen.net
Vertaald door: Ellen Bokhorst, bokkie@nl.linux.org

3.0, 15-07-1999


Hoe een verbinding te maken met een MS SQL 6.x+ databaseserver via ODBC functies van PHP3 (3.0.1x of hoger) gecompileerd met Openlink drivers onder Linux.

1. Introductie

In dit document wordt beschreven hoe een verbinding te maken met een MS SQL 6.x+ databaseserver via ODBC functies van PHP3 (3.0.1x of hoger) gecompileerd met Openlink drivers onder Linux.

In de Unix wereld hebben de mensen vaak liever niets te maken met M$ gerelateerde software. In de echte wereld kan je werkgever echter van je verlangen data in een MS SQL database onder NT op te slaan en webtoepassingen onder Linux uit te voeren. Wat te doen? Ontslag nemen of de tijd nemen om dit document te lezen? Als je voor het laatste kiest, beloof ik je een gedetailleerde leidraad, zodat je die baan nog een tijdje aan kunt houden. Het is een Hoe-te-doen leidraad, geen Waarom-zo leidraad. Dus vraag me niet waarom het abc moet zijn en niet cba. Dat weet ik ook niet.

PHP wordt onder webprogrammeurs steeds populairder, hoofdzakelijk omdat het zo kan worden geconfigureerd dat het met diverse databases zoals Oracle, MySQL, Solid enzovoort een verbinding tot stand kan brengen. Maar bij een MS SQL server, gaat het om een ander probleem. Alhoewel je PHP's Sybase-ct ondersteuningsfeatures kunt gebruiken om een directe verbinding met MSSQL te maken, geven veel mensen (ik in ieder geval) de voorkeur aan een verbinding via ODBC.

Openlink ODBC middleware aanpassend, kun je gebruik maken van die ODBC_xxxx functies om alle databases te benaderen waar Openlink een driver voor heeft. Je moet hiervoor de Openlink Linux client en Server middleware installeren en PHP opnieuw compileren dat het ODBC functies ondersteunt.

1.1 Copyright

Copyright (c) 1999 door Zili Zhang

Kopieer en distribueer dit document gerust (of geef het weg) in elk gewenst formaat. Je wordt verzocht correcties en/of opmerkingen naar de huidige beheerder door te sturen. Je mag er een afgeleide werk van maken en het distribueren op voorwaarde dat je:

Als je een afgeleid werk overweegt anders dan een vertaling, dan wordt je verzocht je plannen te bespreken met de huidige beheerder.

1.2 Disclaimer

Dit document wordt je in goed vertrouwen aangeboden aangezien het alleen uit een veilige configuratie en procedures bestaat. Er wordt geen verantwoordelijkheid door de auteur geaccepteerd voor enig verlies of schade op welke wijze dan ook veroorzaakt door een persoon of uitrusting, als een direct of indirect gevolg van het opvolgen van deze instructies.

Dit document werd afgeleid van het gewone tekstbestand te vinden op http://www.silen.net/openlink-php-odbc.txt.

2. Openlink

Deze stap is een beetje gecompliceerd. Er zijn zowel op de Linux client als de NT server een aantal werkzaamheden te verrichten.

2.1 Op de client

2.2 Op de server

2.3 Configuratie voor test

2.4 Test met odbctest

3. PHP

Nu hebben we Openlink en kunnen we verder met de compilatie van PHP. Voor deze versie is PHP 3.0.10 of hoger nodig om het werkend te krijgen.

4. Voorbeeld

Raadpleeg alsjeblieft de PHP handleiding voor ODBC functies. Hier is mijn voorbeeldcode odbc.php3: (odbc_num_rows() zal niets retourneren, dus je moet herhaaldelijk odbc_fetch_row() aanroepen om aan het aantal te komen.)

<?
/* een aantal omgevingsvariabelen, plaats een commentaarteken voor een
 * van deze regels om te testen of het dan nog werkt
 */
putenv("LD_LIBRARY_PATH=/usr/local/openlink/odbcsdk/lib");
putenv("UDBCINI=/etc/udbc.ini");
putenv("ODBCINI=/root/.odbc.ini");
putenv("DebugFile=/tmp/udbc.out");      // debug trace output

$dsn="DSN=dsn_main";    // noot 'DSN=' is vereist
$user="sa";
$password="xxxxxxx";

$sql="SELECT * FROM titles";

/* directly execute mode                        */
if ($conn_id=odbc_connect("$dsn",$user,$password)){
        echo "connected to DSN: $dsn<br><br>";
        if($result_id=odbc_do($conn_id, $sql)) {
                echo "executing '$sql'<br><br>";
                        $num_fields=odbc_num_fields($result_id);
                        if($num_fields>0){
                                echo "Number of fields:
$num_fields<br>";
                                for($i=1;$i<=$num_fields;$i++){

$field_name[$i-1]=odbc_field_name($result_id,$i);
                                }
                                $num_rows=0;
                                while(odbc_fetch_row($result_id)){
                                        for($i=1;$i<=$num_fields;$i++){

$result[$num_rows][$field_name[$i-1]]=odbc_result($result_id,$i);
                                        }
                                        $num_rows++;
                                }
                                echo "Number of rows: $num_rows<br>";
                        }else{
                                echo "not a field returned. <br><br>";
                        }
                echo "Results:<br>";
                for($i=0;$i<sizeof($result);$i++){
                        while(list($key,$value)=each($result[$i])){
                                echo "$i:$key=$value<br>";
                        }
                }
                echo "freeing result<br><br>";
                odbc_free_result($result_id);
        }else{
                echo "can not execute '$sql'<BR><BR>";
        }
        echo "closing connection $conn_id";
        odbc_close($conn_id);
}else{
        echo "can not connect to DSN: $dsn<br><br>";
}
?>

5. FAQ