Tom: MySQL, PHP und die Backticks

Hello,

irgendwie lässt mich das nicht schlafen. Oder liegts am Wetter? Jedenfalls geht mir schon die ganze Nacht die Frage im Kopf herum, wie diese drei Dinge zusammenpassen:

Übergebe ich in PHP einen String zur Ausgabe an die Standardausgabe mit echo oder print, un dieser String enthält einen  mit Backticks begrenzten Teilstring, dann wird versucht, diesen vom Befehlsinterpreter des Betriebssystem ausführen zu lassen, also als Kurzanweuisung für exec() o.ä.

Innerhalb eines MySQL-Querys kann ich nun Feldnamen mit Backticks markieren, was ich in den letzen Wochen auch öfter in Beispielen gesehen habe.

Nun empfiehlt es sich ja gerade in der Entwicklungsphase von Modulen mit SQL-Quries, diese vor Ausführung ausgeben zu lassen.

Meine Frage:
------------
Was passiert dann mit den mit Backticks begrenzten Namen? Eigentlich müssten die doch dann vom Betriebssystem als Befehle interpretiert werde, was natürlich sinnlos wäre...

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  1. Moin!

    Innerhalb eines MySQL-Querys kann ich nun Feldnamen mit Backticks markieren, was ich in den letzen Wochen auch öfter in Beispielen gesehen habe.

    Kann man - muß man aber nicht. Dient nur dazu, reservierte Worte auch als Namen nutzen zu können, was in meinen Augen nicht sehr sinnvoll ist.

    Insofern erledigt sich das Problem von selbst, wenn man darauf verzichtet. :)

    - Sven Rautenberg

    --
    Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
    1. Hello Sven, hello world,

      Innerhalb eines MySQL-Querys kann ich nun Feldnamen mit Backticks markieren, was ich in den letzen Wochen auch öfter in Beispielen gesehen habe.

      Kann man - muß man aber nicht. Dient nur dazu, reservierte Worte auch als Namen nutzen zu können, was in meinen Augen nicht sehr sinnvoll ist.

      Insofern erledigt sich das Problem von selbst, wenn man darauf verzichtet. :)

      Ja, wenn man darauf verzichtet. Ich habe aber nun leider einen Kunden, der mir in seinem Pflichtenheft vorschreibt, dass Tabellen- und Feldnamen in Backticks zu stehen haben und bei jedem SQL-Statement die Ausgabe des Statements in einer eigens dafür bereitgehaltenen Statuszeile wünscht, sofern die Debug-Funktion aktiviert ist...

      Wie mache ich das nun?
      Das kann ich doch nicht einfach so ausgeben lassen - oder?
      Muss ich die Backticks irgendwie ersetzen? Reicht da htmlentities()?
      Ich kann aber keine Ersetzung dafür finden.

      Ich kann da leider auch nicht dran rütteln. Ist eine größere Firma, die es gewohnt ist, jede Eigeninititive mit weiteren 90 Tagen Zahlungsziel "zur Prüfung" zu "belohnen". Das kann ich mir im Moment nicht leisten.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Moin!

        Insofern erledigt sich das Problem von selbst, wenn man darauf verzichtet. :)

        Ja, wenn man darauf verzichtet. Ich habe aber nun leider einen Kunden, der mir in seinem Pflichtenheft vorschreibt, dass Tabellen- und Feldnamen in Backticks zu stehen haben und bei jedem SQL-Statement die Ausgabe des Statements in einer eigens dafür bereitgehaltenen Statuszeile wünscht, sofern die Debug-Funktion aktiviert ist...

        Ich konnte nicht feststellen, das ausgegebene Backticks nochmal von der Kommandozeile ausgeführt werden. Das sind stinknormale Zeichen.

        #!/usr/bin/php

        <?php
        echo "´backtick´";
        ?>

        Ich sehe das Problem nicht.

        - Sven Rautenberg

        --
        Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
        1. Hello,

          Ich konnte nicht feststellen, das ausgegebene Backticks nochmal von der Kommandozeile ausgeführt werden. Das sind stinknormale Zeichen.

          #!/usr/bin/php

          <?php
          echo "´backtick´";
          ?>

          Ich sehe das Problem nicht.

          Die von dir verwwendeten sind ja auch Vorwardticks...

          <?php
            echo "backtick";
          ?>

          So müsste es aussehen...

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. Moin!

            #!/usr/bin/php

            <?php
            echo "´backtick´";
            ?>

            Ich sehe das Problem nicht.

            Die von dir verwwendeten sind ja auch Vorwardticks...

            ...ich wußte es... :)

            <?php
              echo "backtick";
            ?>

            So müsste es aussehen...

            Und macht auch keine Probleme. Es wird erwartungsgemäß (und ohne irgendeine Shell-Fehlermeldung über das nichtexistente Programm "backtick"
            backtick
            ausgegeben.

            - Sven Rautenberg

            --
            Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
            1. Hello,

              #!/usr/bin/php

              <?php
              echo "´backtick´";
              ?>

              Ich sehe das Problem nicht.

              Die von dir verwwendeten sind ja auch Vorwardticks...

              ...ich wußte es... :)

              Was wusstest Du, dass ich nachfasse?

              <?php
                echo "backtick";
              ?>

              So müsste es aussehen...

              Und macht auch keine Probleme. Es wird erwartungsgemäß (und ohne irgendeine Shell-Fehlermeldung über das nichtexistente Programm "backtick"
              backtick
              ausgegeben.

              Dann verstehe ich aber das Beispiel nicht mehr:
              http://de2.php.net/manual/en/language.operators.execution.php

              Wie sind denn Deine Systemeinstellungen?
              Haben die bei Dir denn überhaupt schon mal getan, was sie sollten?

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              1. Moin!

                <?php
                  echo "backtick";
                ?>

                So müsste es aussehen...

                Und macht auch keine Probleme. Es wird erwartungsgemäß (und ohne irgendeine Shell-Fehlermeldung über das nichtexistente Programm "backtick"
                backtick
                ausgegeben.

                Dann verstehe ich aber das Beispiel nicht mehr:
                http://de2.php.net/manual/en/language.operators.execution.php

                Bemerke bitte den Unterschied zwischen:

                $output = cat /etc/password;
                echo "<pre>$output</pre>";

                und

                echo "cat /etc/password";

                Das eine ruft (weil Backticks entsprechend ausgeführt werden) ein externes Programm auf und speichert dessen Ausgabe in einer Variablen.

                Das andere ist ganz simpler Text.

                Wenn du Backticks im SQL-String verwendest du den nachher ausgibst, dann ist das `-Zeichen ein ganz stinknormales Zeichen, das einfach nur ausgegeben wird. Genau wie das "-Zeichen in einem String ja auch nur ein ganz normales Zeichen ist, das einfach ausgegeben wird, nicht aber vorzeitig den String beendet:

                $output= '"';
                echo "$output und so weiter";

                Das gibt ohne Fehlermeldung
                " und so weiter
                aus.

                - Sven Rautenberg

                --
                Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
                1. Hello,

                  Bemerke bitte den Unterschied zwischen:

                  Ja, guten Morgen! Habe ich auch die ganze Zeit drüber nachgedacht, aber irgendwie wohl immer im Kreis. Die Ausführung erfolgt ja bereits bei der Zuweisung an $output. Ich habe da in Gedanken immer

                  $output = "cat /etc/password";     draus gemacht. Ist ja was völlig anderes!

                  $output = cat /etc/password;
                  echo "<pre>$output</pre>";

                  und

                  echo "cat /etc/password";

                  Das eine ruft (weil Backticks entsprechend ausgeführt werden) ein externes Programm auf und speichert dessen Ausgabe in einer Variablen.

                  Das andere ist ganz simpler Text.

                  Wenn du Backticks im SQL-String verwendest du den nachher ausgibst, dann ist das `-Zeichen ein ganz stinknormales Zeichen, das einfach nur ausgegeben wird. Genau wie das "-Zeichen in einem String ja auch nur ein ganz normales Zeichen ist, das einfach ausgegeben wird, nicht aber vorzeitig den String beendet:

                  $output= '"';
                  echo "$output und so weiter";

                  Das gibt ohne Fehlermeldung
                  " und so weiter
                  aus.

                  ----------------
                  Dann könnte ich mich ja nun schlafen legen...
                  allerdings habe ich mir ja schon wieder ein neues Rätsel gebastelt, weil ich "mal eben schnell" ein Locking in das speichern.php einbauen wollte. *grummel*

                  Liebe Grüße aus http://www.braunschweig.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  1. Moin!

                    Dann könnte ich mich ja nun schlafen legen...

                    Zum Beispiel. War gestern abend ja auch schon ziemlich spät.

                    allerdings habe ich mir ja schon wieder ein neues Rätsel gebastelt, weil ich "mal eben schnell" ein Locking in das speichern.php einbauen wollte. *grummel*

                    Was ist dein Problem?

                    http://de3.php.net/flock

                    $fp = fopen("/tmp/lock.txt", "w+");

                    if (flock($fp, LOCK_EX)) { // do an exclusive lock
                      fwrite($fp, "Write something here\n");
                      flock($fp, LOCK_UN); // release the lock
                    } else {
                      echo "Couldn't lock the file !";
                    }

                    fclose($fp);

                    Locking kann so einfach sein.

                    Und gegen die möglichen Problem bei Modus "w" und "w+" kann man sich (Userkommentare sind schön) ja auch mit Modus "a" und ftruncate() schützen.

                    - Sven Rautenberg

                    --
                    Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
                    1. Hello,

                      Was ist dein Problem?
                      Locking kann so einfach sein.

                      Das Locking war nicht das Problem, sondern die Downloadfunktion des Scriptes. Auf meinem Testserver ist immer ein Code ausgelöst worden, der den Browser zum Anzeigen des HTTP-Headers gebracht hat. Da steckt noch irgendwo der Wurm drin. Hoffentlich nicht sobig.c oder wie der heißt...

                      siehe [pref:t=67743&m=387736]

                      Liebe Grüße aus http://www.braunschweig.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen