PHP PHP,SQL,Verzeichnisse

Verstehe ich nicht...
PHP:
$installierte_programme = array();

while (blubs) {
    ...
    $installierte_programme[] = 'prog'
    ...
}

var_dump($installierte_programme);

Damit kannst du auch außerhalb der while-Schleife auf die Liste der Programme (in dem Beispiel $installierte_programme) zugreifen.
 
Der Lord schrieb:
Die Sicherheit war schon eingebaut, habe diese nur der Übersichtshalber für dieses Forum entfehrnt.
 
Zuletzt bearbeitet von einem Moderator:
Also extra für uns solche Späße eingebaut?

PHP:
$as_id_prog=$_POST['as_id_prog'];
mysqli_query($link,"DELETE FROM `as_programme` WHERE as_id_prog=$as_id_prog", FALSE);

Wäre doch nicht nötig gewesen. ;)

Edit: Okay, klang etwas harsch, sorry. Ich eigentlich wollte nur darauf hinaus, dass ich mir nicht vorstellen kann, dass der Code vorher entsprechend abgesichert war und nur für die Darstellung an dieser Stelle vereinfacht wurde - um nur ein Beispiel aufzuzeigen.
Letztendlich haben wir dich ja nun genug für das Thema sensibilisiert und du weißt worauf zukünftig zu achten ist. :)

Kamst du mit deiner Auflistung mittlerweile voran?
 
Zuletzt bearbeitet:
Der Lord schrieb:
Und PDO ist, einmal verstanden, wirklich sehr umgänglich und wie ich finde auch sehr übersichtlich bei späteren Codeänderungen. Daher mein Tipp: nicht zu lange hinauszögern. :)
PDO ist bei Parametrisierung in Verbindung mit SQL Server / TSQL teilweise sehr zickig, beispielsweise bei der Übergabe von float values an [geopgraphy]::STGeomFromText (für das Abspeichern von Koordinaten in geography types columns) dann muss ich für den Kack die Variablen erst wieder auf herkömmliche Weise in die query bringen und kann mir die Parametrisierung gleich sparen. Ich verwende das eher für Risikodiversifikation.
 
  • Gefällt mir
Reaktionen: Der Lord
Verstehe das Problem nicht.

1. Während foreach ALLE “Programme" in der DB als Programm-Tabelle registrieren.
2. Dabei ein IsInstalled Attribut direkt in dieser Tabelle halten und per Insert auf $False setzen.
3. Wenn das Programm installiert wird, das Flag für dieses Programm auf $True setzen.

* So wenig Dateisystem wie möglich. *
 
  • Gefällt mir
Reaktionen: Der Lord
Der Lord schrieb:
Ja, das weiß ich.
Ich habe das schreiben von PHP und SQL Scripten erst im Januar 2021 für mich als neues Hobby entdeckt.
Bin nun im Rentenalter und möchte nicht wie viele andere die ganze Woche über Kreuzworträtsel lösen und zum Wochenende den ganzen Zeitungsmüll zum Container schleppen oder wie es andere in meinem alter machen, den ganzen Tag in der Kneipe sitzen und das Geld im Spielautomaten verplempern.
Mein Hobby ist seit sechs Monaten das schreiben von Scripten in PHP und SQL geworden, es macht mir sehr viel Spaß, erst Recht wenn man eine gute Community im Rücken hat die bei Fragen unterstützend helfen. Ich bin gerade dabei ein cms-system zu coden, es funktioniert bereits sehr gut, aber es hat noch einige Stolpersteine.
Das bedeutet nun nicht, dass das cms-System irgendwann mal auf einen Webserver laufen wird, nein, das wird es wohl eher nicht.
Das CMS-System läuft nur Local auf meinem heimischen Rechner.
Warum mache ich das? Um meiner schleichenden Demenz etwas entgegen zu stellen, diese Krankheit kann man nur mit intensiven Hirntraining mindern. Ich hasse Kreuzworträtsel. :-)
Warum dann gerade ein CMS-System? Weil das mitunter einige tausend Seiten Code und alle miteinander verflochten sind, das überfordert oft mein Hirn, ist anstrengend, aber es hilft.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Drexel, Der Lord und floq0r
Also zuerstmal ein dickes Lob für deine Motivation, ein eigenes CMS zu schreiben. Es gibt jetzt aus meiner Sicht mehrere Sachen, die sich an deinem aktuellen Ansatz verbessern lassen. Dazu müsste ich allerdings wissen, was ein "Programm" deiner Ansicht nach ist bzw. was es alles können soll.

