Robert: Hochladen von Bildern

Hallo,
Für folgendes Problem bitte ich um Hilfe:
In mühevoller Arbeit habe ich ein Mini-Content-Management-Sytem in PHP programmiert, was fast fertig ist. Zunächst hatte ich die Site bei einem kostenlosen Provider mit der PHP-Einstellung register_globals=on (die Problematik ist mir vertraut) getestet.
Jetzt sollte die Website bei einem Anbieter gehostet werden, der register_globals=off hat.
Den größten Teil der Variablen (also die, die von einem Skript zum anderen weitergegeben werden) hatte ich ohnehin nach der Array-Art angesprochen, also z. B. $_POST['pass'] statt $pass .
Da ich Probleme mit den $GET-Variablen hatte, habe ich dann noch einen Rat aus dem PHP_Manual befolgt, nämlich zu Anfang jedes PHP-Skriptes zu setzen:

foreach($_POST AS $key => $value) { ${$key} = $value; }
foreach($_GET AS $key => $value) { ${$key} = $value; }

Fast alles funktioniert jetzt auch, nur folgendes nicht:
Beim Hochladen von Bildern werden diese (bzw. der Dateiname) nicht in die MySQL-Datenbank eingetragen, was vorher klappte.

Dabei werden die Dateinamen so gelesen:
$bildname2=$pictures_name[0];
$bildname3=$pictures_name[1]; usw.
Und dann später (im selben PHP-Skript) in die Datenbank eingetragen:
z. B.
if ($bildname2 !=""){
 $abfrage="update seiten2 set bildname2='$bildname2' where id=$zahl";
$tues=mysql_query($abfrage);

Das ist ja ein ganz simpler SQL-Befehl, und jegliche anderen Änderungen (die man als Admin auf den Seiten machen kann, also Text ändern, Seiten hinzufügen usw, was alles nach der selben Art gemacht ist, geht.)
Das Hochladen der Dateien an sich klappt, was ich über mein FTP-Programm kontrollieren kann, deswegen führe ich den Code-Teil hier nicht auf, aber, wie gesagt, die Dateinamen kommen nicht in die Datenbank (und werden demzufolge natürlich auch auf der Seite dann später nicht angezeigt.
Ich kann mir keinen Reim darauf machen und frage, ob das an etwas anderem als den Register_globals liegen kann?
Vielen Dank für Hilfe
Robert

  1. hi,

    In mühevoller Arbeit habe ich ein Mini-Content-Management-Sytem in PHP programmiert, was fast fertig ist. Zunächst hatte ich die Site bei einem kostenlosen Provider mit der PHP-Einstellung register_globals=on (die Problematik ist mir vertraut) getestet.

    Warum entwickelst du ein Script überhaupt so, dass es von register_globals=on abhängig ist?

    Da ich Probleme mit den $GET-Variablen hatte,

    Was für Probleme sollte es da geben?

    habe ich dann noch einen Rat aus dem PHP_Manual befolgt, nämlich zu Anfang jedes PHP-Skriptes zu setzen:

    foreach($_POST AS $key => $value) { ${$key} = $value; }
    foreach($_GET AS $key => $value) { ${$key} = $value; }

    Toll. Damit machst du den Effekt von register_globals=off, die Sicherheit deines Scriptes gegen das Einfügen von Variablenwerten von außerhalb zu erhöhen, wieder zunichte.

    Beim Hochladen von Bildern werden diese (bzw. der Dateiname) nicht in die MySQL-Datenbank eingetragen, was vorher klappte.

    Logisch, wenn du Werte aus $_GET oder $_POST erwartest.

    http://www.php.net/manual/de/features.file-upload.php

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo wahrsaga,

      da ich nun mal Laie und Autodidakt bin, mache ich sicherlich Fehler und schaffe mir selber Probleme, die ich dann lösen muss. Das vorab.

      Die Probleme mit der get-Variablen sind folgende:
      Durch die folgenden Zeilen werden die Navi-Links ausgelesen und durch den  <a href ..>Befehl an die URL angehängt.
      Frage: ist das okay? (Ich meine damit, dass an der Stelle noch nichts vom $GET_Array stehen muss?

      $sql=("select id,linkname from seiten2 order by id");
         $linkliste = mysql_query($sql);
           while ($row=mysql_fetch_array($linkliste)){
           $test=$row['id'];
           echo "<div><a class=menu href="index.php?sch=$test" > ";
           echo $row["linkname"];
           echo "</a></div>";
                                                     }
      echo "</div>";

      Die Seite wird dann später durch den folgenden Teil zur Anzeige gebracht (nach der falschen register_globals=on-Methode:

      /* der Inhalt der einzelnen Felder wird aus der Datenbank gelesen,
         damit die jeweilige HTML-Seite angezeigt werden kann */
         $abfrage=("select * from seiten2 where id='$sch'");

      Dann erfolgt das Lesen der Felder aus der mysql-Tabelle, das Anzeigen auf dem Bildschirm usw.
      Meine Frage dazu: An welcher Stelle hätte ich den dann die Variable aus dem $get-Array auslesen müssen?

      Ich wappne mich schon innerlich gegen die Anwürde, man sehe ja, dass ich keine Ahnung hätte. Aber so ist es nun mal, dafür bin ich vielleicht in anderen Sachen besser.

      Vielen Dank für eine Reaktion,
      Gruß Robert

      1. Noch mal eben zur Verdeutlichung:

        Um die $get-Variable zu verwenden, kann ich doch nicht statt:
           $abfrage=("select * from seiten2 where id='$sch'");

        im SQL-Query die Array-Variable nehmen. Ich hätte mir gedacht, vorher
        $sch=$GET_['sch’];
        zu schreiben. Aber das führte auch nicht zum Erfolg. Wo denke ich da falsch?
        Danke, Gruß
        Robert

        1. hi,

          Noch mal eben zur Verdeutlichung:

          Um die $get-Variable zu verwenden, kann ich doch nicht statt:
             $abfrage=("select * from seiten2 where id='$sch'");

          im SQL-Query die Array-Variable nehmen.

          Warum nicht? [1]

          Ich hätte mir gedacht, vorher
          $sch=$GET_['sch’];
          zu schreiben. Aber das führte auch nicht zum Erfolg.

          In wie fern nicht?

          [1] Klar, du solltest natürlich keine von außen kommenden Daten in eine Query einsetzen, ohne sie zu entschärfen - sonst ist dein Script anfällig für SQL Injections.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. hi,

            Um die $get-Variable zu verwenden, kann ich doch nicht statt:
               $abfrage=("select * from seiten2 where id='$sch'");

            im SQL-Query die Array-Variable nehmen.

            Warum nicht? [1]

            Okay, wenn das geht - ich habe es jetzt noch mal getestet.
            Jetzt habe ich:
            //Prüfung, ob aus der navi-Datei die Variable $sch übergeben wurde und einen Inhalt hat
            if (isset ($GET_[sch]) && ($GET_[sch]) !=""){
            ...und etwas später:
               $abfrage=("select * from seiten2 where id='$GET_[sch]';");
                                                        }
            Der Effekt ist, dass bei einer Auswahl im Navi-Bereich gar nichts geschieht.
            In der index.php habe ich:
            include ("menues.php");
            include ("anzeigen.php");
            Die menues.php liest die Links für den navi-bereich aus der Tabelle, die anzeigen.php sollte dann den Inhalt anzeigen.
            Testweise zu sehen bei:
            http://web133.srv8.mw-internet.net/test/schule2/index.php

            Danke für eine Antwort,
            Robert

            1. Hallo Robert,

              Okay, wenn das geht...

              grundsätzlich ja - aber jetzt hast du dich gleich mehrfach mit Detailfehlern in die Nesseln gesetzt.

              if (isset ($GET_[sch]) && ($GET_[sch]) !=""){

              Erstens: Falscher Variablenname. Das Array heißt $_GET.
              Zweitens: Der Schlüssel gehört in Anführungszeichen, in diesem Fall vorzugsweise 'einfache', also  $_GET['sch']. Ohne diese würde PHP den Namen sch als Konstante interpretieren und gnädigerweise, wenn keine solche Konstante definiert ist, dann doch den String 'sch' verwenden (Fehlertoleranz).

              $abfrage=("select * from seiten2 where id='$GET_[sch]';");

              Erstens, zweitens: siehe oben.

              Drittens: Innerhalb von Strings, die in 'einfachen' Anführungszeichen stehen, nimmt PHP keine Ersetzung von Variablennamen vor. Ich bin nicht ganz sicher, ob das auch bei Verschachtelungen gilt, wie du sie im obigen Statement hast; sicherer wäre es auf jeden Fall, doppelte Anführungszeichen zu benutzen. Man muss sie innerhalb des Strings eben mit '' escapen.

              Viertens: Wenn komplexere Variablen-Ausdrücke wie Arrayelemente in Strings ersetzt werden sollen, empfiehlt es sich, den Variablenausdruck komplett in { } einzuklammern. Andernfalls fällt der PHP-Parser darüber her und erkennt nur den Ausdruck $_GET als Variablennamen, während die Index-Klammern als normaler String unangetastet bleiben.
              Damit wären wir also bei

              $abfrage=("select * from seiten2 where id="{$GET_['sch']}";");

              Fehler Nummer eins und zwei hätte dir der PHP-Parser aber schon verraten, wenn du error_reporting auf E_ALL gesetzt hättest (diese Fehler erzeugen eine Notice).
              Und Fehler Nummer drei und vier hättest du auch selbst feststellen können, indem du dir den Inhalt von $abfrage mal angesehen hättest. Ein einfaches
               echo $abfrage.'<br>';
              im Quellcode hätte dir schon viel verraten können.

              So long,
               Martin

              --
              Fettflecke werden wieder wie neu, wenn man sie regelmäßig mit etwas Butter einschmiert.
              1. Hallo,

                einen hab ich noch:

                $abfrage=("select * from seiten2 where id='$GET_[sch]';");

                Wieso setzt du hier den gesamten String nochmal in Klammern? Das ist eigentlich Unsinn.

                Ciao,
                 Martin

                --
                Alleine sind wir stark...
                gemeinsam sind wir unausstehlich!
                1. Hallo Martin,
                  zunächst einmal vielen Dank für deine ausführliche Antwort, das hat mir wirklich geholfen.
                  Ich musste nur noch den Fehler von mir, der sich in deine Antwort eingeschlichen hatte, herausnehmen:

                  $abfrage=("select * from seiten2 where id="{$_GET['sch']}";");

                  (da war in deinem Vorschlag zuerst noch mein falscher _ drin).

                  Jetzt geht die Auswahl aus dem Menü.

                  Dann muss ich jetzt nur mein eigentliches problem noch lösen, warum die Bildnamen nicht in die Datenbank übertragen werden. Ich probier´s zunächst mal, sonst melde ich mich im Forum noch mal.
                  Also, nochmals herzlichen Dank,
                  Robert

                  1. hi,

                    Dann muss ich jetzt nur mein eigentliches problem noch lösen, warum die Bildnamen nicht in die Datenbank übertragen werden. Ich probier´s zunächst mal, sonst melde ich mich im Forum noch mal.

                    Berücksichtige dazu bitte meine Anmerkung und den Link in meiner ersten Antwort.

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
              2. echo $begrüßung;

                Drittens: Innerhalb von Strings, die in 'einfachen' Anführungszeichen stehen, nimmt PHP keine Ersetzung von Variablennamen vor. Ich bin nicht ganz sicher, ob das auch bei Verschachtelungen gilt, wie du sie im obigen Statement hast; sicherer wäre es auf jeden Fall, doppelte Anführungszeichen zu benutzen. Man muss sie innerhalb des Strings eben mit '' escapen.

                Das ist keine Verschachtelung (in dem Sinne, wie man sie vielleicht von HTML-Elementen kennt) weil die inneren Anführungszeichen gar nicht für PHP bestimmt sind. Bei denen kommt es ganz darauf an, was die verarbeitende Stelle verlangt. (MySQL im speziellen Fall kann an der Stelle mit beiden Anführungszeichentypen umgehen.) Das Verwenden von " statt ' löst auch nicht das Problem der Erkennung von komplexen Variablenausdrücken innerhalb eines "-Strings.

                Das Handbuch klärt wie fast immer auch über dieses Thema auf: Kapitel Types -> Strings. Besonders ist hier der Abschnitt "Variable parsing" mit vielen Beispielen zu nennen.

                echo "$verabschiedung $name";

          2. Hello,

            Um die $get-Variable zu verwenden, kann ich doch nicht statt:
               $abfrage=("select * from seiten2 where id='$sch'");

            Ich hätte mir gedacht, vorher
            $sch=$GET_['sch’];
            zu schreiben. Aber das führte auch nicht zum Erfolg.

            Das Array heißt $_GET und das Element des Arrays demnach $_GET['sch']
            Vielleicht liegt es daran?
            Die Warnungen von Wahsage aber bitte trotzdem dringend beachten :-)

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau