Hallo zusammen,
da ich doch einiges an Scripten mittlerweile habe und ich teilweise vor dem Problem stehe, Daten oder auch Arrays dauerhaft zu speichern (also nicht in einer Variablen) habe ich eine kleine Klasse erstellt, die jede beliebige Daten oder auch gesamte Arrays in der Datenbank speichern kann.
Am besten die Klasse in ein eigenes Script reinpacken, diesem einen fixen namen geben: settings.ips.php
<?
/* Settings Class 2013-01-27--------------------------------------------------
Klasse zum Speichern von Werten in der Datenbank abhängig vom Script
Beispiel:
Einbindung in Script:
require_once "settings.ips.php";
$set = new settings();
Schreiben:
$set->SetValue([NAME], [WERT], [INSTANZ])
Lesen:
$set->GetValue([NAME], [INSTANZ])
Löschen:
$set->DeleteValue([NAME], [INSTANZ])
[NAME]: Name der Einstellung (Stringfeld, max. 25 Stellen)
[WERT]: Wert der zur Einstellung gespeichert werden soll (
String oder Array, max 28kb)
[INSTANZ]: InstanzID zu der die Einstellung gehört. Wird nichts angegeben, wird
die Instanz ID aus $_IPS["SELF"] ermittelt
Alle Daten anzeigen (HTML Tabelle):
echo $set->ShowEntries(); // Rückgabe STRING(HTML Tabelle)
ChangeLog:__________________________________________________________________
Version 1.0 : Initial
Version 1.1 : Now with Arrays
Version 1.2 : DeleteValue added
Version 1.3 : File Path adjusted, delete with % supported
*/
class settings {
// Falls es Probleme mit dem Pfad gibt, bitte ggf. anpassen. bzw. das user (ip-symcon\user) Verzeichnis erstellen!!!!
var $CONF_DB = "../user/settings.sqlite";
var $DBH = "";
function __construct(){
$this->CONF_DB = __DIR__ . "/".$this->CONF_DB;
// Verzeichnis ggf. erstellen
@mkdir(dirname($this->CONF_DB));
$this->initDB();
}
public function destroyDB(){
$this->DBH = null;
unlink($this->CONF_DB);
}
private function initDB() {
$this->DBH = new PDO("sqlite:".$this->CONF_DB);
$sql = "CREATE TABLE IF NOT EXISTS settings
(id INTEGER PRIMARY KEY,
instance INTEGER,
name CHAR(25),
value TEXT,
array INTEGER,
changed INTEGER)";
$res = $this->DBH->query($sql);
$this->checkdberr();
}
private function checkDBErr(){
$error = $this->DBH->errorInfo();
if($error[0] != "" & $error[0] != "00000") {
print "<p>DATABASE CONNECTION ERROR:</p>";
print_r($error);
die;
} else {
return true;
}
}
public function setValue($name, $value, $instance = 0){
$instance = intval($instance);
if($instance == 0) $instance = $_IPS['SELF'];
if(intval($instance) == 0) die("Settings SetValue: No Instance given or 0
");
if(empty($name)) die("Settings SetValue: No Name of attribute given, Abort.
");
// Alten Eintrag oder Enträge löschen
$sql = "SELECT count(*) as anz FROM settings WHERE instance=$instance AND name='$name'";
$res = $this->DBH->query($sql);
$row = $res->fetch();
$rowcount = $row["anz"];
// Single Einträg in Value
if(is_array($value)){
$value = serialize($value); // Serialisieren für Arrays
$arr=1;
} else {
$arr = 0;
}
if(strlen($value) > (1024*28))die("Settings SetValue: value to big!
");
if($rowcount > 1 || $rowcount == 0){
$sql = "DELETE FROM settings WHERE instance=$instance AND name='$name'";
$this->DBH->exec($sql);
$sql = "INSERT INTO settings (instance, name, value, changed, array) VALUES (
$instance, '$name', '$value', ".time().", $arr)";
} else {
// get ID and update
$sql = "SELECT * FROM settings WHERE instance=$instance AND name='$name'";
$res = $this->DBH->query($sql);
$row = $res->fetch();
$id = $row["id"];
$sql = "UPDATE settings set instance=$instance, name='$name', value='$value',
changed=".time().", array=$arr WHERE id=$id";
}
$this->DBH->exec($sql);
$this->checkDBErr();
}
public function getValue($name, $instance = 0, $time = false){
$instance = intval($instance);
if($instance == 0) $instance = $_IPS['SELF'];
if(intval($instance) == 0) die("Settings SetValue: No Instance given or 0
");
if(empty($name)) die("Settings SetValue: No Name of attribute given, Abort.
");
// Alten Eintrag oder Enträge löschen
$sql = "SELECT * FROM settings WHERE instance=$instance AND name='$name' ORDER by instance, name";
$res = $this->DBH->query($sql);
$this->checkDBErr();
$count = 0;
foreach($res as $row){
if($row["array"] == 1){
return unserialize($row["value"]);
} else {
if($time){ // Mit Zeitrückgabe
return Array("VALUE" => $row["value"], "LASTUPDATE"=>$row["changed"]);
}else{
return $row["value"];
}
}
}
if($count == 0){
return false;
}
}
public function getValueTime($name, $instance = 0){
return $this->getValue($name, $instance, true);
}
public function DeleteValue($name, $instance = 0){
$instance = intval($instance);
if($instance == 0) $instance = $_IPS['SELF'];
if(intval($instance) == 0) die("Settings SetValue: No Instance given or 0
");
if(empty($name)) die("Settings SetValue: No Name of attribute given, Abort.
");
// Alten Eintrag oder Enträge löschen
$sql = "DELETE FROM settings WHERE instance=$instance AND name LIKE '$name'";
$this->DBH->exec($sql);
return $this->checkDBErr();
}
public function ShowEntries(){
$sql = "SELECT * FROM settings ORDER by instance, name";
$res = $this->DBH->query($sql);
$this->checkDBErr();
$count = 0;
$output = "<table border=1>";
$output .= "<thead><tr><td>Instance</td><td>Name</td></td><td>Value</td><td>Is Array</td><td>Last Update</td></tr></thead>";
foreach($res as $row){
$output .="<tr>";
$output .=" <td>".@IPS_GetName(intval($row["instance"])).", (".$row["instance"].")</td>
<td>".$row["name"]."</td>
<td>".$row["value"]."</td>
<td>".$row["array"]."</td>
<td>".date("d.m.Y, H:i",$row["changed"])."</td>
";
$output .="</tr>";
}
$output .= "</table>";
return $output;
}
}
?>
Und hier ein Beispiel für die Verwendung im eigenen Script:
<?php
require_once("settings.ips.php");
$set = new settings;
//Etwas speichern:
$set->SetValue("STATUS", 1);
//Etwas lesen:
echo $set->GetValue("STATUS");
//oder auch ganze Arrays:
$arr["A"] = Array("NAME"=>"Mustermann", "ALTER" => 40);
$arr["B"] = Array("NAME"=>"Mustermax", "ALTER" => 10);
// Speichern
$set->SetValue("PERSONEN", $arr);
// Lesen:
print_r($set->GetValue("PERSONEN"));
?>
Prinzipiell werden Die Daten zum aktuellen Script gespeichert dh. Sind Skriptspezifisch, Man kann aber auch einen 3. Parameter mitgeben, wo man einen Identifier (zb. instanz ID) mitgibt, dann kann auch von untersch. Skripten darauf zugegriffen werden.
Dies kann benutzt werden um diverse Informationen in Skripten dauerhaft zu speichern und beim späteren Aufruf wieder zu lesen.
Technisch wird das ganze in einer kleinen SQLITE DB abgelegt.
Die Inhalte der DB kann man anezigen lassen mit folgendem Script:
<?
require_once("settings.ips.php");
$set = new settings;
echo $set->ShowEntries();
?>
Anwendungsmöglichkeiten:
- Wenn man einen Schalter mehrfach drückt, dann kann man die ‚Counts‘ im Script mitzählen
- Bei einem Wartungsscript kann man letzte Abfragen von Variablen / Instanzen mitspeichern
- Interne technische Variablen etc.
Hier muss man nicht immer extra Variablen anlegen für Variablen / Zustände die nicht direkt in IPS verwendet werden sollen (WebFront etc).
Update:
GGf. müsst Ihr in der PHP.INI im IPS Verzeichnis noch die Extension für SQLITE aktivieren.
Dazu ggf. folgende zwei Zeilen in die PHP.INI im IPS Verzeichnis einfügen und sicherstellen dass die dlls im ext Verzeichnis liegen.
extension = php_pdo_sqlite.dll
extension = php_sqlite3.dlll