F: was muss man bei IPS2 tun umd mit dem MSSQL Server arbeiten zu können

Was muss man alles tun, um mit IPS2 via PHP auf einen MS-SQL Server zuzugreifen?

Bei mir scheitert es schon an so einfache Sachen wie ich finde keine php.ini auf meinem System…

Beim Aufruf von mssql_connect() erhalte ich:
Fatal error: Call to undefined function mssql_connect() in [php test] on line 17

Danke im Vorraus.

Du findest die php.ini nicht? Äh :confused::eek::rolleyes:.
Deine php.ini findest du normalerweise im Stammverzeichnis von IPS.

Und für den Rest solltest du deine Fragen evtl. etwas präziser stellen, sonst kann dir leider niemand helfen, da unsere Glaskugeln gerade alle zur Reparatur sind :smiley:

Gruß
Jens

Bei mir gibt es keine php.ini, weder bei IPS V1.x und auch nicht bei IPS2. Ich habe die gesamte Platte durchsucht.

Das ist die genaue Fehlermeldung bei ich stehe:

Beim Aufruf von mssql_connect() erhalte ich:
Fatal error: Call to undefined function mssql_connect() in [php test] on line 17

Ich vermute die Ursache ist aber schon die fehlende php.ini.

Falls keine php.ini da ist, einfach eine erstellen. Den Rest findest du dann auf der php.net Seite.

Es funktioniert genau so, als wenn du es unter einem Apache machen würdest.

Btw: Warum MSSql? Das Zusammenspiel von PHP und MSSql ist nicht gerade super… Ich hatte mal das Vergnügen und damit auch viel Kopfschmerzen bis es endlich lief.

paresy

Danke, werde heute weitertesten. Warum MS-SQL: weil ich einen MS-SQL Server am laufen habe, rund um die Uhr.

So funktioniert der Zugriff auf MS-SQL Prinzipiell:

php.ini
—8<—
extension_dir=C:\IP-Symcon
extension=php_mssql.dll

; geht nicht da IPS als Dienst startet und der keinem Benutzerkonto zugeordnet ist
; mssql.secure_connection=On
—>8—

Und die DLLs php_mssql.dll und ntwdblib.dll in den Ordner C:\IP-Symcon\ kopieren. Dan den IPS Dienst neu starten.

Nun kann ich zumindest mal zur db connecten. Mal sehen wie weit ich damit komme… :slight_smile:

Der versuch mit der integrierten Sicherheit (mssql.secure_connection=On) endet so:

Warning: mssql_connect() [function.mssql-connect]: message: Fehler bei der Anmeldung für den Benutzer ‚DOMAINE\PC$‘. (severity 14) in C:\IP-Symcon\scripts\57218.ips.php on line 20

Warum MSSQL? Weil das eine der ausgereiftesten und schnellsten DB-Engines ist. Gerade WEIL die mit sowas instabilem wie Windoofs darunter klarkommen mußte… :smiley:

Und: Doch nicht über die INI… über OLE/ADO!

  1. ist das erheblich schneller, und
  2. 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…

Danke für Dein Beispiel. Leider komme ich damit noch nicht ganz klar. Ich verwende IPS2 Beta und erhalte folgende Fehlermaldung beim Ausführen (Zeilennummern sind natürlich verschoben):

Warning: Wrong parameter type for ips_variableexists() in C:\IP-Symcon\scripts\57218.ips.php on line 67

Warning: Wrong parameter count for ips_createvariable() in C:\IP-Symcon\scripts\57218.ips.php on line 68

Warning: Variable mit Namen „conf.DB.Providerstr“ existiert nicht in C:\IP-Symcon\scripts\57218.ips.php on line 69

Da dürfte anscheinend Die Funktion nicht mit V1.x kompatibel sein.

klar. da ich noch auf das Jalousienmodul warten muß, habe ich noch nicht auf V2 umgestellt. Ist aus PHP-/SQL-Sicht aber unwichtig. Nur die IPS-Befehle mußt du natürlich anpassen. Die funktionier(t)en bei V1 auf Namens-Basis, bei V2 meist per ID, also nun Integer statt String usw.

Die entprechenden Befehle findest du in der V2-Doku.

Ich hatte das auch nicht als „fertigen Produktbaustein“ sondern als prinzipiellen Gedankenanstoss, wie es geht gemeint. DIe „Komfortfunktion“ des autom. Anlegens fehlender Variablen kannst du natürlich weglassen, auch das führen eines Datenbank-Enabled-Status im IPS. Und auch den Providerstring kannst du hart reinkopieren. Nur nachdenken, was du da machst, das mußt du schon selber…

Gruß Gerd