Ich glaube nämlich, dass du die Programm-Verwaltung, den Installer und das Programm selbst alles in einem vermischst.


Mein Vorschlag wäre folgender:
  • Nutze für ein "Programm" ein Verzeichnis statt nur einer Datei (das macht es flexibler)
  • Brauchst du für die Verwaltung der Programme wirklich eine Datenbank oder würde es reichen, einfach die "installierten" Programme in ein extra Verzeichnis zu kopieren
    • programme_verfuegbar/....
    • programme_installiert/...
  • Wenn du lernen willst, würde ich dir raten, dich mit Objektorientierter Programmierung zu beschäftigen (das ist zwar nicht erforderlich, wäre aber hilfreich für deine Idee)

Üblicherweise nennt man ein "Programm" übrigens eher "Plugin" oder "Addon". Dazu schreibt man normalerweise ein Interface (allgemein) und für jedes Programm eine Klasse. Achtung, das ist ungetesteter Pseudocode und soll nur die grundlegende Funktionsweise demonstrieren.

PHP:
interface Plugin {
    public function activate();
    public function deactivate();
    public function uninstall();
}

class Guestbook implements Plugin {
    private $id = "081541711";
    private $version = 1.0;
    public function __construct($db) {
        $this->db = $db;
    }
  
    public function activate() {
        $db->executeInsert("INSERT INTO plugins (id, name, version) VALUES (?, ?, ?)" [$this->id, "Guestbook", $this->version]);
    }
  
    public function deactivate() {
        $db->executeInsert("DELETE FROM plugins WHERE id = ?" [$this->id]);
    }
  
    public function uninstall() {
        $this->deactivate();
        unlink('plugins/Guestbook.php')
    }
  
}
 
sandreas schrieb:
Also zuerstmal ein dickes Lob für deine Motivation, ein eigenes CMS zu schreiben. Es gibt jetzt aus meiner Sicht mehrere Sachen, die sich an deinem aktuellen Ansatz verbessern lassen. Dazu müsste ich allerdings wissen, was ein "Programm" deiner Ansicht nach ist bzw. was e
Ich glaube nämlich, dass du die Programm-Verwaltung, den Installer und das Programm selbst alles in einem vermischst.
Es gibt ein Ordner "Programme" in anderen cms heißt dieser meisten "Plugins" oder auch "Tools"
Mein Ordner heißt "Programme" in diesem Ordner liegen die Unterordner

Chat
----proginst.php <!-- Installationsscript für die DB -->
----chat.php
----chat_inc.php
----languarge <!-- Ordner
------german.php
------english.php
----image <!-- Ordner für Systembilder -->
----user_image <!-- Bilder die User im Chat posteten -->

Forum
----proginst.php <!-- Installationsscript für die DB -->
----forum.php
----forum_inc.php
----languarge <!-- Ordner
------german.php
------english.php
----image <!-- Ordner für Systembilder -->

News
----proginst.php <!-- Installationsscript für die DB -->
----news.php
----news_inc.php
----languarge <!-- Ordner
------german.php
------english.php
----image <!-- Ordner für Systembilder -->
----news_cat.php
-----news_cat_image <!-- Ordner für Bilder der News Categorien -->
-----news_image <!-- Ordner der Bilder der News -->

USER
...
USW

