Warum MSSQL? Weil das eine der ausgereiftesten und schnellsten DB-Engines ist. Gerade WEIL die mit sowas instabilem wie Windoofs darunter klarkommen mußte… 
Und: Doch nicht über die INI… über OLE/ADO!
- ist das erheblich schneller, und
- nur dann sind DB-Abfragen in Scripts überhaupt einigermaßen DB-Engine-kompatibel zu gestalten.
Hier hast du meine DB-Init. Die arbeitet gar nicht mit den PHP-typischen Befehlen, sondern direkt mit Providerstring und ADO-Schnittstelle. Geht also dann auch ebenso mit den anderen DB-Engines oder auch unter Perl o.ä.
Die Init enthält auch eine „Probe-Abfrage“ um letztlich die IPS-Variable „conf.DB.Enabled“ zu verifizieren. In der Art kannst Du Deine Abfragen dann auch gestalten. Bei mir gibts da gekapselte Module mehrerer Ebenen, z.B. für dynamisch-rückwirkende Zustandsabfragen, Statistiken, Differenzbildung usw, um das dann z.B. in Plots oder Trend-Auswerungen einfließen zu lassen.
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : dbInit.ips.php
Trigger :
Interval :
Datenbank-Initialisierung
(=Bildung der Zugangsinformation / Test der DB-Verfügbarkeit)
Rel. 1 GW 30.10.2007
*/
include_once "_globals.ips.php";
semaset($myself, 3000);
$setString=false;
// fehlende Variablen bedarfsweise anlegen
if (!IPS_VariableExists("conf.DB.Providerstr")) {
IPS_CreateVariable("conf.DB.Providerstr", "String");
SetValueString("conf.DB.Providerstr", "");
$setString=true;
}
if (!IPS_VariableExists("conf.DB.Enabled")) {
IPS_CreateVariable("conf.DB.Enabled", "Boolean");
SetValueBoolean("conf.DB.Enabled", false);
$setString=true;
}
$provstr=GetValueString("conf.DB.Providerstr");
$dbtyp=GetValueInteger("conf.DB.Dbtyp");
if (strlen($provstr)>0) { // Providerstring erfolgreich gebildet
if ($dbtyp==0) { // MSSQL-ADO
$db = new COM("ADODB.Connection");
}
$dsn=$provstr;
SetValueBoolean("conf.DB.Enabled", false);
loggen("DB-Init eingeleitet", $myself);
$db->Open($dsn);
$sqlstr ="SET nocount on ";
$sqlstr.="DECLARE @cnt int ";
$sqlstr.="SELECT ";
$sqlstr.=" @cnt=count(*) ";
$sqlstr.="FROM Objekte ";
$sqlstr.="SELECT ";
$sqlstr.=" cnt=@cnt ";
$rs = $db->Execute($sqlstr);
$rowcount=0;
$cnt=0;
while (!$rs->EOF) {
if ($rowcount==0) {
$cnt=$rs->Fields['cnt']->Value;
$cnt++;
}
$rowcount+=1;
$rs->MoveNext();
}
// echo ("DB-Init: ".$cnt." Objekte
");
$db->Close();
if (($rowcount>0) and ($cnt>0)) {
loggen("erfolgreich!", $myself);
SetValueBoolean("conf.DB.Enabled", true);
}
}
if ($setString) { // wenn Variablen erst gebildet wurden,
// neuer Versuch, Providerstring zu bilden
// (dort bei Erfolg nochmal Aufruf nach hier)
IPS_RunScript("dbSetProvstr");
}
semareset($myself);
?>
Die Include oben enthält einfach gebündelt und für alle Scripts nutzbare Funktionen, wie das Semaphorenhandling, Loggen u.ä. Die damit verbundenen Befehle siehst du ja bei Startversuch und kannst die getrost auch weglassen erstmal oder selber auflösen/anpassen, wie es bei dir dann paßt.
Die letzte Zeile unten ruft ein Script zur Verifizierung der Komponenten des Providerstrings auf („dbSetProvstr“).
Prinzipieller Aufbau eines IPS und MSSQL 2000 und 2005 Providerstrings (alles in <> inkl. der <> ersetzen!):
Provider=SQLOLEDB;Server=127.0.0.1;Database=ips;UID=<deinLogin>;PWD=<deinPasswort>;
oder mit „Integrierter Windows-Security“:
Provider=SQLOLEDB;Server=127.0.0.1;Database=ips;Trusted_Connection=yes;
127.0.0.1 funzt, wenn der DB-Server auf dem IPS-Server läuft (=localhost). Ansonsten dort andere IP oder DNS-Namen angeben.
Wenn du DB-Instanzen nutzt: Instanzname hinter die IP-Adresse mit Backslash ("…;Server=172.30.10.4\instanzname;Database=…")
Das ist alles und läuft und läuft und läuft …und scheffelt Daten, so >2 Mio Records per Jahr etwa.
Darüber mache ich Statistikauswertungen in ECHTZEIT! <-- Deshalb MSSQL!
Achso: Ichchaaabe garkeine php.ini… <-- Doch, aber nur mit den Einträgen fürs WIIPS. Ist aber für DB-Handling gar nicht mehr notwendig dann.
Gruß Gerd
PS: Noch einer:
Nur über diesen Weg kannst du STAPEL von Abfragen erfolgreich in Perl oder PHP-Scripts handeln. Wenn du die „eingebaute Syntax“ der Scriptsprachen nimmst, hast du immer nur einen Output-Stream.
Analog gilt das auch für das „Abfangen“ der Nicht-Record-Outputs (SQL-Meldungen, Prints usw), um z.B. ein eigenes Fehlerhandling aufzubauen, bei dem das Script nicht jedesmal stirbt…