Funktion auslösen beim Speichern des Moduls

  • Hallo Community, ich erstelle mir aktuell gerade ein Modul um Daten aus einer XML zu extrahieren und diese in eine DB zu importieren. :)
    Die Funktion funktioniert so wie ich es mir wünsche. Nur wie bekomme ich es hin das wenn der User im Backend das Modul mit den geforderten Daten gefüllt hat und auf Speichern klickt das dann die unten aufgeführte Funktion aufgerufen wird bzw. ausgeführt wird?



  • nach dem ich nun ein wenig herumprobiert habe bin ich auf einen Lösung gekommen. Es ist zwar noch nicht ganz fertig aber der Grundaufbau funktioniert soweit. Die Funktion wird mit dem Aufruf der Moduls im Frontend ausgelöst.


  • Danke für deine Tipps. Die ersten beiden werde ich verfolgen und nach möglichkeit auch Umsetzen.


    Der dritte Punkt entzieht sich mir. Warscheinlich durch unwissenheit. ;)
    Es gibt keine Eingabemaske im Frontend und es werden keine Daten per URL übergeben. Dazu kommt noch das ich keine Ahnung habe wie ich zb. das implode mit 'mysqli_real_escape_string' escapen kann. Ich würde mich freuen wenn du mir sagst wo mein Fehler liegt bzw. die besagte Lücke.


  • Fragen wir mal andersherum: was passiert denn, wenn in besagtes XML mal bösartige SQL-Befehle eingestreut werden? Du gibst die hier 1 zu 1 an die Datenbank weiter und hast dadurch ein Problem. Ja, ich weiß, das ist vielleicht nicht sonderlich wahrscheinlich - aber es gibt keinen Grund diese potenzielle Lücke offen zu lassen.

  • Da hast du absolut recht. Also verstehe ich das richtig das ich die entgegengenommenen Daten nur auf richtigkeit Prüfen soll?


    Ob es eine Zahl oder Buchstaben ist .
    In meinem Fall diese:
    $rohdata['id'], $rohdata['name'], $rohdata['status'], $rohdata['alliance']

  • Ich habe es nun angepasst und glaub dich verstanden zu haben. :) Danke sehr für die Hilfe.


    Code
    $id = (int) $rohdata['id'];
    $name = preg_replace("/[^a-zA-Z0-9 ]/","",$rohdata['name']);
    $status = preg_replace("/[^a-zA-Z]/","",$rohdata['status']);
    $ally = (int) $rohdata['alliance'];
  • Edit: Scheinbar mache ich es nicht wirklich richtig da ich nicht die gewünschten Daten zurück bekomme.


    Ich bin mir zwar nicht sicher ob das richtig ist aber so funktioniert es.

    Code
    $daten1 = implode(', ', $daten);        $queryDb = ("REPLACE INTO #__ogameally ( `userid_ogame`, `user_name_ogame`, `status_ogame`, `ally_id_ogame`)VALUES"). $daten1;$queryDb .= $db->mysqli_real_escape_string($queryDb);$db->setQuery($queryDb);$result = $db->execute();



    print_r $queryDb;

    Code
    REPLACE INTO #__ogameally ( `userid_ogame`, `user_name_ogame`, `status_ogame`, `ally_id_ogame`)VALUES
    ( '1', 'Legor', 'a', '0'), 
    ( '100000', 'GameAdmin', 'a', '0'), 
    ( '100003', 'comagf', 'a', '0'), 
    ( '100004', 'GameOperator', 'a', '0'), 
    ( '100005', 'OGameTech', 'a', '0'), 
    ( '100011', 'Maggi', 'a', '0'), 
    ( '100023', 'Lord of Darkness', 'vI', '0'), 
    ( '100028', 'Quoren', 'vI', '2'), 
    ( '100029', 'Sniper on Hill', 'vI', '0'),  usw...
  • Mahlzeit miteinander . :)


    Nachdem ich das escapen in Angriff genommen habe bin ich ein Stück weiter gekommen aber nun gibt es scheinbar ein SQL syntax error .




    return($queryDb);

  • Eher so:


    Code
    $id = (int) $rohdata['id'];
                    $name = preg_replace("/[^a-zA-Z0-9 ]/","",$rohdata['name']);
                    $status = preg_replace("/[^a-zA-Z]/","",$rohdata['status']);
                    $ally = (int) $rohdata['alliance'];
                    $daten[] = "($id, " . $db->quote($db->escape($name)) . ", " . $db->quote($db->escape($status)) . ",  $ally)";             
                }            
    
                $daten1 = implode(', ', $daten);        
    
                $queryDb = 'REPLACE INTO #__ogameally ( `userid_ogame`, `user_name_ogame`, `status_ogame`, `ally_id_ogame`) VALUES ' . $daten1;
  • Danke dir , das heißt man kann nur einzelne Werte escapen und nicht verkettete Werte?
    Das hat natürlich sofort funktioniert. Wie kann ich denn in Zukunft Testen ob das Escapen funktioniert hat. Weil wen ich zb. $daten mit print_r ausgebe sehe ich kein Unterschied.


    Ein weiteres Anliegen wäre dann das Cachen der Werte. Hast du da zufällig noch ein paar verweiße zum nachlesen dazu?


    Dieses Beispiel (https://docs.joomla.org/Using_caching_to_speed_up_your_code) ist für mich zu undurchsichtig und dieses (http://www.bzzzz.biz/blog/joom…n-joomla-extensions.bzzzz) ein wenig veraltet.

    • Hilfreich

    Danke dir , das heißt man kann nur einzelne Werte escapen und nicht verkettete Werte?


    Beim Escaping geht es ja darum, einen String (z.B. Wert oder Spaltennamen) den man an eine Datenbank übergibt, vorher so zu behandeln, dass er nicht mehr schädlich sein kann. Beispiel:


    SQL
    SELECT password FROM users WHERE email = "$email"


    Was passiert wenn du hier als $email ein

    Code
    " OR "1" = "1


    übergibst?


    Richtig, das hier:

    SQL
    SELECT password FROM users WHERE email = "" OR "1" = "1"


    Damit bekommst du dann plötzlich nicht mehr das Passwort von einem bestimmten Nutzer sondern die Passwörter von allen Nutzern, denn "1" = "1" trifft immer zu.


    Das Escaping wandelt solche "Steuerzeichen" also um und escaped sie durch ein \ womit sie als normales Zeichen eingelesen werden - das sieht man dann ja in deiner Fehlermeldung.



    Das hat natürlich sofort funktioniert. Wie kann ich denn in Zukunft Testen ob das Escapen funktioniert hat. Weil wen ich zb. $daten mit print_r ausgebe sehe ich kein Unterschied.


    Schmeiß ein paar pöse Zeichen rein.


    Ein weiteres Anliegen wäre dann das Cachen der Werte. Hast du da zufällig noch ein paar verweiße zum nachlesen dazu?


    Der erste Link ist da eigentlich ganz gut, was anderes hab ich leider auch nicht zur Hand.

  • Moin Moin miteinander. Ich habe nun versucht den Cache einzubinden. Die Seite default.php wird im Cache abgelegt. Zwei Fragen habe ich dazu. Wird die Seite dann auch aus dem Cache geladen oder muss ich das noch einbinden?




    modul Controller Datei