Es gibt natürlich weitere Ordner mit deren Unterordnern wie eigene_seiten, calendar usw.
Ich mache das nicht um unbedingt ein cms zu schreiben, ich mache das weil ich Spaß an der Sache habe.
Die Installation der Plugins und auchdie Deinstallation funktionieren einwand frei, das ist auch nicht das Problem.
Mein Problem ist, das ich im Adminbereich (backend) zwei Tabellen habe, die obere Tabelle zeigt die Installierten Plugins und die untere Tabelle zeigt die im Ordner befindlichen aber noch nicht installierten Plugins.
Nun zeigt die untere Tabelle nicht nur die noch nicht installierten Plugins, sondern auch die Installierten.
Die installierten Plugins müssen ausgeblendet werden.
Also vergleiche ich zwei daten,1. aus der DB die mit WHILE aufgelisteten Plugins und 2. die aus dem Ordner mit foreach aufgelisteten Plugins und blende die Plugins mit display: none aus, die gleiche Namensgleichheit haben. Beispiel, ist in DB der Ordnername calendar und im Pluginordner der Ordnername calendar vorhanden, wird in der Ordnerauflistung für den Ordner der display: none gesetzt und ist damit nicht mehr sichtbar.
Wenn das mal so funktionieren würde. funktioniert aber nicht.
 
Zuletzt bearbeitet:
Die Installation der Plugins und auchdie Deinstallation funktionieren einwand frei

Es ging mir auch nicht darum, das in Frage zu stellen. Oft ist es nur sinnvoll, das Konzept an sich noch mal zu überdenken, wenn man an seine Grenzen stößt. Ein "alter Hase" wie ich hängt sich häufig an Begrifflichkeiten auf.

So wie ich das Verstehe, "aktivierst" du die Programme, der Code bleibt aber an Ort und Stelle und wird nicht verschoben oder kopiert. Es gibt auch keine Online-Quelle, von wo die Programme heruntergeladen und installiert werden.

Wenn du das ganze dann über die Datenbank verwalten willst, würde ich einfach ALLE Programme in die MySQL-Tabelle schreiben und eine Spalte "active" hinzufügen, in der man entscheiden kann "aktiv" oder "inaktiv". Dann kann deine Liste sehr einfach angezeigt werden.

Alternativ würde ich einfach eine Liste mit allen Programmen aus dem Verzeichnis ausgeben. Wichtig ist dabei, dass die Namen absolut 100% identisch sind (Groß- und Kleinschreibung inbegriffen):



PHP:
$programme = glob("programme/*");
$installiert = [];

$sql = "SELECT programm FROM programme";
while($row = $db->fetchRow()) {
    $installiert[] = $row["programm"];
}

$nichtInstalliert = array_diff($programme, $installiert);
 
sandreas,
genau das mache ich ja auch. Aktive Programme werden als aktiv angezeigt.
Ich kann nicht alle Plugins aus dem Ordner Programme installieren, macht auch wenig sinn.
Wenn ich ein neues Plugin schreibe z.B. ein Gästebuch, dann muss ich es erst umständlich installieren.
Mit scandir($dir); lass ich mir alle Plugins anzeigen die im Ordner vorhanden sind. Mit einem radio Button kann ich diese aktivieren und die Plugindaten werden in die DB übertragen. In der oberen Tabelle werden mir alle installierten Plugins angezeigt und ich kann diese auch wieder deaktivieren, dann ist das deaktivierte Plugin nicht mehr in der DB. Funktioniert auch super.
Mein Problem besteht immer noch darin, das scandir($dir); nicht die installierten Plugins auflisten soll.
Ich muss also bevor scandir($dir); mir alle Pluginordner auflistet, die installierten Plugins herausfiltern. Aber wie?
Ergänzung ()

sandreas,
hier mal ein Sceenshot zur verdeutlichung.
screen-plugins.jpg
 
Zuletzt bearbeitet:
Man benötigt eine "ProgrammID". Diese muss sowohl im Verzeichnis als auch in der Datenbank eindeutig sein und vor allem gleich. Da du mit Verzeichnissen arbeitest, würde ich einfach den Namen des Verzeichnisses nehmen (Convention over Configuration). Sprich: Forum, Guestbook, etc.

