SQL Zerlegen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SQL Zerlegen

    Hallo,

    ich stehe vor dem Problem alle möglichen Datenbankänderungen zu loggen,
    dh. ich fange alle Datenbankquerys ab, und schicke sie durch den Logger.

    Der Logger kennt alle zu protokollieren Tabellen, und deren Primärschlüssel.

    Meine aktuelle Funktion sieht derzeit so aus:
    PHP-Code:
    function log$_sql ){
        
    // insert wird im nachheinein behandelt, um den neuen prkey zu erhalten
        // ok, wir haben ein query, und muessen nun checken ob dies geloggt werden soll
        
    $this->_getlogtables();
        
    // erstmal die Tabelle aus der Query ermitteln
        
    preg_match('#(REPLACE|UPDATE|DELETE)[^A-Z](FROM|INTO|IGNORE)+[^A-Z]([a-z_0-9]*)#si',$_sql,$answer);
        
    $table    $answer[3];
        
    $action    $answer[1];
        
    // Tabelle zu loggen?
        
    if( in_array($table,array_keys($this->tables)) ){
            
    // dann versuchen wir mal einen Primaerschluessel zu finden
            
    if(preg_match('#'.$this->tables[$table]['prkey'].'[^a-z]*=[^a-z]*([a-z0-9]*)#is',$_sql,$answer)){
                
    $prkey $answer[1];
            }elseif( 
    preg_match(... ??? ...) ){
                
    // hier das Problem
            
    }
        }
        return 
    1;

    das Problem dabei ist, wie zerlege ich eine SQL Anweisung der Form

    Code:
    INSETR INTO blabla 
    	( spalte1, spalte2, ... )
    	VALUES
    	( 'abc', 123, ...)
    PS: die wichtigen Tabellen, welche geloggt werden haben alle noch einen
    2. unique Index, der für Replace genutzt werden kann. Die darin enthaltenen
    Spalten sind dem Logger auch bekannt.

    Irgendwelche Ideen?
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

  • #2
    Re: SQL Zerlegen

    Code:
    INSETR INTO blabla 
    	( spalte1, spalte2, ... )
    	VALUES
    	( 'abc', 123, ...)
    OffTopic:
    Mal eine Frage am Rande. Du benutzt doch nicht wirklich diese veraltet Statment, oder?
    *winks*
    Gilbert
    ------------------------------------------------
    Hilfe für eine Vielzahl von Problemen!!!
    http://www.1st-rootserver.de/

    Kommentar


    • #3
      doch, zB wenn ich per Implode viele Datensätze auf einmal in die DB schubse
      TBT

      Die zwei wichtigsten Regeln für eine berufliche Karriere:
      1. Verrate niemals alles was du weißt!


      PHP 2 AllPatrizier II Browsergame

      Kommentar


      • #4
        Und wieso dann nicht mit:
        Code:
        INSERT INTO blabla SET
        spalte1 = Wert1,
        spalte2 = Wert2
        ist doch viel einfacher!
        *winks*
        Gilbert
        ------------------------------------------------
        Hilfe für eine Vielzahl von Problemen!!!
        http://www.1st-rootserver.de/

        Kommentar


        • #5
          @wotan, du bist schon hartnäckig tbt will mit implode arbeiten und das geht wohl schlecht mit set

          Kommentar


          • #6
            Original geschrieben von asp2php
            @wotan, du bist schon hartnäckig tbt will mit implode arbeiten und das geht wohl schlecht mit set
            Implode zerlegt mir einen String und erstellt mit nicht einen SQL-Statment. Und Proggtechnisch bin ich was anderes von TBT gewöhnt.
            *winks*
            Gilbert
            ------------------------------------------------
            Hilfe für eine Vielzahl von Problemen!!!
            http://www.1st-rootserver.de/

            Kommentar


            • #7
              ich arbeite auch ausschließlich mit set, ist für mich übersichtlicher.

              Kommentar


              • #8
                und die SET methode lässt dich immer nur einen datensatz pro INSERT eintragen

                @tbt
                du willst also aus (spalte1, spalte2, ...)den primärschlüssel finden?

                1. den gibst du doch, da es wahrscheinlich auto_increment ist, nicht an oder? ;-)
                2. such dir den ersten klammerausdruck, ersetze komma und leerzeichen durch | und mit etwas glück matcht dein ausdruck ja dann auf (spalte1|spalte2)

                zusammengesetzte primärschlüssel hast du nicht oder?
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Original geschrieben von mrhappiness
                  und die SET methode lässt dich immer nur einen datensatz pro INSERT eintragen
                  OffTopic:
                  das reicht ja doch für WebFrontend, alles andere läuft über DTS, wozu die Finger im WebFrontend wund tippen. Ich rede selbstverständlich von MS-SQL . Ich glaube ich muß aufhören, sonst macht TBT Hackfleisch aus mir . Sorry wegen OT

                  Kommentar


                  • #10
                    ich will einfach das loggen an einer zentralen Stelle ansetzen, da ich sonst definitiv in
                    irgendeiner Klasse vergesse irgendeine Loggingfunktion aufzurufen.
                    Ich denke, ich werde der DB Klasse eine extra insert Funktion verpassen,
                    die den Tabellennamen als String und die Werte als array erwartet.
                    Dann brauch ich mir da nicht irgendwelche regexp ausdenken, die dann doch
                    nicht richtig funktionieren.

                    @asp2php: es ist kein simples Webfrontend, sondern eine komplette Anwendung
                    mit einer recht großen DB dahinter. Der (fast) aktuelle Klassenbaum sieht so aus
                    http://tbt.dyndns.org/classes.jpg
                    wobei da noch so 10-12 Klassen fehlen, und jeder Menge Methoden
                    TBT

                    Die zwei wichtigsten Regeln für eine berufliche Karriere:
                    1. Verrate niemals alles was du weißt!


                    PHP 2 AllPatrizier II Browsergame

                    Kommentar

                    Lädt...
                    X