Malcolm Beck´s: Select, eine Variable soll zwei bedingungen erfüllen

hi,

ich habe in einer Tabelle 3 Felder ; Gruppe, Link und Titel.

Gruppe |    Link     |    Titel
-----------------------------------
   qw   | /home.html  |  Startseite
   qw   | /link.html  |    Links
   qw   | /sonst.html |  Sonstiges

Für die Select Abfrage habe ich aber nur den 'Link' zur verfügung, jetzt möchte ich aber diesen 'Link' einer 'Gruppe' zuordnen, mit 2 Select bekomme ich es zwar hin, werde aber das Gefühl nicht los, dass diese Lösung nicht so das wahre ist.

Mein derzeitiger Lösungsansatz sieht wie folgt aus:

$abfrage = "SELECT  
meine_ta.Gruppe, meine_ta.Link  
FROM meine_ta  
WHERE meine_ta.Link = '".htmlspecialchars($_SERVER['REQUEST_URI'])."'  
";  
  
  $ergebnis= mysql_query($abfrage);  
  while ($row = mysql_fetch_assoc($ergebnis)) {  
     $my_var = $row['Gruppe'];   // Hier bestimme ich die Gruppe  
  }  
  
$abfrage = "SELECT  
meine_ta.Link, meine_ta.Titel  
FROM meine_ta  
WHERE meine_ta.Gruppe = '".$my_var."'  
";  
  
  $ergebnis= mysql_query($abfrage);  
  while ($row = mysql_fetch_assoc($ergebnis)) {  
     $links[$row['Link']] = $row['Titel'];  
  }

Wie könnte ich dieses Problem noch lösen?