Mit dem Code unten musst du also nur noch das $installiert mit den IDs füllen, die in der Datenbank stehen.

PHP:
// hier die installierten aus der Datenbank laden
// ...
$installiert = ["Forum", "Guestbook"];

// jetzt die Logik zum Filtern
$programmeVerzeichnis = __DIR__ . "/programme/";
$programme = glob($programmeVerzeichnis . "*");

$programmIds = array_map(function ($verzeichnis) {
    $parts = explode(DIRECTORY_SEPARATOR, $verzeichnis);
    return array_pop($parts);
}, $programme);


$nichtInstalliert = array_filter($programmIds, function($id) use($installiert) {
    return !in_array($id, $installiert, true);
});

echo "<pre>".PHP_EOL;
echo "alle:".PHP_EOL;
print_r($programmIds);

echo PHP_EOL."installiert:".PHP_EOL;
print_r($installiert);

echo PHP_EOL."nicht installiert:".PHP_EOL;
print_r($nichtInstalliert);
 
  • Gefällt mir
Reaktionen: Coffeejunky_1
Danke sandreas.
dein Code kam leider etwas zu spät, es gibt eine einfache Lösung, die nennt sich array_diff.
Das funktioniert richtig gut und hat mein Problem damit gelöst.
array_diff vergleicht zwei Arrays miteinander und gibt die Daten die nicht übereinstimmen dann aus.
Für alle die das selbe oder ähnliches Problem haben, poste ich hier den Code.

Code:
<?php


//--DB Zugangsdaten und andere Systemrelevante Anweisungen
require('../'.SYSTEM.'/include.php');


//-------------DB Abschnitt---------------------------------------------------------------


//hier wird das active Plugin aus der DB abgefragt ausgegeben.
$res = mysqli_query($dblink, "SELECT * FROM `as_programme` ORDER BY as_id_prog ASC" );

while ($prog = mysqli_fetch_assoc($res))
{
    
    $as_ordner=$prog["as_ordner"];
    
    //Wird benötigt um die Verzeichnisse von den bereits Installierten Verzeichnissen heraus zu filtern.
    $dbfiles[]=array($as_ordner);
}


//Das Array $dbfiles enthält die in der DB gespeicherten Ordnernamen


//$dbfiles mit foreach auspacken und in $filedb ablegen.
foreach ($dbfiles as $dbfile) {
    foreach ($dbfile as $ausdbfile) {
        $filedb[]=$ausdbfile;
    }
}
//-------------DB Abschnitt ende--------------------------------------------------------

//-------------Abschnitt Pluginordner---------------------------------------------------

//Pluginverzeichniss öffnen
$dir="../".PLUGINS."/";

//Alle Ordnernamen aus dem Pluginordner einlesen einlesen
$files1 = scandir($dir);

Pluginordner auspacken und im Array $file speichern
foreach ($files1 as $file) {
        
        // Höhere Verzeichnisse nicht anzeigen!
        if ($file != "." && $file != "..") {
            
        $fileordner[]=$file;

}
}
//-------------Abschnitt Pluginordner ende-------------------------------------------



//-------------Abschnitt DB Pluginnamen Array $filedb und Pluginnamen Array $fileordner vergleichen und das ergebnis mit echo ausgeben


//Array $fileordner mit Array $filedb vergleichen und und die Daten die nicht übereinstimmen in Array $result speichern    
$result = array_diff($fileordner, $filedb);

//$result auspacken und in $ergebnis speichern.
foreach ($result as $ergebnis) {

echo $ergebnis;  //Hier werden nun nur noch die Plugins (Ordnernamen) angezeigt die in der DB nicht eingetragen sind.

}


?>
Ergänzung ()

Hier mal das Ergebnis als Screenshot.
 

Anhänge

  • 2021-07-06-10-48-localhost.png
    2021-07-06-10-48-localhost.png
    336 KB · Aufrufe: 220
