PHP im Javascript ergänzen, ich brauche Variablen

Hallo Ulrich,

Sorry für die Verzögerung, ich war ein paar Tage in Berlin.
Musste mal zur IFA, bin nun aber wieder zu Hause.

Also, mit JSON bekomme ich das nicht hin. Ich müsste Dich bitten, mir
das zu coden, das wäre mir aber unangenehm.

In meinem Kopf steht der Gedanke, die Sequenz irgendwie zu erfassen,
und in der Datenbank in einem Feld in der Reihenfolge verkürzt darzustellen,
z.B. so:

Aktor-ID|Befehl|Wert1|Wert2|Wert3
Aktor-ID|Befehl|Wert1|Wert2|Wert3
Aktor-ID|Befehl|Wert1|Wert2|Wert3
Pause|Zeit|Wert4
Aktor-ID|Befehl|Wert1|Wert2|Wert3
Pause|Zeit|Wert4
Aktor-ID|Befehl|Wert1|Wert2|Wert3
...
...
...

Ich weiß nur noch nicht genau, wie ich aus dem Drag-Feld die
Szene erfassen kann. Muss ja irgendwie eine Schleife sein,
damit ich die Reihenfolge bekomme.

Gleiches gilt für das Bearbeiten. Ich hab die Szene so verkürzt, in der
Datenbank, durchlaufe sie in einer Schleife, und packe sie in das Drag-Feld,
aber auch da weiß ich noch nicht, wie das gehen soll.
Wenn die Sequenz so in der Datenbank steht, kann ich sie in der
Reihenfolge abarbeiten und ausführen. Jede Zeile wird dann ein
http-Request.

So meine Vorstellung.
 
Ich müsste Dich bitten, mir
das zu coden, das wäre mir aber unangenehm.
Wenn wir das vermeiden wollen, führt kein Weg daran vorbei, dass ich es dir erkläre und ich fürchte, das wird bei der herkömmlichem Methode mit einem Datensatz pro Aktion komplizierter als mit JSON. Ich vermute, deine Abneigung gegen letzteres kommt dadurch, dass wir bei einem früheren Projekt von dir einige Problem damit hatten. Diese entstanden dadurch, dass wir Strukturen JSON-kodieren mussten wo Zeilenumbrüche in den Werten (Strings) waren und die Syntax des JSON zerlegt wurde. Das ist hier nicht zu befürchten.
in der Datenbank in einem Feld in der Reihenfolge verkürzt darzustellen
Da es sich bei der Struktur, die Du angibst, um ein Array handelt, geht das überhaupt nur in einem Feld vom Typ JSON.
Zunächst mal noch eine Frage: Was soll in den Werten Wert1|Wert2|Wert3 drin sein? Ich vermute, es werden Werte dabei sein, die für die Aktoren spezifisch sind, z. B. die IP-Adresse?
 
Man kann kein Array in der Datenbank speichern?
Das ist blöd.... ich dachte, das würde gehen.

Zunächst mal noch eine Frage: Was soll in den Werten Wert1|Wert2|Wert3 drin sein? Ich vermute, es werden Werte dabei sein, die für die Aktoren spezifisch sind, z. B. die IP-Adresse?
Die IP-Adresse muss es nicht zwingend sein, die könnte man anhand der Aktor-ID aus der Datenbank holen, aber die könnte auch mit rein, macht es vielleicht sogar einfacher.
Mit Wert1, Wert2, Wert3 ist folgendes gemeint:
Jeder Aktor arbeitet anders. Es gibt Aktoren, die haben nur einen Kanal, es gibt Aktoren, die haben 2 Kanäle. Dann gibt es Dimmer, die außer ON/OFF noch den BRIGHTNESS für die Helligkeit haben, und wenn man es ganz streng nimmt, gibt es auch noch RGB-Aktoren, die für jede Farbe weitere Werte haben.
Mal ein paar Beispiele:

1. Kanal on/off Aktor:
http:192.168.xxx.xxx/relay/0?turn=on

2. Kanal on/off Aktor:
http:192.168.xxx.xxx/relay/1?turn=toggle

Dimmer:
http:192.168.xxx.xxx/light/0?turn=on&brightness=xxx

