DEFINE funktioniert nicht

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

  • DEFINE funktioniert nicht

    Hallo,

    Im Kopfbereich jeder Seite habe ich folgende konstante definiert:
    PHP-Code:
    if(!defined("pfad")){define('pfad',$_SERVER["DOCUMENT_ROOT"]."/shop/",true);}


    # weiter unten im script möchte ich diese konstante nutzen
    $navl[]=array(pfad."kleider/index.php","Hosen","");

    # aber Firefox meldet:
    Firefox weiß nichtwie diese Adresse geöffnet werden soll,
    da das Protokoll (cmit keinem Programm verknüpft ist 
    Was mache ich da falsch?

    Ich möchte per define den pfad für alle scripte festlegen, da sich dieser auch nicht mehr ändern tut.
    ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

  • #2
    Der DOCUMENT_ROOT enthält keinen Pfad für deine Seite sondern einen Dateipfad, hat im HTML also nix verloren. Unter Windows ist das irgendwas in der Form C:\x\y\z und das Protokoll C kennt der Firefox dann natürlich nicht. Lass dir das $_SERVER-Array mal ausgeben und such dir einen anderen, passenden Wert raus.

    Kommentar


    • #3
      Aja gut zu wissen...ich habe bisher immer mit $_SERVER["DOCUMENT_ROOT"] auf den root zugegriffen.

      Ich habe jetzt folgende 4 möglichkeiten gefunden:
      PHP-Code:
      echo "<br />".$_SERVER['HTTP_HOST'];     # Online: domainname.de          Über Localhost: localhost
      echo "<br />".$_SERVER['SERVER_NAME'];   # Online: domainname.de          Über Localhost: localhost
      echo "<br />".$_SERVER['SERVER_ADDR'];   # Online: IP-Adresse             Über Localhost: 127.0.0.1
      echo "<br />".$_SERVER['DOCUMENT_ROOT']; # Online: /var/www/web420/html   Über Localhost: C:/xampplite/htdocs 
      Ich möchte den absoluten pfad zum root ermitteln, egal auf welcher domain das script läuft und auch ob es über localhost läuft.
      Ich möchte z.B. auf den unterordnerr domainname.de/icons zugreifen, aus jedem php-script.


      Welche möglichkeit würdet ihr mir empfehlen?
      ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

      Kommentar


      • #4
        aus jedem php-script.....
        Welche möglichkeit würdet ihr mir empfehlen?
        Den: DOCUMENT_ROOT
        Aber diesen darfst du nicht zum Browser senden.

        Du vermischt hier also 2 völlig verschiedenen Probleme.

        PS:
        Konstanten schreibt man IMMER groß!
        Das true ist da also überflüssig.
        Zuletzt geändert von combie; 15.07.2009, 10:50.
        Wir werden alle sterben

        Kommentar


        • #5
          @combie

          Da mußt du jetzt mit mir einen kurzen Lehrgang machen :-)

          Ich erinnere mich das es 2 sachen gibt:
          1. Absoluter Pfad
          2. Relativer Pfad

          Also ich möchte:
          1.
          inludes, und icon-bilder immer von ihrem festen pfad aufrufen, die scripte die das aufrufen sind in verschiedenen pfadebenen.

          2.
          Bilder (zb aus ner gallerie) an den Clientbrowser schicken


          Da brauche ich also 2 verschiedene server_variablen.
          Welche soll ich da nehmen.

          Danke für deine Hilfe
          ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

          Kommentar


          • #6
            inludes, und icon-bilder immer von ihrem festen pfad aufrufen,
            Da hast du deine 2 paar Schuhe!
            Trenne sie!


            Da mußt du jetzt mit mir einen kurzen Lehrgang machen
            Nix da!
            Wir werden alle sterben

            Kommentar


            • #7
              Zitat von RamonaS
              Ich möchte den absoluten pfad zum root ermitteln, egal auf welcher domain das script läuft und auch ob es über localhost läuft.
              Ich möchte z.B. auf den unterordnerr domainname.de/icons zugreifen, aus jedem php-script.

              Welche möglichkeit würdet ihr mir empfehlen?
              Du suchst höchstwahrscheinlich nach dem WWW-Root-Verzeichnis. Das kann auch unterhalb des Document-Root-Pfades liegen. Um diesen Pfad zu "berechnen", kann man die beiden $_SERVER-Variablen SCRIPT_NAME und SCRIPT_FILENAME missbrauchen. Irgendwo hatte ich da noch ein passendes Script in der Restekiste:

              PHP-Code:
              // returns the www root dir
              function www_root() {
                  static 
              $www_root NULL;
                  if (
              NULL !== $www_root) {
                      return 
              $www_root;
                  }
                  
              // extracting the www_root
                  
              preg_match(
                      
              '/.+(?='preg_quote($_SERVER['SCRIPT_NAME'], '/'). '\z)/i',
                      
              $_SERVER['SCRIPT_FILENAME'], 
                      
              $hits
                  
              );
                  
              $www_root = isset($hits[0][0]) ? $hits[0] : FALSE;
                  return 
              $www_root;

              Nicht von dem preg_match()-Konstrukt verwirren lassen: Das schnippelt einfach SCRIPT_NAME hinten von SCRIPT_FILENAME ab, und übrig bleibt der absolute Pfad. Geht sicher auch anders zu lösen.

              Der Teil mit dem "static" dient auch nur dazu, den einmal errechneten Pfad zwischenzuspeichern, damit das nicht bei jedem Funktionsaufruf wieder neu gemacht werden muss.

              Zitat von combie Beitrag anzeigen
              PS:
              Konstanten schreibt man IMMER groß!
              Das ist eine Konvention in armseligen Sprachen wie C[1] -- in PHP schreibe ich Konstanten-Namen mit den Zeichen, die mir passend erscheinen. Wenn man nur mit define() und defined() arbeitet (warum auch immer), kann man sogar die Beschränkung auf Buchstaben, Unterstrich und Ziffern ignorieren.
              Das Verwenden von Kleinbuchstaben hat den Vorteil, dass eigene Konstanten-Namen nicht mit anderen kollidieren (so lange nicht alle PHP-Scripts Namespaces oder Klassenkonstanten verwenden).

              ----
              [1] Wenn ich mich nicht irre, war das nichtmal C sondern wurde (wird) vom Präprozessor interpretiert.
              Zuletzt geändert von fireweasel; 15.07.2009, 13:10.
              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

              Kommentar


              • #8
                Zitat von combie Beitrag anzeigen
                Da hast du deine 2 paar Schuhe!
                Trenne sie!
                Erinnert mich an den Film mit Michel Duglas und demie Moore, da bekamm der Michel immer eMail mit:
                ...löße das problem! :-)


                Nix da!
                Och mann-o, ich dachte das forum sei dafür geschaffen :-)
                ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                Kommentar


                • #9
                  Zitat von fireweasel Beitrag anzeigen
                  Das ist eine Konvention in armseligen Sprachen wie C[1]
                  Nein, das ist einfach guter Programmierstil.

                  Zitat von fireweasel Beitrag anzeigen
                  in PHP schreibe ich Konstanten-Namen mit den Zeichen, die mir passend erscheinen.
                  Wenn du das bei uns in der Firma machen würdest, würdest du schnell eine auf den Deckel bekommen. Und ich denke viele andere Firmen werden das genauso handhaben.

                  Kommentar


                  • #10
                    Zitat von h3ll Beitrag anzeigen
                    Nein, das ist einfach guter Programmierstil.
                    Stilfragen liegen im Auge des Betrachters. Mir kommt es darauf an, welchen Nutzen ich daraus ziehe. Der kann bei Großbuchstaben genauso vorhanden sein, wie bei Kleinbuchstaben (oder irgendwelchen anderen Zeichen, mit denen der C-Präprozessor nicht klarkommt).

                    Wenn du das bei uns in der Firma machen würdest, würdest du schnell eine auf den Deckel bekommen. Und ich denke viele andere Firmen werden das genauso handhaben.
                    Ich weiß ja nicht, in welcher Sprache man fit sein muss, um bei dir in der Firma mitarbeiten zu dürfen, aber gehen wir einfach davon aus, dass es sich auch um PHP handelt. Ihr schreibt da wirklich alle FALSE, TRUE und NULL? Kann ich mir nicht vorstellen.

                    Falls nicht: Warum wird in den drei Fällen eine Ausnahme von der eisernen Regel gemacht? Ist doch irgendwie unlogisch ...

                    Und der Satz "... in PHP schreibe ich Konstanten-Namen mit den Zeichen, die mir passend erscheinen." kann viel bedeuten, unter Anderem auch, dass ich in der Lage bin, mich nach Vorgaben "von oben" zu richten.
                    Zuletzt geändert von fireweasel; 15.07.2009, 13:57.
                    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                    Kommentar


                    • #11
                      Ihr schreibt da wirklich alle FALSE, TRUE und NULL? Kann ich mir irgendwie nicht vorstellen.
                      Der Fall ist nicht einfach zu entscheiden!
                      Ich schreibe sie groß.


                      Die PHP Doku empfiehlt diese klein zu schreiben. Weil das Parsen des Quellcodes dann einen Hauch schneller geht.
                      Wir werden alle sterben

                      Kommentar


                      • #12
                        Zitat von RamonaS Beitrag anzeigen
                        Ich erinnere mich das es 2 sachen gibt:
                        1. Absoluter Pfad
                        2. Relativer Pfad
                        Und die wiederum gibt es aber an zwei Stellen:

                        Einmal im Dateisystem des Servers, auf dem du dich bewegst - und einmal im Umfeld von HTTP. Mach dir klar, warum das zwei verschiedene Dinge sind.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Zitat von RamonaS Beitrag anzeigen
                          Erinnert mich an den Film mit Michel Duglas und demie Moore, da bekamm der Michel immer eMail mit:
                          ...löße das problem! :-)
                          Der Film war doch völlig unrealistisch!

                          In diesem Forum gibt es auch keinen Professor Arthur C. Friend, der mal kurz auf Auslandsreise ist, und dessen E-Mail-Account man so einfach missbrauchen könnte ...

                          Ich möchte z.B. auf den unterordnerr domainname.de/icons zugreifen, aus jedem php-script.
                          Hier "navigierst" du im Dateisystem des Webservers umher.

                          Falls du aber im vom Script ausgegebenen HTML (bleistiftsweise) eine Grafikdatei "referenzieren" willst, befindest du dich im HTTP-Umfeld. Die "HTML-Seite" "sieht" den Server praktisch nur von außen.

                          Ich mach mal ein Beispiel, ein Beispiel.

                          Absolute Pfade:
                          Code:
                          HTTP/HTML: 
                            http://example.org/script.php   
                            http://example.org/anderes_script.php   
                            http://example.org/icons/grafik.gif
                          "example.org" ist der Domain-Name deines Servers. Alles, was danach kommt schimpft sich "request uri", lässt sich durch Anzapfen von $_SERVER['REQUEST_URI'] in Erfahrung bringen und kann (muss aber nicht) einen Pfad zu einem PHP-Script darstellen.

                          Code:
                          Dateisystem: 
                            /document_root/www/script.php
                            /document_root/www/anderes_script.php   
                            /document_root/www/icons/grafik.gif
                          Unter Windoze denken wir uns noch ein "C:" oder einen anderen Laufwerksbuchstaben vor den absoluten Dateisystempfad.

                          Um jetzt in der "script.php" ein anderes Script per include(), require() usw. einzubinden, musst du den Dateisystempfad benutzen:

                          Code:
                          absolut: 
                            /www/anderes_script.php
                          relativ (Kurzform):
                            anderes_script.php
                          relativ:
                            ./anderes_script.php
                          Gleiches gilt, wenn du die Grafik-Datei im PHP-Script benutzen möchtest (zum Beispiel mit den image-Funktionen):

                          Code:
                          absolut: 
                            /www/icons/grafik.gif
                          relativ (Kurzform):
                            icons/grafik.gif
                          relativ:
                            ./icons/grafik.gif
                          Anders sieht es aus, wenn der Browser der das vom Script erzeugte HTML darstellt, darin per <img src="" ...> oder <a href="" ...> eingebundene Grafiken vom Server holen soll[1]:

                          Code:
                          absolut:
                            http://example.org/icons/grafik.gif
                          relativ:
                            icons/grafik.gif
                          "server-relativ":
                            /icons/grafik.gif
                          [1] ... oder auch Frames, CSS-, JavaScript-Dateien, Favicons, und weiß-der-Geier-was sonst noch alles. Guckst du auch hier:
                          http://de.selfhtml.org/html/allgemein/referenzieren.htm

                          In deinem oben angegebenen Script dürfte es genügen, $_SERVER['DOCUMENT_ROOT'] aus dem Pfad zu entfernen, weil du ihn fürs Referenzieren in HTML verwenden möchtest. Also statt:
                          PHP-Code:
                          // den case-insensitive-Murks lassen wir auch weg
                          if (!defined("pfad")) {
                            
                          define('pfad'$_SERVER["DOCUMENT_ROOT"] . "/shop/");

                          nur:
                          PHP-Code:
                          if (!defined("pfad")) {
                              
                          define('pfad''/shop/');

                          oder im "guten Stil":
                          PHP-Code:
                          if (!defined('HTML_REF_PATH')) {
                              
                          define('HTML_REF_PATH''/shop/');

                          Wobei ich diese Konstante aber nur einmal definieren würde -- in dem Script, das alle anderen Scripts aufruft. Dann könnte das "if (defined())" wegfallen.

                          # aber Firefox meldet:
                          Firefox weiß nicht, wie diese Adresse geöffnet werden soll,
                          da das Protokoll (c) mit keinem Programm verknüpft ist
                          Das kommt daher, weil der Feuerfuchs in der HTML-Datei einen absoluten URL-Pfad nach "c:/dumm/di/dumm/shop/irgendwas.endung" findet. "c:" interpretiert er als Protokoll-Schema, so wie er "http:" oder "mailto:" interpretieren würde. Nur leider kennt er kein "C"-Protokoll. Mit einem relativen Pfad wäre das nicht passiert.
                          Zuletzt geändert von fireweasel; 15.07.2009, 17:37.
                          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                          Kommentar


                          • #14
                            @fireweasel

                            Wie immer ein kompetente, hilfreiche und gut erklärte Antwort!
                            Sowas hilft mir sehr gut weiter, jetzt habe ich die sache tatsächlich erklärt.

                            Ein dickes Dankeschön an dich!


                            Aber da wäre noch was:
                            Kann ich define praktisch wie eine $_SESSION einsetzen, nur das DEFINE nur einmal definiert werden kann, nicht geändert und nicht gelöscht werden kann.

                            DEFINE ist ja auf jeder seite verfügbar wenn es einmal definiert wurde...eine $_SESSION könnte man ja uU verlieren falls der user in der zwischenzeit an seinen cookies rumspielt....der inhalt/wert von DEFINE wird doch auf dem server gespeichert oder etwa auch in cookies beim client?

                            ich würde define nehmen um den pfad + dateiname festzulegen, damit ich von überall auf die datei zugreifen kann.
                            ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                            Kommentar


                            • #15
                              Empfehle mal grundlegendes nachzulesen:

                              PHP: Variablen - Manual

                              Kommentar

                              Lädt...
                              X