Zuletzt bearbeitet:
Als Tipp: Schau dir mal an, wie viele Schleifen du hast. Das sind viel zu viele... du machst es dir echt kompliziert. Statt zuerst den ordner zu scannen und dann in der DB-while-Schleife den Abgleich zu machen, lädst du erst alles komplett, restrukturierst es dann noch mal und am Schluss machst du ein diff...

Das hier tut nahezu das selbe mit weniger Schleifen:
PHP:
// ZUERST:
//Alle Ordnernamen aus dem Pluginordner einlesen einlesen
$files1 = scandir($dir);
$fileordner = [];

// Pluginordner auspacken und im Array $file speichern
foreach ($files1 as $file) {
    // Höhere Verzeichnisse nicht anzeigen!
    if ($file != "." && $file != "..") {
        $fileordner[$file]=$file;
    }
}

//hier wird das active Plugin aus der DB abgefragt ausgegeben.
$result = $fileordner;
while ($prog = mysqli_fetch_assoc($res))
{
    $as_ordner=$prog["as_ordner"];
    // HIER DIE INSTALLIERTEN RAUSFILTERN
    if(isset($result[$as_ordner])){
        unset($result[$as_ordner]);
    }
}
$result = array_values($result);

foreach ($result as $ergebnis) {
    echo $ergebnis.PHP_EOL;  //Hier werden nun nur noch die Plugins (Ordnernamen) angezeigt die in der DB nicht eingetragen sind.
}

Aber naja, Hauptsache es geht jetzt :-)
 
  • Gefällt mir
Reaktionen: Der Lord
sandreas schrieb:
Als Tipp: Schau dir mal an, wie viele Schleifen du hast. Das sind viel zu viele... du machst es dir echt kompliziert. Statt zuerst den ordner zu scannen und dann in der DB-while-Schleife den Abgleich zu machen, lädst du erst alles komplett, restrukturierst es dann noch mal und am Schluss machst du ein diff...

Ja funktioniert ohne Probleme. Aber ich werde es mal mit deinem Code testen. Danke
Ergänzung ()

sandreas,
du hast Recht, dein Code ist kürzer und einfacher und macht das Selbe wie mein Code.
Ich werde den von dir übernehmen und entsprechend anpassen. DANKE
Ergänzung ()

Allerdings verstehe ich das nicht ganz.
Code:
 if(isset($result[$as_ordner])){
        unset($result[$as_ordner]);
       
    }
Was bewirkt unset und wozu?
 
Zuletzt bearbeitet:
siehe: unset.

PHP bietet eine unglaublich ausführliche Doku, die wirklich einen Blick wert ist. Das meiste kann man sich damit selbst zusammenreimen. Der Rest ergibt sich aus dem logischen Zusammenhang.
Im Code ist die Stelle sogar noch vorbildich beschrieben: "HIER DIE INSTALLIERTEN RAUSFILTERN". Mit unset wird also, sofern die darüber liegende if Abfrage erfolgreich ist, der Eintrag aus dem Array entfernt.
 
  • Gefällt mir
Reaktionen: sandreas
Coffeejunky_1 schrieb:
Was bewirkt unset und wozu?
Vielleicht noch als Ergänzung zu @Der Lord 's völlig richtiger Erklärung: In PHP kann man Arrays nicht nur numerisch verwenden, sondern auch mit strings (Assoziativ). In anderen Sprachen nennt man das dann oft ein "Dictionary" oder eine "HashTable".

Vorteil: Man kann in deinem Fall direkt auf den gesuchten Wert zugreifen und ihn entfernen, statt sich erst den Index für den gesuchten Wert rauszusuchen

Nachteil: In PHP spielt das meist keine Rolle, aber in anderen Sprachen können Dictionaries langsamer sein und, was noch wichtiger ist, bei Multithreading problematisch. Aber das braucht dich hier nicht zu stören :-)

PHP:
// numerischer index
$einArray = [];
$einArray[0] = "Guestbook";
$einArray[1] = "Forum";

// assoziativer index
$einArray = [];
$einArray["Guestbook"] = "Guestbook";
$einArray["Forum"] = "Forum";
 
  • Gefällt mir
Reaktionen: Der Lord
Zurück
Oben