RGBW:
http://192.168.xxx.xxx/light/0?turn=on&red=250&green=0&blue=0&white=0&effect=0

So sind die http-Requests aufgebaut.
Die vielen Werte stehen also für Farben, Helligkeit, on/off/toggle, usw.
Letztendlich könnte man auch den kompletten Request statt eines Verkürzten setzen,
ich bin mir da nicht sicher, welches nun die beste Strategie ist. Deswegen gibt es halt die
generelle Datenbank für die Aktoren, wo solche Requests ohne die IP-Adresse hinterlegt sind,
und eben die Datenbank der "eigenen Aktoren", wo hinterlegt ist, welcher Aktor welche IP-Adresse hat,
und was für ein Typ er eben ist.

Wenn Du mir das schreiben kannst, freue ich mich natürlich, aber ich habe wirklich
Hemmungen, Dich darum zu bitten. Und ob eine Erklärung dafür ausreicht... ich weiß es nicht.
 
Die IP-Adresse muss es nicht zwingend sein, die könnte man anhand der Aktor-ID aus der Datenbank holen
Das ist schon Mal eine gute Nachricht, es gibt also anscheinend schon eine Tabelle mit den Daten des Aktors. Wenn sie jetzt zusätzlich in den Aktionen stehen würde, hätten wir Redundanz drin und das wollen wir vermeiden.
Jeder Aktor arbeitet anders. Es gibt Aktoren, die haben nur einen Kanal, es gibt Aktoren, die haben 2 Kanäle. Dann gibt es Dimmer, die außer ON/OFF noch den BRIGHTNESS für die Helligkeit haben, und wenn man es ganz streng nimmt, gibt es auch noch RGB-Aktoren, die für jede Farbe weitere Werte haben.
Auch das spricht dafür, mit JSON zu arbeiten, denn dann kann man für jeden Aktor individuell die Struktur der Daten fest legen.

Ich habe da einiges was wir brauchen, schon in der Schublade.

Daten als POST-Parameter verschicken:
Code:
    <span id="out"></span>
    <script>
        // Neues FormData-Objekt erzeugen:
        const params = new FormData();
        // ... und die Parameter, die übertragen werden sollen, eintragen:
        params.append('param1', 'some-param');
        params.append('param2', 'some-other-param');
        params.append('numparam', '1.24');
        // Parameter mit der Methode POST an das Skript testpost.php schicken:
        fetch('testpost.php', {
            method: 'post',
            body: params
        }).then(res => {
            // Die Antwort vom Server wird als Text ausgewertet:
            return res.text();
        }).then(res => {
            // Antwort vom Server in der Console ausgeben:
            console.log(res);
            // ... und in HTML-Element eintragen:
            document.getElementById('out').innerHTML = res;
        });

Das brauchen wir nur ein wenig umzuändern, um die Aktionen als JSON zu verschicken:
Code:
    <span id="out"></span>
    <script>
        // Voraussetzung: Die Aktionen stehen in einem Array "aktionen"
        // zur Verfügung.

        // Neues FormData-Objekt erzeugen:
        const params = new FormData();
        // Das Array JSON-kodiert dort eintragen:
        params.append('aktionenJSON', JSON.stringify(aktionen));

        // Parameter mit der Methode POST an das Skript testpost.php schicken:
        fetch('testpost.php', {
            method: 'post',
            body: params
        }).then(res => {
            // Die Antwort vom Server wird als Text ausgewertet:
            return res.text();
        }).then(res => {
            // Antwort vom Server in der Console ausgeben:
            console.log(res);
            // ... und in HTML-Element eintragen:
            document.getElementById('out').innerHTML = res;
        });
Und auf dem Server können wir die Aktionen aus dem POST-Parameter mit dem Key 'aktionenJSON' nehmen und unverändert in die DB eintragen.

Übrigens, die then-Zweige dienen nur dazu, die Antwort vom Server auszugeben. Man könnte sich diese, wenn man sie nur zum Debuggen braucht, auch im Netzwerktab der Entwicklerwerkzeuge ansehen.

Die nächste Aufgabe ist dann, die Aktionen aus der Zielliste in ein Array zu packen. Falls Du nicht weißt, wie das geht, werde ich es dir ebenfalls zeigen.
 
Zurück