Pit: Zusatz zu funktionen

Hallo,

ich möchte in alle Funktionen eine Variable global setzen. Bin ich nicht wirklich glücklich drüber, aber ok…

Hierzu würde ich die datei einlesen und etwas hieraus ersetzen:

$dateiinhalt = file_get_contents("".$verzeichnis.$datei."");
file_put_contents("".$verzeichnis.$datei."", str_replace('...', '...', $dateiinhalt));

Nun würde ich dieser zeile aber mit auf den Weg geben, dass der suchbegriff "function plus alles, was bis zum nächsten {" steht, ist. Also, finde "function ... {" mache einen zeilenumbruch und schreibe dort "xyz" hinein, mache wieder einen Zeilenumbruch und gut ist.

Wer kann mir dabei ein wenig helfen?

Pit

  1. Hello,

    Du kannst eine Konstante vereinbaren.

    Die steht dann in allen Funktionen "read only" zur Verfügung. War das das, was Du wolltest?

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Hello,

      Du kannst eine Konstante vereinbaren.

      Die steht dann in allen Funktionen "read only" zur Verfügung. War das das, was Du wolltest?

      Hi Tom,

      danke, aber das ändert nicht ganz so viel. Ich muß trotzdem in die Funktion hinein und aus $db dann db machen. Aber eben nur in der Funktion, nicht woanders...

      Pit

      1. Hello,

        ich denke, es wäre besser, wenn Du in ganz normalen Worten beschreibst, was Du erreichen willst.

        Wie ist die Ausgangssituatuion, wie ist die Zielvorgabe, wie würdest Du den Weg am liebsten gehen?

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Hi,

          ich habe x Funktionen, in die ich eine zeile einfügen möchte. Da es viele funktionen sind, möchte ich es nicht per Hand, sondern per Script machen.

          Pit

        2. Hallo TS,

          er braucht eine global Vereinbarung für das $mysql-Objekt, weil er auf $mysqli umstellt und die mysqli-Funktionen allesamt das DB-Objekt als Parameter brauchen.

          D.h. mit einer Konstanten kommt er nicht weit.

          Ich würde mit die entsprechende Zeile im Editor kopieren und dann mit der Suchfunktion des Editors von Funktion zu Funktion springen. Das "Find Again" ist normalerweise ein Tastendruck, das Einfügen auch, das sind maximal 5 Sekunden pro Funktion, 720 Funktionen pro Stunde. Wie lange brauchst Du, um das zu automatisieren?

          Rolf

          --
          sumpsi - posui - clusi
          1. Hi Rolf,

            Ich würde mit die entsprechende Zeile im Editor kopieren und dann mit der Suchfunktion des Editors von Funktion zu Funktion springen. Das "Find Again" ist normalerweise ein Tastendruck, das Einfügen auch, das sind maximal 5 Sekunden pro Funktion, 720 Funktionen pro Stunde. Wie lange brauchst Du, um das zu automatisieren?

            Du hast schon recht... ich hasse solche arbeiten nur und hätte gerne die doppelte zeit verpulvert, um das per Script zu machen. Zudem lernt man noch was dabei…

            Na gut... geh ich halt Funktionen suchen... 😟

            Pit

          2. Hello,

            danke für deine "Übersetzung".

            Das ahnte ich schon, aber ich wollte die genaue Anforderung von Pit hören. Denn ich denke, dass er ein kleines Parserprogramm mit Ersetzungsfunktion bauen möchte. Dafür müsste er aber die Anforderungen nochmal genauer definieren.

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
  2. Hallo

    ich möchte in alle Funktionen eine Variable global setzen. Bin ich nicht wirklich glücklich drüber, aber ok…

    Hierzu würde ich die datei einlesen und etwas hieraus ersetzen:

    $dateiinhalt = file_get_contents("".$verzeichnis.$datei."");
    file_put_contents("".$verzeichnis.$datei."", str_replace('...', '...', $dateiinhalt));
    

    Nun würde ich dieser zeile aber mit auf den Weg geben, dass der suchbegriff "function plus alles, was bis zum nächsten {" steht, ist. Also, finde "function ... {" mache einen zeilenumbruch und schreibe dort "xyz" hinein, mache wieder einen Zeilenumbruch und gut ist.

    Ich vermute mal, dass es hier immer noch um den Umstieg weg von den mysql_*-Funktionen geht.

    Du hältst also die skriptseitige Manipulation des PHP-Quelltextes für weniger aufwendig als die Benutzung eines Editors für diesen Zweck (wobei ich mich auf dieses Posting von dir beziehe).

    Mal abgesehen davon, dass du so einen Funktionsparameter mysqli_wasauchimmer($mydb, genausogut wie ein {\nglobal $mydb; einbauen kannst, halte ich es, das per PHP(?)-Skript zu machen, für mindestens schlecht handlebar. Wenn du sowas „in einem Rutsch“ machst, kann es durchaus vorkommen, dass du dabei Stellen kaputtmachst, weil das Ausgangsmaterial (der alte Code) nicht deinen Annahmen entspricht. Ich würde dazu in jedem Fall einen Editor bemühen, der alle Stellen in allen Dateien eines Verzeichnisses samt dessen Unterverzeichnissen durchsuchen kann (heißt oft "dateiübergreifendes Suchen und Ersetzen“ oder ähnlich) und noch einmal über jede Stelle drüberschauen wollen.

    Das kann je nach Projektgröße zwar in einer langwierigen "Ok"-Klickerei ausarten, ich spare mir aber die Suche nach den und die Korrektur der kaputtgegangenen Stellen.

    Wer kann mir dabei ein wenig helfen?

    Ich nicht. Ich halte das, wie oben beschrieben, für einen falschen Weg.

    Tschö, Auge

    --
    Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.
    Kleine freie Männer von Terry Pratchett
    1. Hi Auge,

      Ich vermute mal, dass es hier immer noch um den Umstieg weg von den mysql_*-Funktionen geht.

      Du hältst also die skriptseitige Manipulation des PHP-Quelltextes für weniger aufwendig als die Benutzung eines Editors für diesen Zweck (wobei ich mich auf dieses Posting von dir beziehe).

      Ich würde dazu in jedem Fall einen Editor bemühen, der alle Stellen in allen Dateien eines Verzeichnisses samt dessen Unterverzeichnissen durchsuchen kann (heißt oft "dateiübergreifendes Suchen und Ersetzen“ oder ähnlich)

      Das kann doch ein Script auch.

      und noch einmal über jede Stelle drüberschauen wollen.

      Das kann je nach Projektgröße zwar in einer langwierigen "Ok"-Klickerei ausarten, ich spare mir aber die Suche nach den und die Korrektur der kaputtgegangenen Stellen.

      Und nach 3-4 tagen klickst du nur noch ok, ohne wirklich zu registrieren, was Du da wirklich klickst. Ich versuche es mal umgekehrt und suche mir dann die ggf. vorhandenen Fehler raus. Ich denke, Beides ist legitim.

      Wer kann mir dabei ein wenig helfen?

      Ich nicht. Ich halte das, wie oben beschrieben, für einen falschen Weg.

      Und beim (für Dich) falschen Weg magst du nicht helfen?

      Dann sei das mal so.

      Pit

      1. Hallo

        Ich vermute mal, dass es hier immer noch um den Umstieg weg von den mysql_*-Funktionen geht.

        Du hältst also die skriptseitige Manipulation des PHP-Quelltextes für weniger aufwendig als die Benutzung eines Editors für diesen Zweck (wobei ich mich auf dieses Posting von dir beziehe).

        Ich würde dazu in jedem Fall einen Editor bemühen, der alle Stellen in allen Dateien eines Verzeichnisses samt dessen Unterverzeichnissen durchsuchen kann (heißt oft "dateiübergreifendes Suchen und Ersetzen“ oder ähnlich)

        Das kann doch ein Script auch.

        Ja, aber es macht das im Normalfall ohne Interaktion mit dem das Skript ausführenden Programmierer und somit …

        und noch einmal über jede Stelle drüberschauen wollen.

        … ohne die von mir ausbedungene Möglichkeit, überall noch einmal drüberzuschauen.

        Das kann je nach Projektgröße zwar in einer langwierigen "Ok"-Klickerei ausarten, ich spare mir aber die Suche nach den und die Korrektur der kaputtgegangenen Stellen.

        Und nach 3-4 tagen klickst du nur noch ok, ohne wirklich zu registrieren, was Du da wirklich klickst.

        Ich habe keine Ahnung, wie groß deine Projekte sind, aber auch ich habe für mehrere Skripte und Skriptsammlungen einen solchen Umstieg (von mysql_* (mit Angabe der Verbindungkennung am nachher falschen Ende der Parameterliste) nach mysqli_*) ausgeführt. Um auf mehrere Tage Klickarbeit zu kommen, hätte ich es bei vielleicht 20 bis 30 Klicks/Stunde belassen müssen. Auch bei größeren umzuziehenden Projekten ist es bei schlimmstenfalls zwei Stunden Aufwand geblieben, wobei ich mir das …

        Ich versuche es mal umgekehrt und suche mir dann die ggf. vorhandenen Fehler raus.

        … dann nicht mehr antun musste.

        In den meisten (aber eben nicht allen) Fällen wirft man ja doch nur einen halbsekündigen Blick auf den Code, da er ja meist (aber eben nicht immer) den Erwartungen entspricht.

        Ich denke, Beides ist legitim.

        Klar.

        Wer kann mir dabei ein wenig helfen?

        Ich nicht. Ich halte das, wie oben beschrieben, für einen falschen Weg.

        Und beim (für Dich) falschen Weg magst du nicht helfen?

        Beim für mich falschen Weg kann ich dir nicht helfen. Ich mag nicht dafür gerade stehen müssen, dass ich dir mangels eigener Erfahrung oder weil ich eine Randbedingung übersehe etwas vorgeschlagen habe, was dir etwas kaputt macht.

        Dann sei das mal so.

        So ist es.

        Tschö, Auge

        --
        Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.
        Kleine freie Männer von Terry Pratchett
        1. Hi Auge,

          Das kann doch ein Script auch.

          Ja, aber es macht das im Normalfall ohne Interaktion mit dem das Skript ausführenden Programmierer und somit …

          und noch einmal über jede Stelle drüberschauen wollen.

          … ohne die von mir ausbedungene Möglichkeit, überall noch einmal drüberzuschauen.

          Das würde aber bei den von mir im Nachbarpost angegebenen Änderungen bereits mehr als 5-6 gesamte Durchläufe aller scripte bedeuten.

          Ich habe keine Ahnung, wie groß deine Projekte sind, aber auch ich habe für mehrere Skripte und Skriptsammlungen einen solchen Umstieg (von mysql_* (mit Angabe der Verbindungkennung am nachher falschen Ende der Parameterliste) nach mysqli_*) ausgeführt. Um auf mehrere Tage Klickarbeit zu kommen, hätte ich es bei vielleicht 20 bis 30 Klicks/Stunde belassen müssen. Auch bei größeren umzuziehenden Projekten ist es bei schlimmstenfalls zwei Stunden Aufwand geblieben, wobei ich mir das …

          Bei kleiner 2 Stunden wäre das auch für mich keine Frage. Wieviel Scripte schafft man pro Durchlauf pro Stunde? Sagen wir 40? Dann wären es 80 Scripte je Änderung in 2 Std. Also bei 5 Durchläufen 80/5 schafft man 16 Scripte gesamt in 2 Stunden? Also 8 Skripte je Stunde? Puuh... das ist wenig...

          In den meisten (aber eben nicht allen) Fällen wirft man ja doch nur einen halbsekündigen Blick auf den Code, da er ja meist (aber eben nicht immer) den Erwartungen entspricht.

          Darf ich rückfragen, was du genau meinst?

          Oder anders ausgedrückt, hast Du ein beispiel für mich? Wenn ich :

          $dateiinhalt = file_get_contents("".$verzeichnis.$datei."");
          file_put_contents("".$verzeichnis.$datei."", str_replace('mysql_query(', "mysqli_query(\$mydb,", $dateiinhalt));
          

          ausführe, hast du da ein beispiel eines Codes, der mier Schwierigkeiten machen würde? Vor allem ein Beispiel, das nachher schwierig zu finden sein würde, wenn es einen fehler produziert?

          Beim für mich falschen Weg kann ich dir nicht helfen. Ich mag nicht dafür gerade stehen müssen, dass ich dir mangels eigener Erfahrung oder weil ich eine Randbedingung übersehe etwas vorgeschlagen habe, was dir etwas kaputt macht.

          Also "gerade stehen" muß für Hilfe ohnehin keiner. Das wäre ja noch schöner. Jeder hilft, so gut er kann, aber verantworten muß das schon derjenige selber, der es umsetzt. Und in diesem Fall ist ja meine anforderung sehr begrent. Ich will ja nur eine Zeile je Funktion einsetzen, da gibt es ja ekine Randbedingungen zu beachten.

          Dann sei das mal so.

          So ist es.

          Schade, aber akzeptabel. 😀

          Trotzdem viele Grüße,

          Pit

          1. Hallo

            Das kann doch ein Script auch.

            Ja, aber es macht das im Normalfall ohne Interaktion mit dem das Skript ausführenden Programmierer und somit … ohne die von mir ausbedungene Möglichkeit, überall noch einmal drüberzuschauen.

            Das würde aber bei den von mir im Nachbarpost angegebenen Änderungen bereits mehr als 5-6 gesamte Durchläufe aller scripte bedeuten.

            Klar, grundsätzlich könnte je nach Arbeitsweise ein Durchlauf pro Funktionsname fällig werden. Halbautomatisch geht es grundsätzlich auch, die Stellen finden zu lassen, überall das „i“ im Funktionsnamen zu ergänzen und den ersten Parameter aus dem Zwischenspeicher („$mydb, “) zu ergänzen. Bei einigen -zig bis hunderten Aufrufen in mehreren Dateien macht das natürlich keinen Spaß mehr.

            In den meisten (aber eben nicht allen) Fällen wirft man ja doch nur einen halbsekündigen Blick auf den Code, da er ja meist (aber eben nicht immer) den Erwartungen entspricht.

            Darf ich rückfragen, was du genau meinst?

            Ein Blick auf den konkreten Code enthüllt eventuell anders formatierte Codestellen, die bei einer automatischen Ersetzung ohne Vorschau und Eingriff kaputt ginge.

            Wenn ich :

            $dateiinhalt = file_get_contents("".$verzeichnis.$datei."");
            file_put_contents("".$verzeichnis.$datei."", str_replace('mysql_query(', "mysqli_query(\$mydb,", $dateiinhalt));
            

            ausführe, hast du da ein beispiel eines Codes, der mier Schwierigkeiten machen würde?

            Hattest du dich nicht zuvor für PDO und gegen myslqi entschieden?

            Vor allem ein Beispiel, das nachher schwierig zu finden sein würde, wenn es einen fehler produziert?

            Keine Ahnung wie schwierig es sein könnte, im konkreten Fall den Fehler zu finden. In den meisten Fällen gibt PHP ja eine recht ausführliche Meldung mit Zeilennummer aus. Das ist halt nicht immer so und dann sucht man sich einen Wolf. Darauf hab' ich keine Lust, also vermeide ich es (soweit ich kann) in solche Situationen zu geraten.

            Tschö, Auge

            --
            Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.
            Kleine freie Männer von Terry Pratchett
          2. Hallo Pit,

            str_replace('mysql_query(', "mysqli_query($mydb,")

            Also wenn du dafür ein Script schreiben musst, hast Du den falschen Editor. Search and Replace über alle Dateien im Projekt / in einem Ordner sollte eine Standardfunktion sein.

            Aber wenn Du es selbst machen willst - geht natürlich. Durch Verwendung einfacher statt doppelter Anführungszeichen kannst Du übrigens das Escapen von $ vermeiden.

            Mir ist gerade noch was eingefallen, was die Bereitstellung des globalen DB-Objekts angeht. Verwende eine statische Klasse!

            class DB {
                private static $connection;
                
                public static function getConnection() {
                    if (self::$connection === null) 
                       self::$connection = new mysqli(...);
                    return self::$connection;
                }
                public static function query($sql) {
                    return self::getConnection()->query($connection, $sql);
                }
                public static function prepare($sql) {
                    return self::getConnection()->prepare($connection, $sql);
                }
                public static function errno() {
                    if (self::$connection === null) return 0;
                    return self::$$connection->errno;
                }
                public static function error() {
                    return self::$connection === null "" : self::$$connection->error;
                }
            }
            

            Diese Klasse enthält das Connection-Objekt und stellt bei der ersten Query automatisch eine Verbindung her. Du kannst sie also in dein Konfigurations-Include einbauen, im new mysqli stehen dann die Verbindungsdaten.

            Deine DB-Zugriffe ändern sich damit von

               $result = mysql_query("SELECT bla bla bla");
            

            in

               $result = DB::query("SELECT bla bla bla");
            

            D.h. dein Replace müsste 'mysql_query' durch 'DB::query' ersetzen, was ein guter Editor oder auch dein eigenes Scriptchen problemlos kann. Klassennamen sind immer global sichtbar, d.h. du hast keine Probleme mehr mit einer global $db Zeile.

            Falls Du Namespaces verwendest, musst Du natürlich \DB oder \mynamespace\DB einsetzen, je nach deinem Namespace-Layout. Wenn Du nicht weißt, wovon ich rede, vergiss diesen Absatz oder lies Dich bei php.net ein 😉. Namespaces sind in großen Projekten eine gute Hilfe, aber sie in einem Altprojekt nachzurüsten kann viel Arbeit machen (jeder Aufruf einer PHP-Standardfunktion braucht auf einmal ein \ vorneweg).

            Weitere Funktionen, die DB-spezifisch sind, kannst Du genauso in der DB-Klasse kapseln. Pro Funktion musst Du dann überlegen, ob sie automatisch eine Verbindung herstellen sollte oder nicht.

            Ich habe das mal exemplarisch für prepare, errno und error gemacht, die err-Abfragen sind nur sinnvoll wenn das mysqli-Objekt schon da ist, darum stellen sie nicht automatisch eine Connection her. Die errno() und error() Methoden sind unterschiedlich implementiert; eine mit direktem if, eine mit dem ?: Operator. Nimm das was Du magst und verstehst.

            Eventuell kannst Du auf diesem Weg auch das Fehler-Reporting bei SQL Fehlern direkt wegkapseln, indem Du in der query-Methode das Ergebnis von $connection->query erstmal inspizierst. Ist es FALSE, hau gleich eine Meldung ins Log oder ins echo.

            Rolf

            --
            sumpsi - posui - clusi