Datenbank: MySQL 5.0
mfg

  1. Hello Malcolm Beck´s,

    ich habe in einer Tabelle 3 Felder ; Gruppe, Link und Titel.

    Gruppe |    Link     |    Titel

    qw   | /home.html  |  Startseite
       qw   | /link.html  |    Links
       qw   | /sonst.html |  Sonstiges

    Für die Select Abfrage habe ich aber nur den 'Link' zur verfügung, jetzt möchte ich aber diesen 'Link' einer 'Gruppe' zuordnen, mit 2 Select bekomme ich es zwar hin, werde aber das Gefühl nicht los, dass diese Lösung nicht so das wahre ist.

    Mein derzeitiger Lösungsansatz sieht wie folgt aus:

    [code lang=php]$abfrage = "SELECT
    meine_ta.Gruppe, meine_ta.Link
    FROM meine_ta
    WHERE meine_ta.Link = '".htmlspecialchars($_SERVER['REQUEST_URI'])."'
    ";

    • Warum benutzt Du $_SERVER['REQUEST_URI']? Hat das einen bestimmten Grund?
    • Warum benutzt Du htmlspecialchars()? Du gibst doch nichts in den HTML-Kontext aus,
           sondern erhältst etwas über diesen Weg
    • Warum unterlässt Du es, mysql_real_escape_string() zu verwenden oder bei einem
           anderen DBMS eben die entsprechende Funktion?

    Entscheide Dich erst einmal für die Aufrufmethode (GET, POST), dann sollte es Dir doch klar werden, dass dort beliebig viele Requestparemeter übergeben wrden können

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. hi Tom,

      • Warum benutzt Du $_SERVER['REQUEST_URI']? Hat das einen bestimmten Grund?

      Ja, da ich mittels mod_rewrite meine URI umschreibe komm ich nicht anders an den Link.

      • Warum benutzt Du htmlspecialchars()? Du gibst doch nichts in den HTML-Kontext aus, sondern erhältst etwas über diesen Weg

      Ja, ich wusste es ist falsch, da ich aber auch nicht wusste, was richtig ist, habe ich es einfach hingeschrieben, in der Hoffnung, dass mich jemand korrigiert :)

      • Warum unterlässt Du es, mysql_real_escape_string() zu verwenden oder bei einem anderen DBMS eben die entsprechende Funktion?

      Meinst du an dieser stelle?

        
      WHERE meine_ta.Link = '".rawurldecode($_SERVER['REQUEST_URI'])."'  
      
      

      Was muss denn da nun rein?

      Entscheide Dich erst einmal für die Aufrufmethode (GET, POST), dann sollte es Dir doch klar werden, dass dort beliebig viele Requestparemeter übergeben wrden können

      Leider keine von beiden, mit $_GET hätte ich ja keine Probleme mehr, benutze ich auch ausschließlich im Admin-Interface, aber auf meiner Seite möchte ich schöne Links haben.

      mfg

      1. Hallo

        1. Absatz:

        • Warum benutzt Du htmlspecialchars()? Du gibst doch nichts in den HTML-Kontext aus, sondern erhältst etwas über diesen Weg

        2. Absatz:

        Ja, ich wusste es ist falsch, da ich aber auch nicht wusste, was richtig ist, habe ich es einfach hingeschrieben, in der Hoffnung, dass mich jemand korrigiert :)

        3. Absatz:

        • Warum unterlässt Du es, mysql_real_escape_string() zu verwenden oder bei einem anderen DBMS eben die entsprechende Funktion?

        bitte den vorhergehenden Absatz nochmal lesen

        Meinst du an dieser stelle?

        WHERE meine_ta.Link = '".rawurldecode($_SERVER['REQUEST_URI'])."'

          
        Nein! Nein!! Nein!!! NEIN!!! :|| (da capo al fine)  
          
        
        > Was muss denn da nun rein?  
          
        Bitte begib Dich zum dritten Absatz. Lies ihn! Finde heraus, welche Funktion  
        dort erwähnt wird. Lies im PHP-Handbuch nach, wozu diese Funktion gut ist. Suche im Forumsarchiv (2008 sollte schon genügen, vielleicht nimm noch 2007 mit) nach Beiträgen, die sich mit PHP oder Datenbanken beschäftigen und die von Tom erwähnte Funktion enthalten. Du wirst viel Lesenswertes finden.  
          
        Tipp: Entsorge den antiquierten mysql\_\*-Kram. Verwende stattdessen [mysqli](http://www.php.net/manual/de/book.mysqli.php) oder von mir aus einen DB-Abstraktionslayer. Aber doch kein mysql\_\* mehr, deren Zeiten sind inzwischen vorbei!.  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. hi,

          1. Absatz:
          • Warum unterlässt Du es, mysql_real_escape_string() zu verwenden oder bei einem anderen DBMS eben die entsprechende Funktion?

          WHERE meine_ta.Link = '".rawurldecode($_SERVER['REQUEST_URI'])."'

          
          > Bitte begib Dich zum dritten Absatz. Lies ihn! Finde heraus, welche Funktion  
          > dort erwähnt wird. Lies im PHP-Handbuch nach, wozu diese Funktion gut ist.  
            
          An sich doch nur, wenn ich etwas in die Datenbank reinschreibe, ich werde mich aber nochmal da rein lesen.  
            
          
          > Suche im Forumsarchiv (2008 sollte schon genügen, vielleicht nimm noch 2007 mit) nach Beiträgen, die sich mit PHP oder Datenbanken beschäftigen und die von Tom erwähnte Funktion enthalten. Du wirst viel Lesenswertes finden.  
            
          Ja, ich weiss, SQL Injection, das mit dem Select habe ich wohl in der Zwischenzeit vergessen.  
            
          
          > Tipp: Entsorge den antiquierten mysql\_\*-Kram. Verwende stattdessen [mysqli](http://www.php.net/manual/de/book.mysqli.php) oder von mir aus einen DB-Abstraktionslayer. Aber doch kein mysql\_\* mehr, deren Zeiten sind inzwischen vorbei!.  
            
          Das wollte ich schon neulich tun, als du mich drauf hingewiesen hattest, nur kann ich nicht mal eine Verbindung mittels mysqli aufbauen, da ich dafür MySQL 5.0.7 benötige, aber nur 5.0 zur Verfügung habe.  
            
          mfg  
          
          -- 
          [I have a Dream...](http://www.myvideo.de/watch/2503116/I_have_a_dream_Will_I_AM_feat_Common)  
          
          
          1. Hallo

            • Warum unterlässt Du es, mysql_real_escape_string() zu verwenden oder bei einem anderen DBMS eben die entsprechende Funktion?

            WHERE meine_ta.Link = '".rawurldecode($_SERVER['REQUEST_URI'])."'

              
            
            > An sich doch nur, wenn ich etwas in die Datenbank reinschreibe, ich werde mich aber nochmal da rein lesen.  
              
            Nein. Ein Beispiel:  
              
            ~~~sql
              
            SELECT  
                feld  
            FROM  
                tabelle  
            WHERE  
                anderesfeld = 'O'Brien'  
            
            

            Kannst Du in dieser Anweisung ein Problem ausmachen?

            Tipp: Entsorge den antiquierten mysql_*-Kram. Verwende stattdessen mysqli oder von mir aus einen DB-Abstraktionslayer. Aber doch kein mysql_* mehr, deren Zeiten sind inzwischen vorbei!.

            Das wollte ich schon neulich tun, als du mich drauf hingewiesen hattest, nur kann ich nicht mal eine Verbindung mittels mysqli aufbauen, da ich dafür MySQL 5.0.7 benötige, aber nur 5.0 zur Verfügung habe.

            Bitte schreibe Dir die Ausgabe von

            [code lang=sql]SELECT VERSION()]

            ab und poste sie hier.

            Freundliche Grüße

            Vinzenz

            1. hi,

              Nein. Ein Beispiel:

              SELECT
                  feld
              FROM
                  tabelle
              WHERE
                  anderesfeld = 'O'Brien'

              
              > Kannst Du in dieser Anweisung ein Problem ausmachen?  
                
              Ja, das O', htmlentities wäre wohl auch falsch. Ich muss mich da später nochmal reinlesen, ich ging die ganze zeit von htmlspecialchars() aus.  
                
                
              
              > Bitte schreibe Dir die Ausgabe von  
              >     [code lang=sql]SELECT VERSION()]  
              > ab und poste sie hier.  
                
              Webserver: 5.0.51a-log  
                
              mfg  
              
              -- 
              [I have a Dream...](http://www.myvideo.de/watch/2503116/I_have_a_dream_Will_I_AM_feat_Common)  
              
              
              1. Hello Malcolm E. Beck's,

                [...]

                WHERE
                    anderesfeld = 'O'Brien'
                [/code]
                Kannst Du in dieser Anweisung ein Problem ausmachen?

                Ja, das O', htmlentities wäre wohl auch falsch. Ich muss mich da später nochmal reinlesen, ich ging die ganze zeit von htmlspecialchars() aus.

                Nicht das O' ist das problem, sondern das Binnen-Häkchen, also das Häkchen mitten im Nutztext. Das muss passend zur Schnittstelle maskiert werden, da es sonst den kombinierten Befehls-Daten-String zersört. Die Text-Schnittstelle des SQL-Interface kann nicht erkennen, ob es sich um ein Steuerzeichen  oder um einen Datenbestandteil handelt. Das musst Du ihr sagen.

                Mehr Geheimnis steckt eigentlich auch nicht hinter SQL-Injection. Dort wird die "Verwirrung der Schnittstelle" gezielt eingesezt, um über Datenwerte Befehlssequenzen einzuschmuggeln.

                http://de.wikipedia.org/wiki/SQL-Injection

                Liebe Grüße aus Syburg bei Dortmund

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. hi Tom,

                  Hello Malcolm E. Beck's,

                  ^^ Was wird'n dass? :)

                  Nicht das O' ist das problem, sondern das Binnen-Häkchen, also das Häkchen mitten im Nutztext. Das muss passend zur Schnittstelle maskiert werden, da es sonst den kombinierten Befehls-Daten-String zersört. Die Text-Schnittstelle des SQL-Interface kann nicht erkennen, ob es sich um ein Steuerzeichen  oder um einen Datenbestandteil handelt. Das musst Du ihr sagen.

                  Das Binnen-Häkchen meinte ich auch, ist schon Paar Monate her, dass ich mich mit Datenbanken beschäftigt hatte, dass Update hat mich wach gerüttelt :)

                  Mehr Geheimnis steckt eigentlich auch nicht hinter SQL-Injection. Dort wird die "Verwirrung der Schnittstelle" gezielt eingesezt, um über Datenwerte Befehlssequenzen einzuschmuggeln.
                  http://de.wikipedia.org/wiki/SQL-Injection

                  Bis vor 7 Minuten stand mein System mit runtergelassenen Hosen da und hat nur darauf gewartet, ich hatte in den Select garnichts escaped, ist jetzt behoben.

                  Danke für die Erklärung.

                  mfg und Gute Nacht, ich mach Feierabend für heut.

              2. Hallo

                SELECT
                    feld
                FROM
                    tabelle
                WHERE
                    anderesfeld = 'O'Brien'

                
                > > Kannst Du in dieser Anweisung ein Problem ausmachen?  
                >   
                > Ja, das O', htmlentities wäre wohl auch falsch. Ich muss mich da später nochmal reinlesen, ich ging die ganze zeit von htmlspecialchars() aus.  
                  
                Es gibt einen einfachen Grundsatz. Behandle Daten gemäß dem Kontext, in dem Du die Daten verwendest. Datenbankzugriffe sind \*kein\* HTML-Kontext, auch kein URL-Kontext - nein Du hast einen Datenbank-Kontext :-) Ist doch nicht schwer?  
                  
                
                > > Bitte schreibe Dir die Ausgabe von  
                > >     [code lang=sql]SELECT VERSION()]  
                > > ab und poste sie hier.  
                  
                
                > Webserver: 5.0.51a-log  
                  
                Sieht doch gar nicht so schlecht aus. Das war bis vor weniger als einer Woche die aktuelle Produktionsversion ([seit 4. August gibt es die 5.0.67](http://dev.mysql.com/doc/refman/5.0/en/releasenotes-cs-5-0.html) :-))  
                  
                Deine Bedenken hinsichtlich der Einsatzfähigkeit von mysqli sollten nun doch aus dem Weg geräumt sein.  
                  
                  
                Freundliche Grüße  
                  
                Vinzenz
                
                1. hi,

                  Es gibt einen einfachen Grundsatz. Behandle Daten gemäß dem Kontext, in dem Du die Daten verwendest. Datenbankzugriffe sind *kein* HTML-Kontext, auch kein URL-Kontext - nein Du hast einen Datenbank-Kontext :-) Ist doch nicht schwer?

                  Nein, nicht wirklich, ich konnte das Select nur nicht so richtig einordnen, wobei ich gerade festgestellt hatte, dass mein CMS mit heruntergelassenen Hosen auf Angriffe gewartet hatte :) (ist jetzt behoben)

                  Sieht doch gar nicht so schlecht aus. Das war bis vor weniger als einer Woche die aktuelle Produktionsversion (seit 4. August gibt es die 5.0.67 :-))
                  Deine Bedenken hinsichtlich der Einsatzfähigkeit von mysqli sollten nun doch aus dem Weg geräumt sein.

                  Ich werde es nochmal probieren, allerdings frühestens erst Morgen wieder, ich mach jetzt erstmal Feierabend, war heute ein langer -- anstrengender Tag.

                  mfg, Gute Nacht und Danke!

          2. Tach.

            Tipp: Entsorge den antiquierten mysql_*-Kram. Verwende stattdessen mysqli oder von mir aus einen DB-Abstraktionslayer. Aber doch kein mysql_* mehr, deren Zeiten sind inzwischen vorbei!.

            Das wollte ich schon neulich tun, als du mich drauf hingewiesen hattest, nur kann ich nicht mal eine Verbindung mittels mysqli aufbauen, da ich dafür MySQL 5.0.7 benötige, aber nur 5.0 zur Verfügung habe.

            Laut Handbuch reicht schon die 4.1.3, und ich kann bestätigen, daß keine 5er nötig ist.

            --
            Once is a mistake, twice is Jazz.
            1. hi,

              Das wollte ich schon neulich tun, als du mich drauf hingewiesen hattest, nur kann ich nicht mal eine Verbindung mittels mysqli aufbauen, da ich dafür MySQL 5.0.7 benötige, aber nur 5.0 zur Verfügung habe.

              Laut Handbuch reicht schon die 4.1.3, und ich kann bestätigen, daß keine 5er nötig ist.

              Ja, auf meiner Lokalen Maschine läuft das auch, nur auf meinem Webserver nicht.

              /* Line 24 */ $mysqli = new mysqli("host", "database_user", "db_pass", "db_name");  
                
              /* check connection */  
              if (mysqli_connect_errno()) {  
                  printf("Connect failed: %s\n", mysqli_connect_error());  
                  exit();  
              }  
                
              printf("Host information: %s\n", $mysqli->host_info);
              

              Ergebnis:
              Fatal error: Cannot instantiate non-existent class: mysqli in /***/***/***/***.php on line 24

              Lokales Ergebnis:
              Host information: localhost via TCP/IP

              Daher gehe ich mal davon aus, dass ich mysqli() nicht nutzen kann, oder liege ich falsch und der Fehler liegt woanders?

              mfg

              1. echo $begrüßung;

                Fatal error: Cannot instantiate non-existent class: mysqli in /***/***/***/***.php on line 24
                Daher gehe ich mal davon aus, dass ich mysqli() nicht nutzen kann, oder liege ich falsch und der Fehler liegt woanders?

                Jein. Frag bitte mal mit phpinfo(), welche PHP-Version du verwendest. Wenn es Version 4 ist, erkundige dich beim Provider (oder auf dessen Supportseiten), wie du die Scripte unter Version 5 laufen lassen kannst. Wenn es bereits Version 5 ist, frag ihn, warum mysqli nicht zur Verfügung steht.

                echo "$verabschiedung $name";

                1. hi,

                  Jein. Frag bitte mal mit phpinfo(), welche PHP-Version du verwendest. Wenn es Version 4 ist,

                  Oh, ich ging bei 1und1 die ganze Zeit von PHP 5 aus, http://start-navi.de/info.php ("phpversion()").

                  erkundige dich beim Provider (oder auf dessen Supportseiten), wie du die Scripte unter Version 5 laufen lassen kannst. Wenn es bereits Version 5 ist, frag ihn, warum mysqli nicht zur Verfügung steht.

                  Werde gleich mal den Support anrufen und das Ergebnis hier Posten.

                  mfg

                  1. echo $begrüßung;

                    erkundige dich beim Provider (oder auf dessen Supportseiten), wie du die Scripte unter Version 5 laufen lassen kannst. [...]
                    Werde gleich mal den Support anrufen und das Ergebnis hier Posten.

                    Das teure Geld kannst du dir sparen. Auf den Supportseiten steht beschrieben, wie man PHP5 als Voreinstellung konfiguriert. Alternativ aber nicht unbedingt sinnvoll kannst du deine Dateien auf .php5 enden lassen.

                    echo "$verabschiedung $name";

                    1. hi,

                      Das teure Geld kannst du dir sparen. Auf den Supportseiten steht beschrieben, wie man PHP5 als Voreinstellung konfiguriert. Alternativ aber nicht unbedingt sinnvoll kannst du deine Dateien auf .php5 enden lassen.

                      Zu spät, hab gerade aufgelegt :)

                      http://start-navi.de/info.php5, ich kann es laut Support aber auch über eine php.ini einstellen, werde aber die .php5 Variante nutzen.

                      Vielen Dank allen für die Hilfe, ich werde mich jetzt erstmal an mysqli versuchen.

                      mfg

                      1. echo $begrüßung;

                        Das teure Geld kannst du dir sparen. Auf den Supportseiten steht beschrieben, wie man PHP5 als Voreinstellung konfiguriert. Alternativ aber nicht unbedingt sinnvoll kannst du deine Dateien auf .php5 enden lassen.

                        Zu spät, hab gerade aufgelegt :)
                        http://start-navi.de/info.php5, ich kann es laut Support aber auch über eine php.ini einstellen, werde aber die .php5 Variante nutzen.

                        Nein, wenn die php.ini an der Reihe ist, gelesen zu werden, ist bereits entschieden, welches PHP gestartet wurde. Diese Unterscheidung musst du über die Webserver-Konfiguration erledigen. Der passende Artikel aus dem 1&1-Supportbereich ist: Wie kann ich .php Dateien als PHP5 parsen lassen?

                        echo "$verabschiedung $name";

    2. echo $begrüßung;

      WHERE meine_ta.Link = '".htmlspecialchars($_SERVER['REQUEST_URI'])."'

      • Warum benutzt Du htmlspecialchars()? Du gibst doch nichts in den HTML-Kontext aus,
             sondern erhältst etwas über diesen Weg

      Nein, ein HTML-Kontext liegt für die Daten in den EGPCS-Arrays nicht vor. Einige stammen von einem HTTP-Kontext, werden aber von PHP bereits so behandelt, dass sie quasi kontextlos sind. Höchstend die Magic Quotes in GPC-Arrays sind gegebenenfalls zu berücksichtigen.

      echo "$verabschiedung $name";

      1. Hello,

        WHERE meine_ta.Link = '".htmlspecialchars($_SERVER['REQUEST_URI'])."'

        • Warum benutzt Du htmlspecialchars()? Du gibst doch nichts in den HTML-Kontext aus,
               sondern erhältst etwas über diesen Weg

        Nein, ein HTML-Kontext liegt für die Daten in den EGPCS-Arrays nicht vor. Einige stammen von einem HTTP-Kontext, werden aber von PHP bereits so behandelt, dass sie quasi kontextlos sind. Höchstend die Magic Quotes in GPC-Arrays sind gegebenenfalls zu berücksichtigen.

        Darum steht dort ja auch "über diesen Weg". Was auf diesem Weg [umgekehrte Richting von "zum Browser"] noch so alles passiert, habe ich doch gar nicht beschreiben.

        In einem HTML-Formular word etwas eingegeben
        der Browser verpackt die Parametger HTTP-konform und übergibt sie dem OS
        das das OS überträgt diese per per Request über ein Netzwerk an ein anderes OS
        Das andere OS übergibt den Request an ein Programm am passenden Port
        Dieser verfährt pflichtgemäß [Protokoll und eigene Spezuifikationen] mit dem Request
        und gibt diesen an einen Subprozess[*] weiter

        und genau in diesem befinden wir uns nun. Das PHP-Runtime hat das übergebene Environment auszuwerten, aufzubereiten und an den Prozess für das Script weiterzureichen.

        Der Request stammt also aus einem HTML-Kontext und ist hier nicht dafür gedacht, in einen solchen direkt wieder einzutreten. Vielmehr tritt er in einen "normalisierten" Kontext ein, in dem Daten eigentlich als "raw data" vorliegen sollten, was aber leider durch magic quotes nicht immer so ist.

        [*] Im Sinne von "Antwort wird erwaret:  auch Prallelprozess / Dienst / Server / ...

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. echo $begrüßung;

          Darum steht dort ja auch "über diesen Weg". Was auf diesem Weg [umgekehrte Richting von "zum Browser"] noch so alles passiert, habe ich doch gar nicht beschreiben.

          Das ist zwar insgesamt wissenswert, aber für den Moment der Datenverarbeitung in einem PHP-Script komplett irrelevant. Hier interessiert nur, dass die Daten (ohne vorherige Fehler in der Verarbeitungskette) in Rohform in den EGPCS-Arrays zur Verfügung stehen, eventuell verunreinigt durch die Magic Quotes.

          Der Request stammt also aus einem HTML-Kontext ...

          Und das ist keinesfalls zwingende Voraussetzung. Man kann HTTP auch ohne irgendwelches Berührungen mit HTML nutzen. Selbst wenn die Daten ursprünglich mal in einem HTML-Kontext standen, ist dieser längst Geschichte und vom Browser bereits nach dessen Parsen entsorgt worden. Auch wenn der Benutzer Daten in ein Formular eingibt, geschieht das nicht in einem HTML-Kontext. Der Browser bringt sie auch nicht in einen solchen. Wozu auch, sie müssen nur für HTTP aufbereitet werden (sieht man mal von clientseitigen Scripten ab).

          ... und ist hier nicht dafür gedacht, in einen solchen direkt wieder einzutreten. Vielmehr tritt er in einen "normalisierten" Kontext ein, in dem Daten eigentlich als "raw data" vorliegen sollten, was aber leider durch magic quotes nicht immer so ist.

          Das ist soweit wieder richtig. Es interessiert nur nicht, wo die Daten herkommen. Als verarbeitendes Script hat man darauf sowie keinen Einfluss. Man kann und darf sich sowieso nicht auf vorangehende Prozesse verlassen, was den Inhalt der zu erwartenden Daten angeht. Aber Validierung von Eingabedaten ist ein anderes Thema.

          echo "$verabschiedung $name";

  2. Hallo Malcolm,

    ich habe in einer Tabelle 3 Felder ; Gruppe, Link und Titel.

    Gruppe |    Link     |    Titel

    qw   | /home.html  |  Startseite
       qw   | /link.html  |    Links
       qw   | /sonst.html |  Sonstiges

    Für die Select Abfrage habe ich aber nur den 'Link' zur verfügung, jetzt möchte ich aber diesen 'Link' einer 'Gruppe' zuordnen, mit 2 Select bekomme ich es zwar hin, werde aber das Gefühl nicht los, dass diese Lösung nicht so das wahre ist.

    Wie könnte ich dieses Problem noch lösen?

    Welches Problem? Welches Ergebnis hättest Du denn gern?

    Datenbank: MySQL 5.0

    Was ist das Ergebnis von

    SELECT VERSION()

    Freundliche Grüße

    Vinzenz

    1. hi Vinzenz,

      Gruppe |    Link     |    Titel

      qw   | /home.html  |  Startseite
         qw   | /link.html  |    Links
         qw   | /sonst.html |  Sonstiges

      Wie könnte ich dieses Problem noch lösen?
      Welches Problem? Welches Ergebnis hättest Du denn gern?

      Ich habe in einer Variable den 'Link', möchte aber in der Select Abfrage auch direkt die Gruppe zu dem Link ermitteln, um mit diesen weiter zu arbeiten.

      Datenbank: MySQL 5.0
      Was ist das Ergebnis von
          SELECT VERSION()

      Lokal: phpMyAdmin - 2.11.3 MySQL-Client-Version: 5.0.51
      Webserver(1und1) steht nur MySQL: 5.0

      mfg

      1. Hallo Malcolm,

        Gruppe |    Link     |    Titel

        qw   | /home.html  |  Startseite
           qw   | /link.html  |    Links
           qw   | /sonst.html |  Sonstiges

        Wie könnte ich dieses Problem noch lösen?
        Welches Problem? Welches Ergebnis hättest Du denn gern?

        Ich habe in einer Variable den 'Link', möchte aber in der Select Abfrage auch direkt die Gruppe zu dem Link ermitteln, um mit diesen weiter zu arbeiten.

        ich verstehe immer noch nur Bahnhof.

        gewünschtes Ergebnis, z.B:

        Gruppe
        ------
          qw

        weil, <es folgt Deine Begründung>

        Verstehst Du, ich möchte wissen, welches Resultat Du aufgrund Deiner Beispieldaten gerne hättest - mit der Begründung dafür. *Ich* kann es mir immer noch nicht selbst zusammenreimen.

        Datenbank: MySQL 5.0
        Was ist das Ergebnis von
            SELECT VERSION()

        Lokal: phpMyAdmin - 2.11.3 MySQL-Client-Version: 5.0.51
        Webserver(1und1) steht nur MySQL: 5.0

        könntest Du bitte auf Deinem Webspace (auch 1 und 1 stellt meines Wissens phpMyAdmin zur Verfügung):

        SELECT VERSION()

        absetzen und das Resultat hier angeben. 1 und 1 wird seinen MySQL-Server nicht derart patchen, dass er ein blödsinnig falsches Resultat zurückliefert.

        Die exakte Version MySQL 5.0 gab und gibt es nicht.

        Freundliche Grüße

        Vinzenz

        1. hi Vinzenz,

          gewünschtes Ergebnis, z.B:
          Gruppe

          qw
          weil, <es folgt Deine Begründung>

          Ich frage über $_SERVER['REQUEST_URI'] den Aktuellen URI ab, diesen Vergleiche ich dann mit der 'Link' Tabelle in meiner DB.

          Wenn es diesen Link in der DB gibt, gibt es zu dem Link eine bestimmte Gruppe, die der Link angehört, welche Gruppe es ist, weiss ich aber nicht, da ich ja erstmal mit Select vergleichen muss.

          Erst wenn ich ein Select abgesetzt habe, kenne ich die Gruppe, um jetzt mit der Gruppe zu arbeiten, muss ich noch ein Select absetzen, da ich ja jetzt erst weiss, um welche Gruppe es sich handelt.

          Ich wollte nur wissen, ob sich dass mit einem Select erledigen lässt.

          könntest Du bitte auf Deinem Webspace (auch 1 und 1 stellt meines Wissens phpMyAdmin zur Verfügung):
              SELECT VERSION()

          Sorry, ich wusste nicht, dass das eine Funktion ist.

          Webserver: 5.0.51a-log

          mfg

          1. Hallo Malcolm,

            gewünschtes Ergebnis, z.B:
            Gruppe

            qw
            weil, <es folgt Deine Begründung>

            Ich frage über $_SERVER['REQUEST_URI'] den Aktuellen URI ab, diesen Vergleiche ich dann mit der 'Link' Tabelle in meiner DB.

            sorry, der Teil ist völlig irrelevant. Wir lassen PHP einfach außen vor.
            Ich habe Dein Ausgangsposting nochmals intensiv durchgelesen. Soweit ich Dich verstanden habe, möchtest Du alle Links und alle Titel haben, die in der gleichen Gruppe sind wie der übergebene Link?

            Ausgangstabelle:

            Gruppe |    Link     |    Titel
            -----------------------------------
               qw   | /home.html  |  Startseite
               qw   | /link.html  |    Links
               qw   | /sonst.html |  Sonstiges

            Link: /home.html

            gewünschtes Ergebnis:

            |    Link     |    Titel
            ---------------------------
            | /home.html  |  Startseite
            | /link.html  |    Links
            | /sonst.html |  Sonstiges

            weil diese sich in der gleichen Gruppe befinden wie /home.html, das sich in der Gruppe qw befindet. Ist das so?

            Mir fallen spontan zwei Wege ein, die dahin führen, das eine wäre ein Selfjoin, das andere ein Subselect, wobei ich davon ausgehe, das die Werte in der Spalte link eindeutig sind:

            1. Lösung mit Selfjoin:

            Wir benötigen
                die Links und
                die Titel
            aus der
                Tabelle
            die sich in der gleichen Gruppe
                befinden wie der Link /home.html

              
            SELECT  
                t1.link,  
                t1.titel  
            FROM  
                tabelle t1  
            INNER JOIN  
                tabelle t2  
            ON  
                t1.Gruppe = t2.Gruppe  
            WHERE  
                t2.link = '/home.html' -- Beachte, dass die Einschränkung in der  
                                       -- anderen Tabelle gemacht wird als der, aus  
                                       -- der Du Deine Ergebnisdaten nimmst.  
            
            

            2. Subselect

              
            SELECT                     -- Gib mir  
                t1.Link,               -- Link und  
                t1.Titel               -- Titel  
            FROM                       -- aus meiner  
                tabelle                -- Tabelle  
            WHERE                      -- wobei die  
                t1.Gruppe IN (         -- Gruppe in der Liste der  
                    SELECT  
                        t2.Gruppe      -- Gruppen sein muss,  
                    FROM  
                        tabelle t2  
                    WHERE  
                        t2.Link = '/home.html'  -- in der sich der angegebene Link  
                                                -- befindet  
                )  
            
            

            Prinzipiell täte es im zweiten Fall statt dem Operator IN auch ein
            Gleichheitszeichen, wenn sich ein Link nur in einer Gruppe befinden kann.

            Freundliche Grüße

            Vinzenz

            1. hi Vinzenz,

              Ich habe Dein Ausgangsposting nochmals intensiv durchgelesen. Soweit ich Dich verstanden habe, möchtest Du alle Links und alle Titel haben, die in der gleichen Gruppe sind wie der übergebene Link?
              weil diese sich in der gleichen Gruppe befinden wie /home.html, das sich in der Gruppe qw befindet. Ist das so?

              Ja, dass ist das gewünschte Ergebnis, ich muss wirklich an meiner Problembeschreibung arbeiten.

              Selfjoin,

              SELECT
                  t1.link,
                  t1.titel
              FROM
                  tabelle t1
              INNER JOIN
                  tabelle t2
              ON
                  t1.Gruppe = t2.Gruppe
              WHERE
                  t2.link = '/home.html'
              -- Beachte, dass die Einschränkung in der
              -- anderen Tabelle gemacht wird als der, aus
              -- der Du Deine Ergebnisdaten nimmst.

                
              Ja, dass funktioniert, nur mal eine zwischenfrage, um es zum laufen zu bringen, musste ich eine zweite Tabelle anlegen und die Daten trennen, dass ist richtig oder?  
              Würde das auch aus einer einzigen Tabelle heraus funktionieren? Wobei das nicht so wichtig ist, ich frag nur aus Neugier.  
                
              
              > Prinzipiell täte es im zweiten Fall statt dem Operator IN auch ein  
              > Gleichheitszeichen, wenn sich ein Link nur in einer Gruppe befinden kann.  
                
              Die zweite Variante werde ich gleich auch mal ausprobieren.  
                
              Vielen Dank für die Hilfe.  
                
              mfg  
              
              -- 
              [I have a Dream...](http://www.myvideo.de/watch/2503116/I_have_a_dream_Will_I_AM_feat_Common)  
              
              
              1. Hallo

                Ich habe Dein Ausgangsposting nochmals intensiv durchgelesen. Soweit ich Dich verstanden habe, möchtest Du alle Links und alle Titel haben, die in der gleichen Gruppe sind wie der übergebene Link?
                weil diese sich in der gleichen Gruppe befinden wie /home.html, das sich in der Gruppe qw befindet. Ist das so?

                Ja, dass ist das gewünschte Ergebnis, ich muss wirklich an meiner Problembeschreibung arbeiten.

                das hast Du richtig erkannt. Ich habe Dich mindestens zweimal danach gefragt
                und konkrete Beispiele angegeben, was ich wissen muss. Du hast das leider
                ignoriert. Das ist eine schlechte Idee. Mache es Deinen potentiellen Helfern
                so leicht wie möglich!

                Selfjoin,

                Ja, dass funktioniert, nur mal eine zwischenfrage, um es zum laufen zu bringen, musste ich eine zweite Tabelle anlegen

                nicht anlegen. Die gleiche Tabelle in einem Statement unter zwei verschiedenen
                (Alias-)Namen ansprechen - exakt so wie es in meinem verlinkten Artikel steht.

                und die Daten trennen, dass ist richtig oder?
                Würde das auch aus einer einzigen Tabelle heraus funktionieren? Wobei das nicht so wichtig ist, ich frag nur aus Neugier.

                Nein, natürlich nicht, deswegen habe ich doch extra den entsprechenden Hinweis
                unter "Beachte" hingeschrieben:

                SELECT          -- wähle aus der ersten "Instanz" der Tabelle
                    t1.link,      -- Deine Zielspalten aus ...
                    t1.titel
                FROM
                    tabelle t1    -- spreche die Tabelle mit dem Namen t1 an.
                INNER JOIN
                    tabelle t2    -- spreche die gleiche Tabelle mit dem Namen t2 an.
                ON                         -- verknüpfe über die Spalte Gruppe,
                    t1.Gruppe = t2.Gruppe  -- denn Du willst ja Einträge haben, die

                -- in der gleichen Gruppe sind.

                WHERE                      -- Mache die Einschränkungen in der
                    t2.link = '/home.html' -- zweiten "Instanz"
                -- Beachte, dass die Einschränkung in der
                -- anderen Tabelle gemacht wird als der, aus
                -- der Du Deine Ergebnisdaten nimmst.

                Freundliche Grüße

                Vinzenz

                1. hi,

                  ich muss wirklich an meiner Problembeschreibung arbeiten.
                  das hast Du richtig erkannt. Ich habe Dich mindestens zweimal danach gefragt und konkrete Beispiele angegeben, was ich wissen muss. Du hast das leider ignoriert. Das ist eine schlechte Idee. Mache es Deinen potentiellen Helfern so leicht wie möglich!

                  Bitte nicht falsch verstehen, ich ignoriere hier keinen, erst recht niemanden, der mir helfen will, nur mangelt es mir an einem verständlichen Schreibstil.
                  Dazu kommt, dass ich versuche, meine Postings möglichst kurz zu halten, da liegt wahrscheinlich das grösste Problem.

                  Selfjoin,
                  nicht anlegen. Die gleiche Tabelle in einem Statement unter zwei verschiedenen
                  (Alias-)Namen ansprechen - exakt so wie es in meinem verlinkten Artikel steht.

                  Ahh, jetzt hab ich es :) Ich weiß nicht, was ich Gestern und heute Morgen gemacht hab, jetzt läuft es jedenfalls nur aus einer Tabelle heraus.

                  Würde das auch aus einer einzigen Tabelle heraus funktionieren? Wobei das nicht so wichtig ist, ich frag nur aus Neugier.
                  Nein, natürlich nicht, deswegen habe ich doch extra den entsprechenden Hinweis
                  unter "Beachte" hingeschrieben:

                  Das hatte ich im ersten und zweiten Anlauf nicht richtig verstanden, jetzt funktioniert es.

                  Vielen Dank!

                  Bleibt noch die Frage mit mysqli.
                  Ergebnis:
                  Fatal error: Cannot instantiate non-existent class: mysqli in /***/***/***/***.php on line 24

                  Mache ich was falsch oder kann ich es auf meinem Webserver nicht nutzen?

                  mfg

                  1. Hallo Malcolm,

                    Bitte nicht falsch verstehen, ich ignoriere hier keinen, erst recht niemanden, der mir helfen will, nur mangelt es mir an einem verständlichen Schreibstil.
                    Dazu kommt, dass ich versuche, meine Postings möglichst kurz zu halten, da liegt wahrscheinlich das grösste Problem.

                    Statt einfach eine dreizeilige Tabelle hinzuschreiben (kopieren aus der Ausgangstabelle) schreibst Du lieber zwei mal drei Zeilen, die man interpretieren muss. Am falschen Ende gespart.

                    Weißt Du, in vielen Fällen hier im Forum ist es ein Problem, dass der Fragesteller beschreibt, was er *tun* will, aber nicht, was er wirklich *erreichen* will. Oft ist das, was er tun will, nicht angemessen oder einfach völlig falsch.

                    Nein, natürlich nicht, deswegen habe ich doch extra den entsprechenden Hinweis
                    unter "Beachte" hingeschrieben:

                    Das hatte ich im ersten und zweiten Anlauf nicht richtig verstanden, jetzt funktioniert es.

                    Vielen Dank!

                    Bitte, gern geschehen. Ich helfe wirklich gerne.

                    Bleibt noch die Frage mit mysqli.
                    Ergebnis:
                    Fatal error: Cannot instantiate non-existent class: mysqli in /***/***/***/***.php on line 24

                    Mache ich was falsch oder kann ich es auf meinem Webserver nicht nutzen?

                    Was sagt

                    [link:http://www.php.net/manual/de/function.phpinfo.php@title=phpinfo]();

                    zu mysqli, siehe auch Antwort von dedlfix?

                    Freundliche Grüße

                    Vinzenz

                    1. hi Vinzenz,

                      Statt einfach eine dreizeilige Tabelle hinzuschreiben (kopieren aus der Ausgangstabelle) schreibst Du lieber zwei mal drei Zeilen, die man interpretieren muss. Am falschen Ende gespart.

                      Das stimmt.

                      Weißt Du, in vielen Fällen hier im Forum ist es ein Problem, dass der Fragesteller beschreibt, was er *tun* will, aber nicht, was er wirklich *erreichen* will. Oft ist das, was er tun will, nicht angemessen oder einfach völlig falsch.

                      Ich hielt das, was ich erreichen wollte für das, was ich tun will :)
                      Eine Aussagekräftige Problembeschreibung ist gar nicht mal so leicht, erst recht, wenn man meint, man habe ein Komplexes Problem.

                      Bitte, gern geschehen. Ich helfe wirklich gerne.

                      Und Danke für die Geduld.

                      Was sagt
                          [link:http://www.php.net/manual/de/function.phpinfo.php@title=phpinfo]();

                      Leider etwas, was ich nicht hören wollte, /info.php, PHP-Version 4.4.8.

                      Ich ruf da erstmal an und frag, ob es eine Alternative gibt.

                      mfg

      2. echo $begrüßung;

        Was ist das Ergebnis von
            SELECT VERSION()

        Lokal: phpMyAdmin - 2.11.3 MySQL-Client-Version: 5.0.51
        Webserver(1und1) steht nur MySQL: 5.0

        Die Version von phpMyAdmin ist für Probleme mit der Datenbank unwichtig. Die Version des MySQL-Client ist meist auch nicht von Belang. Um die Version des MySQL-Servers zu ermitteln, muss man diesen fragen, was natürlich nicht ohne eine Verbindung zu ihm geht. phpinfo() zu befragen geht nicht, das liefert nur die Client-Version. Jedoch liefert ein phpMyAdmin im Normalfall die Version des Servers auf dessen Übersichtsseite.

        Ein MySQL-Server kann sich auf einer beliebigen anderen Maschine befinden, als der Client, der ihn zu connecten gedenkt. Ein Client kann auch mehrere verschieden versionierte MySQL-Server abfragen. Um einen Client aber überhaupt zu befähigen, mit einem MySQL-Server zu kommunizieren, benötigt er eine Client-API. PHP hat also einen eingebauten MySQL-Client. Es ist zwar oftmals so, dass dieser MySQL-Client und der MySQL-Server aus den selben Quellen generiert wurden, dann haben sie die gleiche Versionsnummer. Doch das ist keine zwingende Notwendigkeit. Besonders im Windows-Umfeld, wenn vom MySQL-Server oder von PHP vorkompilierte Versionen verwendet werden, ist mit Unterschieden zu rechnen.

        echo "$verabschiedung $name";

  3. hi,

    um PHP Version 5 nutzen zu können, muss ich auf meinem Webserver die php.ini konfigurieren, um keine Fehler zu machen, habe ich eine Leere php.ini ins Root-Verzeichnis hochgeladen, und danach die Einstellungen verglichen.

    Mit einer neuen selbst angelegten php.ini verändere ich einige voreinstellungen, die vom Webhoster vorgegeben waren.
    Jetzt würde ich gern wissen, was davon Sinnvoll ist und was ich gegebenenfalls dann selbst in meine neue php.ini schreiben sollte.

    browscap   no value                   vorher  
    browscap   /usr/lib/browscap.ini      jetzt  
      
    error_reporting   no value            vorher  
    error_reporting   2037                jetzt  
      
    max_execution_time   50000            vorher  
    max_execution_time   30               jetzt  
      
    memory_limit   40M                    vorher  
    memory_limit   8M                     jetzt  
      
    upload_max_filesize   2M             jetzt  
    upload_max_filesize   20M            vorher  
      
    url_rewriter.tags   a=href,area=href,frame=src,form=fakeentry,fieldset=    vorher  
    url_rewriter.tags   a=href,area=href,frame=src,form=,fieldset=           jetzt
    

    Die folgenden Punkte waren vorher gar nicht da:

    HTTP_CACHE_CONTROL              max-age=0     nur jetzt

    _SERVER["HTTP_CACHE_CONTROL"]   max-age=0     nur jetzt

    _ENV["HTTP_CACHE_CONTROL"]      max-age=0     nur jetzt

    Oder brauche ich mir bei keinem dieser Werte einen Kopf machen?

    mfg

    1. echo $begrüßung;

      um PHP Version 5 nutzen zu können, muss ich auf meinem Webserver die php.ini konfigurieren,

      Das ist nicht richtig. Der Webserver muss konfiguriert werden: https://forum.selfhtml.org/?t=175183&m=1151541 Die php.ini kann wegbleiben, wenn du mit den Vorgaben des Providers zufrieden bist. Man ist das vor allem dann nicht, wenn man restriktivere Vorgaben liebt.

      um keine Fehler zu machen, habe ich eine Leere php.ini ins Root-Verzeichnis hochgeladen, und danach die Einstellungen verglichen.
      Mit einer neuen selbst angelegten php.ini verändere ich einige voreinstellungen, die vom Webhoster vorgegeben waren.

      Kleiner Irrtum. Wenn du eine php.ini in das Verzeichnis des aufgerufenen Scripts legst, dann gilt allein diese. Sie gilt für alle in diesem Verzeichnis gestarteten Scripte, aber nicht für in Unterverzeichnissen gestartete Scripte. (Beachte die Formulierung "gestartet". php.ini-Dateien aus Verzeichnissen inkludierter Dateien sind nicht von Belang.)

      Die Voreinstellungen des Providers - mitunter auch sinnvolle - sind komplett verschwunden und nur noch die PHP-Default-Werte aktiv (wobei die der Provider auch beim Kompilieren von PHP beeinflussen kann). Dieses Verhalten gilt, wenn PHP als CGI eingebunden ist, so wie das bei 1&1 der Fall ist. (Wenn PHP als Apache-Modul eingebunden ist, dann wirken Einstellungen in der .htaccess ergänzend zu den Default-Einstellungen und den Provider-Vorgaben.)

      Es ist sinnvoll, dass du eine phpinfo()-Datei in einem Verzeichnis ohne eigene php.ini stehen hast. Dann siehst du die Providervorgaben.

      In jeder phpinfo()-Ausgabe steht in der ersten Tabelle, welche php.ini-Datei(en) für dieses Script aktiv waren. Hab immer ein Auge auf diese Zeile(n), damit du nicht in falschen php.inis arbeitest.

      Jetzt würde ich gern wissen, was davon Sinnvoll ist und was ich gegebenenfalls dann selbst in meine neue php.ini schreiben sollte.

      Vergleiche am besten die Providervorgaben mit einer phpinfo()-Ausgabe aus einem Verzeichnis mit zunächst leerer php.ini. Erstelle mindestens für die abweichenden Sachen eigene Einträge. Beachte dabei die Einstellungen aus dem Abschnitt "PHP Core" und von den Extensions, die du zu verwenden gedenkst.

      Die folgenden Punkte waren vorher gar nicht da:
      HTTP_CACHE_CONTROL              max-age=0     nur jetzt
      _SERVER["HTTP_CACHE_CONTROL"]   max-age=0     nur jetzt
      _ENV["HTTP_CACHE_CONTROL"]      max-age=0     nur jetzt

      Die Werte aus den Abschnitten Environment und PHP Variablen sind unwichtig, bzw. nicht über die php.ini änderbar. Im Prinzip musst du nur die Tabellen ansehen, die die Spalten Local Value und Master Value haben, und davon auch nur den Local Value.

      Einige grundlegend einschränkende Einstellungen werden bei 1&1 außerhalb PHPs geregelt. Beispielsweise ist das die Script-Laufzeit. Sie orientiert sich nicht an max_execution_time. Ein Scriptverarbeitungsprozess, der länger als die per Vertrag zugestandene Prozessorzeit benötigt, wird "von außen" abgeschossen. Die Prozessorzeit ist dabei die tatsächlich in Anspruch genommene Belastung des Prozessors, nicht die Zeit gemäß einer Uhr. Wenn ein Script darauf wartet, dass das DBMS sich auströdelt, dann wird kaum Prozessorzeit verbraucht.

      Hier mal noch ein paar persönliche Empfehlungen meinerseits:

      allow_url_fopen - nur dann anschalten, wenn du es brauchst, also mit Dateizugriffsfunktionen Webrequests machen möchtest
      allow_url_include = off, Dateien von anderen Servern will man nicht inkludieren und ausführen.
      display_errors = off, zumindest im Produktivbetrieb. Außenstehende benötigen die Details der Fehlermeldungen nicht. Wie man dem Administrator die Fehlermeldungen des laufenden Betriebs zukommen lässt, ist ein anderes Thema.
      magic_quotes_gpc = off, schon oft genug kommentiert.
      magic_quotes_runtime = off
      register_globals = off, will man nicht mehr haben
      register_long_arrays = off, HTTP_*_VARS sind auch veraltet
      safe_mode = off, braucht man bei CGI nicht wirklich.
      short_open_tag = off, ist jedoch Geschmackssache.
      session.save_path = eigenes Verzeichnis unterhalb des Kunden-Verzeichnisses, jedoch unbedingt außerhalb aller DocumentRoots. Bei 1&1 kann man ja jede Domain, auch die inklusive sblafasel.online.de, auf Unterverzeichnisse des "KundenRoots" zeigen lassen. Das sollte man auch nutzen, denn dann kann man weitere Verzeichnisse anlegen, auf die keine Domain zeigt und damit aus dem Web nicht erreichbar sind.

      echo "$verabschiedung $name";

      1. hi,

        um PHP Version 5 nutzen zu können, muss ich auf meinem Webserver die php.ini konfigurieren,
        Das ist nicht richtig. Der Webserver muss konfiguriert werden: https://forum.selfhtml.org/?t=175183&m=1151541 Die php.ini kann wegbleiben, wenn du mit den Vorgaben des Providers zufrieden bist.

        Oh, die letzte Zeile der Supportseite hab ich wohl glatt übersehen, ich hatte nur Artikel 14 gefunden und ging davon aus, dass ist alles zu diesem Thema.
        Danke für den Link.

        Kleiner Irrtum. Wenn du eine php.ini in das Verzeichnis des aufgerufenen Scripts legst, dann gilt allein diese. Sie gilt für alle in diesem Verzeichnis gestarteten Scripte, aber nicht für in Unterverzeichnissen gestartete Scripte.

        Das hatte ich nicht getestet, ich war nur im Root zugange.

        Die Voreinstellungen des Providers - mitunter auch sinnvolle - sind komplett verschwunden und nur noch die PHP-Default-Werte aktiv (wobei die der Provider auch beim Kompilieren von PHP beeinflussen kann).

        Diesen Punkt hatte ich beim Telefonat mit dem Support angesprochen, der Techniker meinte, dass wichtige Einstellungen wohl nicht überschrieben werden, ob's stimmt?!

        Es ist sinnvoll, dass du eine phpinfo()-Datei in einem Verzeichnis ohne eigene php.ini stehen hast. Dann siehst du die Providervorgaben.

        Das hatte ich ja so gemacht, ich hab erst einmal meine info.php aus dem Root aufgerufen (ohne php.ini), die Seite gespeichert, php.ini ins Root hochgeladen und nochmal die info.php aufgerufen, die eingetretenen Änderungen habe ich ja aufgelistet.

        In jeder phpinfo()-Ausgabe steht in der ersten Tabelle, welche php.ini-Datei(en) für dieses Script aktiv waren. Hab immer ein Auge auf diese Zeile(n), damit du nicht in falschen php.inis arbeitest.

        Ich hab Glücklicherweise nur 4 bis 5 Verzeichnisse mit Scripten, daher sollte dass kein Problem sein.

        Vergleiche am besten die Providervorgaben mit einer phpinfo()-Ausgabe aus einem Verzeichnis mit zunächst leerer php.ini. Erstelle mindestens für die abweichenden Sachen eigene Einträge.

        Das klingt Logisch, so werde ich es machen.

        Hier mal noch ein paar persönliche Empfehlungen meinerseits:

        allow_url_fopen - nur dann anschalten, wenn du es brauchst, also mit Dateizugriffsfunktionen Webrequests machen möchtest
        allow_url_include = off, Dateien von anderen Servern will man nicht inkludieren und ausführen.
        display_errors = off, zumindest im Produktivbetrieb. Außenstehende benötigen die Details der Fehlermeldungen nicht. Wie man dem Administrator die Fehlermeldungen des laufenden Betriebs zukommen lässt, ist ein anderes Thema.
        magic_quotes_gpc = off, schon oft genug kommentiert.
        magic_quotes_runtime = off
        register_globals = off, will man nicht mehr haben
        register_long_arrays = off, HTTP_*_VARS sind auch veraltet
        safe_mode = off, braucht man bei CGI nicht wirklich.
        short_open_tag = off, ist jedoch Geschmackssache.
        session.save_path = eigenes Verzeichnis unterhalb des Kunden-Verzeichnisses, jedoch unbedingt außerhalb aller DocumentRoots. Bei 1&1 kann man ja jede Domain, auch die inklusive sblafasel.online.de, auf Unterverzeichnisse des "KundenRoots" zeigen lassen. Das sollte man auch nutzen, denn dann kann man weitere Verzeichnisse anlegen, auf die keine Domain zeigt und damit aus dem Web nicht erreichbar sind.

        Vielen Dank für die Ausführliche Erklärung und die Empfehlungen, besonders

        allow_url_include = off, Dateien von anderen Servern will man nicht inkludieren und ausführen.

        klingt interessant, dass kannte ich nicht. Ich werde mal schauen, wo ich eine gute Anleitung zu php.ini finde, um diese auch umzusetzen.

        mfg

  4. hi,

    Was mich gerade ein wenig beschäftigt, wenn ich beispielsweise eine beliebige Variable mit $_SERVER['REQUEST_URI'] vergleiche, nur vergleiche, keine Ausgabe, in welchem Kontext muss ich $_SERVER['REQUEST_URI'] behandeln?

    Nehmen wir folgendes Beispiel:

    $aktuelle_seite = array_key_exists($_SERVER['REQUEST_URI'], $links_array) ? $_SERVER['REQUEST_URI'] : 'Kein Ergebnis';

    Wie verarbeitet PHP das $_SERVER['REQUEST_URI'] in diesem Vergleich?
    Muss ich hier encoden, decoden oder sonst irgendwas beachten?

    So, nehmen wir jetzt an, der vergleich war erfolgreich, array_key existiert, jetzt habe ich in der Variable $aktuelle_seite = $_SERVER['REQUEST_URI'];, muss ich jetzt im restlichen Scriptverlauf die Variable $aktuelle_seite gesondert behandeln/Maskieren oder kann ich diese Variable nun frei nutzen?

    mfg

    1. echo $begrüßung;

      wenn ich beispielsweise eine beliebige Variable mit $_SERVER['REQUEST_URI'] vergleiche, nur vergleiche, keine Ausgabe, in welchem Kontext muss ich $_SERVER['REQUEST_URI'] behandeln?

      Wenn du nach dem EVA-Prinzip vorgehst, hast du deine Eingabewerte bereits aus ihrem Transportkontext befreit, soweit das nötig war, und nun die Daten in Rohform vorliegen. In dem Zustand kann man sie einfach so vergleichen.

      Nehmen wir folgendes Beispiel:
      $aktuelle_seite = array_key_exists($_SERVER['REQUEST_URI'], $links_array) ? $_SERVER['REQUEST_URI'] : 'Kein Ergebnis';
      Wie verarbeitet PHP das $_SERVER['REQUEST_URI'] in diesem Vergleich?

      Genauso, wie du »Äpfel« mit »Birnen« vergleichen würdest: Zeichen für Zeichen. (Zeichenkodierungsproblematik mal außen vor gelassen.)

      Muss ich hier encoden, decoden oder sonst irgendwas beachten?

      Nichts dergleichen. Sowohl in $links_array (vermutlich von dir gefüllt) als auch im $_SERVER-Array (von PHP gefüllt - hier sind auch keine störenden Magic Quotes drin) stehen die Daten in Rohform drin. Wenn das für $links_array nicht zutrifft, machst du einen Fehler.

      So, nehmen wir jetzt an, der vergleich war erfolgreich, array_key existiert, jetzt habe ich in der Variable $aktuelle_seite = $_SERVER['REQUEST_URI'];, muss ich jetzt im restlichen Scriptverlauf die Variable $aktuelle_seite gesondert behandeln/Maskieren oder kann ich diese Variable nun frei nutzen?

      Solange du im Kontext PHP-Script bleibst ist nichts weiter erforderlich. Erst wenn du wieder zur Ausgabe - wohin auch immer - schreitest, ist eine Behandlung für den neuen Kontext erforderlich.

      echo "$verabschiedung $name";

      1. hi,

        Wenn du nach dem EVA-Prinzip vorgehst, hast du deine Eingabewerte bereits aus ihrem Transportkontext befreit, soweit das nötig war, und nun die Daten in Rohform vorliegen. In dem Zustand kann man sie einfach so vergleichen.

        Ok, das ist schon mal gut zu wissen.

        Nichts dergleichen. Sowohl in $links_array (vermutlich von dir gefüllt) als auch im $_SERVER-Array (von PHP gefüllt - hier sind auch keine störenden Magic Quotes drin) stehen die Daten in Rohform drin. Wenn das für $links_array nicht zutrifft, machst du einen Fehler.

        Ja, die $links_array fülle ich, unter anderem hilft mir der Vergleich, Daten aus der Datenbank richtig zuzuordnen, bzw. im verarbeitenden Script schon vorzugeben, was verarbeitet werden darf und was nicht.
        Ist eine kleine "Sicherheitsmaßnahme", wie Sinnvoll diese ist, kann ich nicht beurteilen, funktioniert aber ganz gut.

        Solange du im Kontext PHP-Script bleibst ist nichts weiter erforderlich. Erst wenn du wieder zur Ausgabe - wohin auch immer - schreitest, ist eine Behandlung für den neuen Kontext erforderlich.

        Auch wenn Sicher gestellt ist, dass $aktuelle_seite nur von mir vorgegebene Inhalte hat?

        Noch ein Beispiel:

        $links_array = array('/index.php','/self.php','sonstiges.php');

        Jetzt wird z. B. die /index.php aufgerufen, laut meinem vergleich ist jetzt $aktuelle_seite = '/index.php';, jetzt möchte ich dass Ergebnis in meiner Seite anzeigen, echo $aktuelle_seite;, muss ich hier noch ein htmlspecialchars() anwenden?

        An sich kann ja in $aktuelle_seite; nichts ausser der von mir vorgegebenen Inhalte sein, warum diese noch maskieren?

        mfg

        1. echo $begrüßung;

          Solange du im Kontext PHP-Script bleibst ist nichts weiter erforderlich. Erst wenn du wieder zur Ausgabe - wohin auch immer - schreitest, ist eine Behandlung für den neuen Kontext erforderlich.

          Auch wenn Sicher gestellt ist, dass $aktuelle_seite nur von mir vorgegebene Inhalte hat?

          Ja, auch dann. Wenn du inkonsequent bist und mal kontextgerecht behandelst und mal nicht, weil es zu dem Zeitpunkt keinen Inhalt gibt, der von der Behandlung betroffen wäre, dann musst du immer wieder diese Überlegung anstellen, und dir darf dabei kein Fehler passieren. Behandelst du die Werte ausnahmslos, dann muss du nicht jedes Mal erneut kontrollieren, ob du es nun brauchst oder nicht.

          An sich kann ja in $aktuelle_seite; nichts ausser der von mir vorgegebenen Inhalte sein, warum diese noch maskieren?

          Aus Konsequenz- und Konsistenz-Gründen. Du könntest auf die Idee kommen, noch einen Query-String mit einem & drin anzufügen. Dann hast du diese Kontextbaustelle bereits erledigt.

          echo "$verabschiedung $name";

          1. hi,

            Auch wenn Sicher gestellt ist, dass $aktuelle_seite nur von mir vorgegebene Inhalte hat?

            Ja, auch dann. Wenn du inkonsequent bist und mal kontextgerecht behandelst und mal nicht, weil es zu dem Zeitpunkt keinen Inhalt gibt, der von der Behandlung betroffen wäre, dann musst du immer wieder diese Überlegung anstellen, und dir darf dabei kein Fehler passieren.

            Das klingt Logisch, und besagte Fehler unterlaufen mir wohl auch sehr häufig.

            Aus Konsequenz- und Konsistenz-Gründen. Du könntest auf die Idee kommen, noch einen Query-String mit einem & drin anzufügen. Dann hast du diese Kontextbaustelle bereits erledigt.

            Das schreibe ich mir auf meine merkliste, vielen Dank.

            mfg