PHP PHP,SQL,Verzeichnisse

Coffeejunky_1

Cadet 2nd Year
Registriert
Juni 2021
Beiträge
25
Hallo,
hoffe hier Hilfe zu finden, da ich mit meinem Problem seit zwei Wochen dran sitze und ich weiß nicht wie viele Google-Seiten ich schon ohne Erfolg gelesen habe.
Das Script das ich geschrieben habe, funktioniert hat nur einen kleinen HAken.
In einem Ordner liegen mehrere Programme.
../programme/
chat/chat.php
user/user.php
forum/forum.php
kalender/calendar.php
usw.
Klicke ich in der Auflistung aus den Ordnern ein Programm an z.B. Chat, so wird das Programm (Chat) ohne Probleme in der DB übernommen, installiert und in einem separatem Fenster über der Ordnerliste als installiertes Programm angezeigt. Das ist ok.
Nun zum Problem, Programme die bereits installiert sind und in der DB Auflistung angezeigt werden, dürfen in der Ordnerliste nicht mehr angezeigt werden.
Also, die Ordnerliste die mit scandir angezeigt wird sollen nur die noch nicht installierten Programme anzeigen, alle anderen müssen ausgeblendet werden.
Ich habe schon ausprobiert, die Installierten Programme aus der DB in einem Array zu packen ($array1) und die mit scandir aufgelisteten Programme aus dem Ordner in einem array ($arra2) zu packen und mit array_diff zu vergleichen und dann das array mit foreach aufzulisten.
Beispiel:
array_diff ( array $array1 , array $array2= ? ) : array

Hat jemand einen Lösungsansatz?
Die Datei programme.php hier im Anhang läuft unter meinem CMS-System, sollte dieses Programm ohne das cms-system aufgerufen werden, so gibt es einige Fehlermeldungen, das ist normal.
 

Anhänge

  • programme.zip
    3,2 KB · Aufrufe: 193
Wie differenzierst du denn zwischen "Installiert" und "Nicht installiert"? Kannst du den State irgendwie abfragen?
 
e_Lap schrieb:
Genau das ist mein Problem, das differenzieren.
Nur die Programme in den Ordnern anzeigen die nicht in der DB eingetragen sind.
 
Zuletzt bearbeitet von einem Moderator:
Kannst du dem Markup nicht einen state uebergeben und dann zur Not display:hidden oder so setzen?
So ganz habe ich dein Setup auch nicht verstanden.
Was fuer Ordner? Nur eine visuelle Gruppierung? Webapp Darstellung? Doch die Windows Explorer Ordner?
 
e_Lap schrieb:
Das ist ein cms-system das in einem virtuellem Server (XAMPP) läuft und mit php geschrieben wurde.
Das Programm funktioniert soweit super, nur mit dem einen Makel das auch die Programme im Ordner programme aufgelistet werden die bereits installiert wurden.
 
Zuletzt bearbeitet von einem Moderator:
Ja, aber wie werden diese "Ordner" dargestellt / erzeugt?

So von aussen, quasi komplett ohne Beispiel, ist das etwas tricky :S
 
e_Lap schrieb:
Ja, aber wie werden diese "Ordner" dargestellt / erzeugt?
Der Ordner programme mit seinen Unterordner chat, forum, usw. sind doch schon vorhanden und werden mit einer foreach-Schleife korrekt angezeigt, da ist ja nicht das Problem.
Mein Problem ist, das die in der bereits DB eingetragene Programme dann nicht mehr in der foreach-Schleife der Ordner aufgelistet werden dürfen.
Also muss erst ein Vergleich zwischen den Programmen in der DB und den Ordnern stattfinden um dann die programme die in der DB eingetragen sind aus der foreach-Schleife auszublenden.
Aber wie?
 
Ich bin in php nicht firm, aber es muss doch auch irgendwie eine Filter Condition moeglich sein:

Java:
List<Programme> filteredProgramme = getProgramme()
            .stream()
            .filter((program) -> isInstalled(programm.getId()))
            .collect(Collectors.toList());

Du suchst dir deine Liste zusammen und checkst halt fuer jede ListenEintrag ob er installiert ist, wenn nein, fuegst du ihn zu der Liste hinzu, die der Ordner darstellt.
 
1. Erstell Dir eine Map Programmname => Ordnername (Falls Ordnername und Programmname nicht gleich sind)
2. Frag die Programme aus der DB ab.
3. Frage die Ordner ab. Beim iterieren überpüfst Du ob der Pogrammname zum Ordner im Ergebnis aus 2 vorhanden ist. Wenn nicht gib den Ordner aus, sonst nicht.
 
  • Gefällt mir
Reaktionen: Der Lord
Genau wie @Drexel schreibt, einfach 2 Arrays erstellen: einmal die Liste der installierten aus der DB, dann die Liste aus dem Verzeichnis und dann einfach gegenprüfen, beispielsweise mit in_array.

vereinfachtes Beispiel:
PHP:
<?php

$installed_db = ['p1', 'p3', 'p5']; // Daten musst du dir aus deiner DB auslesen
$list_dir = ['p1', 'p2', 'p3', 'p4', 'p5']; // das ist die Liste von deinem Verzeichnisscan

foreach($list_dir as $p) {
    if(in_array($p, $installed_db))
        continue;
    echo $p;
}

Ergibt: p2, p4
 
