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.

Inhoudsopgave

1 Introductie 1

1.1 Copyright . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2 Disclaimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2 Openlink 2

2.1 Op de client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2.2 Op de server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.3 Configuratie voor test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.4 Test met odbctest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

3 PHP 3

4 Voorbeeld 4

5 FAQ 5

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:

• Het afgeleide werk (in de meest geschikte vorm, zoals sgml) opstuurt naar de LDP (Het Linux Documentatie Project) of vergelijkbaar zodat het op Internet kan worden geplaatst. Laat de LDP weten waar het beschikbaar is als het niet de LDP is waar je je document naar opstuurt.

• Licentieer het afgeleide werk met dezelfde licentie of gebruik GPL. Voeg een copyrightmelding in en op z’n minst een verwijzing naar de gebruikte licentie.

• Geef krediet aan vorige auteurs en mensen die een belangrijke bijdrage leverden.

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 <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

• Download install.sh en likoxglc.taz (voor een libc6 systeem) of likoxxxx.taz (voor een libc5 systeem) vanaf ftp://www.openlinksw.com/ <ftp://www.openlinksw.com/>.

   • mkdir /usr/local/openlink
   • Kopieer install.sh en likoxglc.taz naar /usr/local/openlink
   • cd /usr/local/openlink

• sh install.sh, het install script zal je vragen om de eigenaar en groep van het programma. Bestanden worden geëxtraheerd naar de odbcsdk directory onder /usr/local/openlink en .odbc.ini gekopieerd naar de homedirectory van de eigenaar.

2.2 Op de server

• Download ntadm65x.zip vanuit ftp://www.openlinksw.com/ <ftp://www.openlinksw.com/>, naar je NT-server.

• unzip ntadm65x.zip

• cd disk1 - directory waar je het package decomprimeert.

• voer setup uit en volg de instructies om de Openlink middleware te installeren.

• denk eraan de Openlink request broker vanuit het opstartmenu of het service controlpanel op te starten.

2.3 Configuratie voor test

• bewaar het .odbc.ini bestand in je homedirectory.

• kopieer udbc.ini vanuit de bin directory van de Openlink middleware installatiedirectory naar de directory /etc op de client.

• pas /etc/udbc.ini aan. Wijzig in de sectie [dsn_sql6], de Host, Database, UserName en Password

velden overeenkomstig je serverinstellingen. Hier is een deel van mijn /etc/udbc.ini:

         [dsn_sql6]
         Host            = 10.0.0.1
         ServerType      = sql6
         ;ServerOptions  =
         Database        = pubs
         ;FetchBufferSize = 30
         UserName        = sa
         Password        = xxxxxxx
• voeg aan je omgeving LD_LIBRARY_PATH='/usr/local/openlink/odbcsdk/lib' toe en exporteer deze
  variabele. Typ onder de csh-shell: setenv LD_LIBRARY_PATH /usr/local/openlink/odbcsdk/lib

2.4 Test met odbctest

• cd /usr/local/openlink/odbcsdk/examples
• ./odbctest
• typ: dsn=dsn_sql6

• wanneer ’sql>’ verschijnt. Je kunt nu wat sql opdrachten uitvoeren om de verbinding te testen.

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.

• Download php-3.0.11.tar.gz vanaf http://www.php.net <http://www.php.net/>.

• Voer de volgende stappen uit:

4. Voorbeeld 4

     gzip -dc php-3.0.11.tar.gz|tar -xof -
     cd php-3.0.11
     ./configure --with-openlink (--with-mysql --with-gd=/usr/local/gd1.3 --enable-track-vars)
         NOOT: Mijn configuratie is ingesteld PHP in CGI modus te draaien,
               met bovendien ondersteuning voor mysql. Jouw configuratie kan
               er anders uitzien.
     make --silent
         NOTE: Maak je geen zorgen bij eventuele waarschuwingsmeldingen.
     make install

Het uitvoerbare bestand php zal in /usr/local/bin worden geïnstalleerd. Kopieer voor de uitvoering van php de library bestanden /usr/local/openlink/odbcsdk/lib naar /usr/lib zodat het makkelijker is voor php om de openlink library’s te vinden (ik weet dat er betere methoden zijn).

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);

5. FAQ 5

}
$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

• Werkt deze exacte procedure ook voor MSSQL 7.0? Ja, Openlink zal hun software naar 7.0 upgraden, maar ik weet niet wanneer.

• Ik volgde dit document stap-voor-stap op om de openlink drivers te installeren, maar ik eindigde bij de stap "installeer ntadm65x.zip". Ndat ik ntadm65x installeerde, probeerde ik de OpenLink Request Broker te starten en kreeg de foutmelding:

unable to open the service control manager <5>
press RETURN to exit oplrqb

Kun je me alsjeblieft vertellen hoe ik dat probleem kan corrigeren? Dit zou een probleem met NT zelf kunnen zijn. Probeer het op te lossen door de computer opnieuw op te starten en start de openlink service dan vanuit de Control Panel/service manager.