Probleme SQL Daten darzustellen

  • Hallo Zusammen,


    für eine Spielkommunity versuche ich ein Modul zu entwicklen, welches die Benutzerliste ausliest und im Frontend im registrierten Bereich darstellt. Bevor ich zur Frage komme, da ich nicht weiterweiss, zeige ich Euch was ich zunächst programmiert habe:


    /tmpl/default.php


    mod_mitarbeiterstamm.php

    PHP
    <?php
    
    defined('_JEXEC') or die( 'Restricted access' );
    
    require_once dirname(__FILE__) . '/helper.php';
    $result = modZeigeMitarbeiter::ZeigeMitarbeiter();
    
    require ( JModuleHelper::getLayoutPath( 'mod_mitarbeiterstamm' ));
    
    ?>


    helper.php


    Nun bei der Ausgabe zeigt mir Joomla den ersten Datensatz nur an. Ich glaube es kommt daher, das ich in der Datei "default.php" einen" $result[1];" eingegeben habe.


    Wenn ich in der "default.php" Datei mit einer while schleife arbeite, wie hier

    Code
    while ($belegschaft_abfrage = mysqli_fetch_array($result)) {
     
    $benutzername;        =    $belegschaft_abfrage['name'];
    $loginname            =    $belegschaft_abfrage['username'];
    $dienstgrad           =    $belegschaft_abfrage['dienstnummer'];
    $rangname             =    $belegschaft_abfrage['rang']; 
    $telefon              =    $belegschaft_abfrage['telefon'];
    
    }


    dann erhalte ich diesen Fehler: syntax error, unexpected '}'




    Bitte seit so lieb und Hilft mir mal.

  • Davon verstehe ich jetzt nicht so viel, aber was ist das:

    Code
    $benutzername;        =    $belegschaft_abfrage['name'];

    In der helper.php wäre oben ein <?php gut, damit man den Code besser lesen kann (farbliche Darstellung).

  • Das Muster, nach dem du da arbetest ist schon ein wenig veraltet. Inzwischen ist einiges anders, schau mal in die Module direkt im Verzeichnis modules.


    Wenn du Daten haben willst, mach $things= $db->loadObjecList(); Dann hast du ein array mit Ergebnissen (oder auch nicht),.


    In der default.php haben datenbankzugriffe nichts verloren, dort arbeitest du direkt mit den Ergebnissen

    Code
    if (!empty($things) :
        foreach ($things as $thing) :
     
           $benutzername;        =    $thing->name
           ... usw
    
        endforeach;
    endif;
  • Hallo LukasHH und Firstlady,


    ersteinmal danke schön für die Hilfe. Es funktioniert. Nun habe ich eine Liste mit allen Benutzer, die wie folgt aussieht:


    Polizei Polizei 999 Ltd. / Ass.Abteilungleitung 705457 758
    Super User Superprime 22 Officer 666666 756
    LSFD Mann Feuerwehr   759


    In der letzten Spalte wird die BenutzerID aufgegeben, die der einzelne Benutzer automatisch von Joomla erhalten hat.



    Damit im Frontend der User von einer autorisierte Benutzergruppe gelöscht werden kann, möchte ich folgendes machen:


    1. Ich möchte ein Formularfeld "Button" pro User einfügen, der die variable "UserId" speichert.

    2. die variable "UserID" soll im sql script in der mox_name,php übergeben werden, sodass eine delete ausgeführt wird.

    3. eventuell Schutz vor SQL injection


    Bisher habe folgende Dateien und weiss nicht wie ich das umsetzen soll. Bitte hilft mir mal ....


    default.php



    mod_entlassung_lspd.php

    PHP
    <?php
    
    defined('_JEXEC') or die( 'Restricted access' );
    
    require_once dirname(__FILE__) . '/helper.php';
    $result = modEntlasseMitarbeiter_lspd::EntlasseMitarbeiter_lspd();
    require ( JModuleHelper::getLayoutPath( 'mod_entlassung_lspd' ));
    
    ?>


    helper.php


    Als Resultat sollte so sein, das statt der UserID, ein Button erscheint. Bei Klick des Button sollte die Zeile löscht werden und somit auch die Einträge der beiden SQL Tabellen #__user und fmsrp_miterarbeiterstamm_lspd.



    Also danke für die Hilfe.

  • Nur mal zum Verständnis - sind das jetzt 3 verschiedene Module von denen Du hier schreibst?
    Zu der default.php in #6 lasse mal die ganzen defines und if-Abfragen weg.

    Eleganter und schlanker ist, wenn Du aus den defines ein Array oder Objekt machst und dann direkt aufrufst.

    PHP
    $rang = Array("Rekrut", "Officer", "Sergant", ...);

    weiter unten dann:

    PHP
    <?php echo $rang[$name->rang]; ?>


    a) Zum weiteren müsstest Du ein Formular in die default.php einbauen mit dem jeweiligen Button.

    b) In der Config-XML ein Feld Benutzergruppe hinzufügen, wo man die Benutzergruppe auswählen kann, wer die Löschberechtigung erhält.

    c) beim Aufruf die Gruppenzugehörigkeit des aktuellen User abfragen und prüfen, ob dieser mit der berechtigten Gruppe übereinstimmt - diese bekommen das Modul dann mit Formular / Button

    d) wenn das Formular ausgeführt wird - das eigentliche Script zum löschen in die helper.php ggf. vorher noch eine Sicherheitsabfrage einbauen.

    Könntest aber auch stattdessen ein Ajax-Script nehmen, welches die Lösch-Funktion in der helper.php aufruft.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Hallo LukasHH


    ersteinmal danke für die Hilfe und deine Zeit. Ich werde den Rang später in der Datenbank haben und habe es nur reingenommen um ein richtigen Print zu bekommen.


    Kurz zum Hintergrund: Eine RP Spielgemeinschaft hat mich gebeten ein CMS zu bauen, damit die Fraktionen sich Managen können. Die Entscheidungen sollen alle im Frontbereich als degistrierte User in der jeweiligen Fraktion ausgeführt werden.

    Es sollen folgende 3 Module erstmal gemacht werden:


    1. ) Eine Auflistung der User in der Gruppe als Mitarbeiterstamm

    2.) Eine Aufistung mit Entassungsbutton (wie Modul 1 nur mit Erweiterung zum Löschen der ID der Tabellen '__user und mitarbeiterstamm

    3.) Einstellungformular


    Nun habe ich das erste Modul fertig. Ich weiss, das man alle drei Module in ein Programmieren kann. Aber mir fehlt die Praxis.


    Meine Frage:

    Wie bekommt das Modul heraus, das der Button geruckt wurde und wie übergebe ich dies zur helper.php.


    in der default.php:

    PHP
    <form  method="post">
          <button type="submit" name="kill_id_lspd" value="<?php $kill_id = $name->id; ?>">Entlassen</button>
        </form>


    in der helper.php wurde eine zweite funktion eingerichtet, die später als "where = $id_lspd" in der sql delete anweisung übergeben werden


    Code
        public static function BekommeID_lspd() {
    
            $id_lspd = $_POST['kill_id_lspd'];
            
        }


    in der mod_entlassung_lspd wurde folgender Eintrag eingeführt


    Code
    $id_lspd = modEntlasseMitarbeiter_lspd::bekommeID_lspd();


    wenn ich in der default.php die variable $id_lspd abfrage kommt nichts an, wenn der Botton gedrückt wurde. Wo mache ich da was falsch


    Danke für die Hilfe

  • Meine Frage:

    Wie bekommt das Modul heraus, das der Button geruckt wurde und wie übergebe ich dies zur helper.php.

    Das ermittelst in dieser Art in der mod_entlassung_lspd.php

    PHP
    use Joomla\CMS\Factory;
    $app = Factory::getApplication();
    $var= $app->input->get('deinbutton');

    Darin eine Abfrage bauen welche $var prüft und entsprechend die Funktion in der helper.php aufruft.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • ich habe es versucht und es klappt nicht.


    in der default.php

    PHP
    <form  method="post">
          <button type="submit" name="kill_id_lspd" value="<?php $kill_id = $name->id; ?>">Entlassen</button>
        </form>


    in der helper.php

    Code
    public static function bekommeID() {
        
                use Joomla\CMS\Factory;
                $app = Factory::getApplication();
                $var= $app->input->get('kill_id_lspd');
            }

    in der mod_entlassung_lspd.php


    Code
    $kill_id_lspd = modEntlasseMitarbeiter_lspd::EntlasseMitarbeiter_lspd();


    Nun bekomme ich folgende ERROR Message von Joomla -> Ich glaube er versteht "use" nicht


    0 - syntax error, unexpected 'use' (T_USE)



    Da ist der Wurm drin ....

  • Hallo,

    Nun bekomme ich folgende ERROR Message von Joomla -> Ich glaube er versteht "use" nicht


    0 - syntax error, unexpected 'use' (T_USE)

    Vorweg: Keine Ahnung von dem Ganzen. Bin ja kein Programmierer - wirst ja bestens betreut von LukasHH 8)


    Hab das hier gefunden (zwar alt, aber ev. passend):


    https://github.com/browscap/browscap-php/issues/1

    https://github.com/PHPMailer/PHPMailer/issues/1142

    Zitat

    ... use statements should appear at the top of a PHP file, not half-way through it...


    Liebe Grüße

    Christine

  • sorry, hab ich verstanden ich habe nochmals umgebaut:


    default.php

    PHP
    <form  method="post">
          <button type="submit" name="kill_id_lspd" value="<?php $kill_id = $name->id; ?>">Entlassen</button>
        </form>


    helper.php



    mod_entlassung_lspd

    Code
    use Joomla\CMS\Factory;
    $app         = Factory::getApplication();
    $id_lspd    = $app->input->get('kill_id_lspd');


    Das gute ist, das ich keine Fehlermeldung bekomme. Aber es passiert auch beim drücken des Button nichts.


    Kannst Du mir hier mal helfen...

  • In der default.php habe ich einen Fehler gefunden. Das muss so lauten:

    HTML
          <button type="submit" name="kill_id_lspd" value="<?php echo $name->id; ?>">Entlassen</button>

    Das use kommt direkt an den Anfang der mod_entlassung_lspd.php

    Damit wird der Namespace aufgerufen, um auf die Klasse Factory zugreifen zu können.

    Aus JFactory wird dann Factory

    PHP
    defined('_JEXEC') or die;
    use Joomla\CMS\Factory;
    require_once dirname(__FILE__) . '/helper.php';
    
    $app = Factory::getApplication();


    weiter in der mod_entlassung_lspd.php kommt eine If-Abfrage, ob überhaupt ein Button geklickt wurde

    PHP
    if(!empty($app->input->get('kill_id_lspd'))){
        $user_id = $app->input->get('kill_id_lspd');
        //Aufruf der Klassenfunktion  ggf. nochmals prüfen ob der User überhaupt löschen darf
    }

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Hallo Lukas,


    bisher habe ich das verstanden und auch umgesetzt - dafür ersteinmal ein danke schön.


    Bisher passiert nichts, wenn ein Button gedrückt wurde. Wie folgt wurden das Modul abgebildet:


    default.php

    PHP
    <form  method="post">                                              
         <button type="submit" name="kill_id_lspd" value="<?php echo $name->id; ?>">Entlassen</button>
    </form>


    helper.php

    Code
        public static function loescheIDlspd() {
            
            $db     = JFactory::getDBO();                          
            
            $query     = $db->getQuery(true)
                         ->delete($db->quoteName('#__users')) 
                         ->where($db->quoteName('id' == $id_lspd));
                        
            $db->setQuery($query);   
        }


    mod_entlassen_lspd


    Vielleicht ist die SQL Anweisung nicht richtig

  • Code
    ->where($db->quoteName('id' == $id_lspd));

    Das ist (neben falsch) ggf. auch gefährlich (SQL-Injections), wenn man versucht es falsch richtiger zu machen ;)

    So:

    Code
    ->where($db->quoteName('id') . ' = ' . $db->quote($id_lspd));

    EDIT:

    Wenn das eine ganze Integerzahl ist, dann würde ich das schon früher "sanitizen", bspw.

    Code
    $id_lspd = (int) $app->input->get('kill_id_lspd');

    aaaaaaber ich habe hier zu wenig mitgelesen. Nur so reingeplärrt.

  • ich habe den "(int)" auch eingegeben und es klappt immer noch nicht.


    ich poste mal das ganze (ohne Manifest):


    default.php



    helper.php



    mod_entassen_lspd


  • $db->setQuery($query);

    macht erst mal nichts anderes als die DB-Instanz mit der Query zu befüllen. Ausgeführt wird noch nicht. In deinem Fall (löschen) fehl wohl


    Code
    $db->execute();

    Oder ausführlicher mit Fehler abfangen:

    Code
    try
    {
        $db->execute();
    }
    catch (RuntimeException $e)
    {
        return JError::raiseWarning(500, $e->getMessage());
    }

    , was aber in Joomla 4 im Core in dieser Art wieder "abgeschafft wurde", ohne, dass ich verstanden hätte warum, was nun "best practice" ist. Funktioniert aber vom Prinzip her trotzdem noch.

  • ich habe "execute" gewechselt und geht immer noch nicht.



    In der helper.php ist eine classe mit zwei Funktionen die erste Funktion funktioiniert ja, aber die zweite nicht.


    Muss ich die zweite funktion auch in der "mod_entlassung_lspd.php" aufzeigen, wie die erste "$result = modEntlasseMitarbeiter_lspd::EntlasseMitarbeiter_lspd();"



    ICh habe nochmals die helper.php Datei eingefügt.