Drexel schrieb:
Ja, so hatte ich es in ich weiß nicht wieviele Varianten probiert, ohne Erfolg.
Das Problem, die Programme aus der DB werden mit einer While-Schleife ausgegeben und die Programme aus dem Ordner werden ebenfalls mit einer Whlie-Schleife ausgegeben, nur wie bekomme ich beides unter einem Hut um bereits installierte Programme nicht mehr mit der Whlile-Schleife der Ordner anzuzeigen?
 
Zuletzt bearbeitet von einem Moderator:
Bereite dir in deiner While-Schleife entsprechende Variablen vor, statt die Werte direkt auszugeben.
 
Zuletzt bearbeitet:
Der Lord schrieb:
Danke, werde es gleich testen. Aber so hatte ich es gestern auch schon ohne Erfolg getestet bis auf einige andere Code.
 
Zuletzt bearbeitet von einem Moderator:
Nebenbei solltest du deinen Code unbedingt gegen SQL-Injection absichern. Es werden offenbar ungefilert Benutzereingaben direkt an die DB weitergeben - sehr großes Sicherheitsrisko. :)

Generell würde ich für DB-Zugriffe PDO verwenden, damit kann man das sehr leicht abfangen.
 
Coffeejunky_1 schrieb:
Ja, so hatte ich es in ich weiß nicht wieviele Varianten probiert, ohne Erfolg.
Das Problem, die Programme aus der DB werden mit einer While-Schleife ausgegeben und die Programme aus dem Ordner werden ebenfalls mit einer Whlie-Schleife ausgegeben, nur wie bekomme ich beides unter einem Hut um bereits installierte Programme nicht mehr mit der Whlile-Schleife der Ordner anzuzeigen?

Speicher die die installierten Programme aus der ersten Anfrage in einem Array.

Und prüfe gegen das Array in der zweiten While Schleife.

Du hast ein CMS geschrieben und bekommst das nicht gebacken? Bin gespannt wie lang es dauert bis Dein System übernommen wurde...
 
  • Gefällt mir
Reaktionen: Der Lord und e_Lap
Er gibt mir nur das array als Wort "array" aus.

$installed_db = [$as_ordner]; // Daten musst du dir aus deiner DB auslesen
$ordner="../".as_TOOLS."/";
$auflistung = scandir($ordner);
$list_dir = [$auflistung]; // das ist die Liste von deinem Verzeichnisscan
foreach($list_dir as $p) {
if(in_array($p, $installed_db))
continue;
echo $p;
}
Der Lord schrieb:
Nebenbei solltest du deinen Code unbedingt gegen SQL-Injection absichern. Es werden offenbar ungefilert Benutzereingaben direkt an die DB weitergeben - sehr großes Sicherheitsrisko. :)

Generell würde ich für DB-Zugriffe PDO verwenden, damit kann man das sehr leicht abfangen.
Nein, das Script läuft nur auf meinem PC unter einem virtuellem Server (XAMPP) erst später wenn ich dieses Programm auf einem webserver laufen habe, werden natürlich die Sicherheiten eingebaut.
Ohne die Sicherheit, werden Fehler schneller gefunden. Hatte ich aber oben geschrieben, dass das Programm nur local läuft.
 
Drexel schrieb:
Speicher die die installierten Programme aus der ersten Anfrage in einem Array.

Und prüfe gegen das Array in der zweiten While Schleife.

Du hast ein CMS geschrieben und bekommst das nicht gebacken? Bin gespannt wie lang es dauert bis Dein System übernommen wurde...
Das ist nur mein Hobby und nicht für die Öffentlichkeit gedacht. Das cms-System funktioniert so weit sehr gut, bis auf die Kleinigkeit das bereits installierte Programme mit aufgelistet werden.
Ergänzung ()

2021-07-02-14-25-localhost.png
 
Coffeejunky_1 schrieb:
$installed_db = [$as_ordner]; // Daten musst du dir aus deiner DB auslesen
Ich ging davon aus, dass du, wenn du ein eigenes CMS geschrieben hast, die Grundlagen von PHP verstanden hast. Mein Beispiel kannst du natürlich nicht 1 zu 1 übernehmen und musst es entsprechend deinem Code anpassen.

Wie nun schon mehrfach geschrieben wurde: bastel dir einfach eine Liste deiner installierten Programme in einem Array und vergleiche die Einträge dann vor der Ausgabe deiner Ordner-Liste.

1. DB Abfrage und Liste erstellen
2. Beim erstellen deiner Ordner-Liste mit 1. gegenprüfen und Existenz entsprechend behandeln
3. Ausgabe

Edit:
bzgl Sicherheit: ist zwar schon alles dazu gesagt worden, dennoch möchte ich auf zu deiner Antwort Stellung nehmen: es ist um ein Vielfaches umständlicher erst im Nachhinein in ein fertiges, mehrere Hundert oder gar Tausend Zeilen langes, Script sämtliche Sicherheitsaspekte reinzuquetschen. Teilweise muss man dafür das ganze Konzept dann wieder ändern. Und wenn ich Gästebuch, Forum, etc lese lese, erschließt sich mir eine lokale Nutzung mit nur einem User nicht, heißt: die Änderungen müssen zwingend später sowieso rein. :) 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. :)
 
Zuletzt bearbeitet:
Der Lord schrieb:
Das hatte ich schon gemacht. Das Problem was ich habe, ist, dass das Array aus der db nur innerhalb der geschweiften Klammer der Whlie-Schleife der DB funktioniert. Außerhalb der geschweiften Klammer wird mir aus dem array nur ein Wert ausgegeben. Ich muss also derst die anzahl der Einträge in der DB ermitteln, und jedem Array den einem id mitgeben.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben