Nee
Das CREATE TABLE IF NOT EXISTS kenn ich so nur für Tabellen.
Solange die Datenbank offen ist machen die Abfragen aber nichts und sind fix.
PHP:
$sth = $dbh->prepare('SELECT id FROM cache WHERE id = 1'); // Ersten Datensatz mit id==1 holen
$sth->execute();
$Status = $sth->fetch(PDO::FETCH_ASSOC);
if ($Status=="") { // Wenn kein Datensatz vorhanden estellen
$count = $dbh->exec("INSERT INTO cache (daten) VALUES ('Ganz viel Text und so weiter und so fort"));
}
...ab jetzt macht auch erst ein Update Sinn.
Das prüft auf den Datensatz selber, aber id ist ja auch nur ein Feld.
Die Pseudogeräte und eins pro Datensatz, richtig?
id | active | type | temp | watt | command | command1 | command0 |
---|
| | | | | | | |
2 | 1 | S | 20 | 2.25 | https://snom2.fritz.box/command.htm?key=DND | https://snom2.fritz.box/command.htm?key=P11 | https://snom2/screen.bmp |
1 | 1 | S | 20 | 2.25 | https://snom1.fritz.box/command.htm?key=DND | https://snom1.fritz.box/command.htm?key=P11 | https://snom1/screen.bmp |
(Hier gibts noch keinen Namen, die id ist pro Skript "hardkodiert")
Da die id aber als "autoincrement" angelegt wird,
gibt es noch die Methode unabhängig von dieser
den Datensatz an einen anderen Feldnameninhalt zu Identifizieren.
Kurze Prüfung auf den (eindeutigen) Inhalt in den Datensätzen dann,
wenn nicht vorhanden anlegen, ansonsten updaten.
Die Pseudoskripte sind immer selber dafür verantwortlich, dass sie einen ordentlichen Datenbankeintrag bekommen.
...und müssen deshalb auch die dafür notwendigen Prüfungen erledigen.
Bei der obigen Tabelle könnten die Skripte sich an den "commands" erkennen.
...denn sie haben es selber in die Datenbank schreiben lassen.
Beispiel eines der oben in der Liste angezeigten Pseudoskriptes...
pseudosnom1.php (läuft so schon seit Monaten bei mir)
PHP:
<?php // Schalter speichert/liest/liefert Schaltzustand aus SQLite3 Datenbank, Tabelle: pseudodevice
require_once("db.php");// SQLite3 Datenbankoeffner
require_once("include/includefunctions.php");
$p_id=1;// Diese id aus der Datenbank gehoert diesen Schalter
try {// Dann versuchen wir es mal...
$count = $dbh->exec("CREATE TABLE IF NOT EXISTS pseudodevice (id INTEGER PRIMARY KEY, active VARCHAR(255), type VARCHAR(255), temp VARCHAR(255), watt VARCHAR(255), command VARCHAR(255), command0 VARCHAR(255), command1 VARCHAR(255))");
$sth = $dbh->prepare('SELECT id FROM pseudodevice WHERE id = '.$p_id.'');
$sth->execute();
$Status = $sth->fetch(PDO::FETCH_ASSOC);
if ($Status=="") {
$count = $dbh->exec("INSERT INTO pseudodevice (active,type,temp,watt,command,command0,command1) VALUES ('1','S','20','2.25','https://snom1.fritz.box/command.htm?key=DND','https://snom1/screen.bmp','https://snom1.fritz.box/command.htm?key=P11')");
}
if ($_GET[info]=="status") {
$sth = $dbh->prepare('SELECT active,type FROM pseudodevice WHERE id = '.$p_id.'');
$sth->execute();
$Status = $sth->fetch(PDO::FETCH_ASSOC);
if ($Status[active]=="1") {
throw new Exception(trim($Status[type])."#".trim($Status[active])."#");
}
if ($Status[active]=="0") {
throw new Exception(trim($Status[type])."#".trim($Status[active])."#");
}}
if ($_GET[schalter]=="1") {
$count = $dbh->exec("UPDATE pseudodevice SET active = '1' WHERE id = ".$p_id."");
$sth = $dbh->prepare('SELECT id,active,type,command FROM pseudodevice WHERE id = '.$p_id.'');
$sth->execute();
$Status = $sth->fetch(PDO::FETCH_ASSOC);
if ($Status[active]=="1") {
web($Status[command],"");
throw new Exception(trim($Status[type]."#".$Status[active])."#");
}}
if ($_GET[schalter]=="0") {
$count = $dbh->exec("UPDATE pseudodevice SET active = '0' WHERE id = ".$p_id."");
$sth = $dbh->prepare('SELECT active,type,command FROM pseudodevice WHERE id = '.$p_id.'');
$sth->execute();
$Status = $sth->fetch(PDO::FETCH_ASSOC);
if ($Status[active]=="0") {
web($Status[command],"");
throw new Exception(trim($Status[type]."#".$Status[active])."#");
}}
throw new Exception($Status[type]."##E##");
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
Wenn selbst die Datenbank nicht vorhanden, erstellen, wenn kein Eintrag zum Pseudo, erstellen, dann normaler Ablauf.
Hier noch mit der hardkodierten id:
$p_id=1;// Diese id aus der Datenbank gehoert diesen Schalter
Jede SaS Statusmeldung wird im try{} mit throw() vorbereitet und im catch{} für SaS bereitgestellt.