Martin Gutmair: Php geht, oder doch nicht?

Hallo

Ich hab mir ein kleines Gästebuch geschrieben und wenn ich es auf meinem
Lokalen Xampp Server laufen lass gibt es keine Probleme.
Wenn ich es dann auf meinen Webspace (welcher PHP unterstützt) lade und
probiere geht nicht mal mehr die Überprüfung ob benötigte Daten
angegeben wurden. Die Verbindung zur Datenbank über PHP geht wiederum
ohne Probleme also müsste mit PHP eigentlich alles stimmten.

An was kann es liegen?
Mein Webspace liegt bei xtremehosting.de

Vielen Dank im Voraus

Martin Gutmair

  1. Hallo Martin!

    Meine Glaskugel sagt mir, dass Du Dich mit http://www.php.net/register_globals@register_globals auseinander setzen solltest.

    Wenn Du Antworten willst die mehr aussagen als das obige, dann zeige uns die Seite indem Du einen Link beifügst,

    Schönen Gruß

    Afra

    1. Mist, man sollte die Vorschau nutzen...

      register_globals

      Schönen Gruß

      Afra

      1. Ähm heißt dass ohne globals geht es auf Web server gar nicht variabeln zu übertragen?

        Grüße Martin

        1. Hallo Martin,

          Ähm heißt dass ohne globals geht es auf Web server gar nicht variabeln zu übertragen?

          Lies Dir dazu das Kapitel im Manual durch:

          http://de3.php.net/variables.predefined

          LG
          Chris

          1. Okay,

            wenn ich das jetzt richtig verstanden habe darf ich nicht einfach nur
            $name nehmen sondern $_Post['name']         oder?

            also wenn ich dann am anfang $name = $_Post['name']    reinschreib müsste es doch gehen oder?

            1. Hallo,

              wenn ich das jetzt richtig verstanden habe darf ich nicht einfach nur
              $name nehmen sondern $_Post['name']         oder?

              also wenn ich dann am anfang $name = $_Post['name']    reinschreib müsste es doch gehen oder?

              Fast richtig aber trotzdem falsch ;-))

              Das Ding heißt $_POST['name'], wenn der Post-Parameter im HTML 'name' heißt. Groß-/Kleinschreibung muss beachtet werden.

              LG
              Chris

              1. Okay *freu* es geht. Danke für die gute und schnelle Hilfe.

                Ich muss schon sagen das Forum hier ist genausogut wie eure Tutorials.

                Ich werd ab jetzt auch öfter hier vorbeischaun und mein kleines Wissen mit euch Teilen.

                Danke nochmal

                Martin

                1. Ich hab doch noch ne Frage :(

                  muss ich da bei der Übertragung zur Datenbank auch irgendwas verändern?

                  Jetzt klappt das mit dem überprüfen und die verbindung zur datenbank aber an der db kommt nichts an.

                  1. Hi nochmal,

                    Ich hab doch noch ne Frage :(

                    muss ich da bei der Übertragung zur Datenbank auch irgendwas verändern?

                    Dazu müsstest Du mal den kurzen Codeabschnitt posten, der da relevant ist. Wahrscheinlich kommt dann gleich der Rattenschwanz :-)

                    LG
                    Chris

                    1. $timestamp = time();
                       $datum = date("d.m.Y - H:i",$timestamp);
                               $gbname = $_POST['gbname'];
                               $gbemail = $_POST['gbemail'];
                               $gbpage = $_POST['gbpage'];
                               $gbicq = $_POST['gbicq'];
                               $gbtext = $_POST['gbtext'];
                               $gbkom = $_POST['gbkom'];
                               $ok = true;

                      if (isset($gbname)) {
                                 if ($gbname != "" && $gbtext != "") {
                                      $ok = true;
                                      } else {
                                      $ok = false;
                              }
                              }
                              if (isset($gbname)) {
                                 if ($ok==true) {
                        include("dbcon.php");
                        mysql_select_db($dbname);
                                       mysql_query("INSERT INTO gaestebuch(gbdate, gbname, gbemail, gbpage, gbicq, gbtext, gbkom)VALUES('$datum','$gbname','$gbemail','$gbpage','$gbicq','$gbtext','$gbkom')");
                                       header("Location: gbindex.php");
                                       }

                      dbcon.php geht. wenn ich passwort oder ähnliches veränder kommt die Fehlermedldung Verbindung zur db fehlgeschlagen.

                      Martin

                      1. Hallo Martin,

                        $timestamp = time();
                        $datum = date("d.m.Y - H:i",$timestamp);

                        hierfür kann man auch direkt die Funktion now() von mysql benutzen, wenn man das Query ausführt. Hängt jedoch vom Spaltentyp ab...

                        $gbname = $_POST['gbname'];
                                 $gbemail = $_POST['gbemail'];
                                 $gbpage = $_POST['gbpage'];
                                 $gbicq = $_POST['gbicq'];
                                 $gbtext = $_POST['gbtext'];
                                 $gbkom = $_POST['gbkom'];
                                 $ok = true;

                        if (isset($gbname)) {

                        $gbname ist an dieser Stelle immer angelegt (isset), weil Du es oben implizit deklariert hast. Bestenfalls ist $gbname === false, wenn nämlich $_POST['gbname'] nicht vorhanden war.

                        Schreib mal oben in Dein Script

                        error_reporting(E_ALL);
                          ini_set('display_errors','1');

                        dann werden Dir alle Fehler und Hinweise angezeigt

                        if ($gbname != "" && $gbtext != "") {
                                        $ok = true;
                                        } else {
                                        $ok = false;
                                }
                                }
                                if (isset($gbname)) {
                                   if ($ok==true) {
                          include("dbcon.php");
                          mysql_select_db($dbname);
                                         mysql_query("INSERT INTO gaestebuch(gbdate, gbname, gbemail, gbpage, gbicq, gbtext, gbkom)VALUES('$datum','$gbname','$gbemail','$gbpage','$gbicq','$gbtext','$gbkom')");

                        Als nächstes folgt dann das Kapitel "SQL-Injection" an die Reihe...
                        Dann fehlt noch eine geeignete Fehlerbehandlung für die MySQL-Statements.

                        LG
                        Chris

                        1. Ich hab das Problem mit dem isset jetzt mal so gelöst:

                          <?
                          /*
                          Name: Banddesign
                          Version: 1.0
                          Datum: 10/12/2005

                          Copright © 2005 by Martin Gutmair
                          */
                                   $timestamp = time();
                           $datum = date("d.m.Y - H:i",$timestamp);

                          $ok = true;

                          if (isset($_POST['gbname'])) {
                                   $gbname = $_POST['gbname'];
                                   $gbemail = $_POST['gbemail'];
                                   $gbpage = $_POST['gbpage'];
                                   $gbicq = $_POST['gbicq'];
                                   $gbtext = $_POST['gbtext'];
                                   $gbkom = $_POST['gbkom'];
                                     if ($gbname != "" && $gbtext != "") {
                                          $ok = true;
                                          } else {
                                          $ok = false;
                                  }
                                  }
                                  if (isset($gbname)) {
                                     if ($ok==true) {
                            include("dbcon.php");
                            mysql_select_db($dbname);
                                           mysql_query("INSERT INTO gaestebuch(gbdate, gbname, gbemail, gbpage, gbicq, gbtext, gbkom)VALUES('$datum','$gbname','$gbemail','$gbpage','$gbicq','$gbtext','$gbkom')");
                                           header("Location: gbindex.php");

                          }
                                           else {
                                           $a = 1;
                                          $ok = false;
                                  }
                                  }
                                   ?>

                          Dann kommen noch n paar meldungen das ein par werte nicht definiert sind aber das sind die value werte des Formulars. Die sollen ja nur angezeigt wenn sie existieren also passt es.

                          Dann kommt jetzt aufeinmal die meldung

                          Warning: Cannot modify header information - headers already sent by (output started at /home/httpd/vhosts/banddesign.de/httpdocs/gb/gbexe.php:20) in /home/httpd/vhosts/banddesign.de/httpdocs/gb/gbexe.php on line 32

                          Wie kann ich nen seitenwechsel ohne header starten?

                          Grüße Martin

                          1. Hi Martin,

                            Wie kann ich nen seitenwechsel ohne header starten?

                            Mit PHP gar nicht - mal abgesehen davon, dass du natürlich einen Javascript Code ausgeben könntest, der selbiges für dich erledigt, aber dann würdest du dich auf aktiviertes Javascript beim Client verlassen.

                            Sorge einfach dafür, dass vor dem header() keine Ausgabe erfolgen (das sind z.B. Ausgaben mit echo oder anderen Funktionen oder auch ein Leerzeichen bzw. andere Zeichenketten vor dem <?php). Alternativ kannst du auch Output Buffering benutzen.

                            MfG, Dennis.

                            --
                            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
                            Die FlatBox 0.3 mit Dokumentation ist da!
                            Werbung ist der Versuch, das Denkvermögen des Menschen so lange außer Kraft zu setzen, bis er genügend Geld ausgegeben hat. (Ambrose Bierce)
                            1. Hi Dennis,

                              Wie kann ich nen seitenwechsel ohne header starten?

                              Mit PHP gar nicht - [...]

                              Das ist nicht wahr, wenn man "Seite" als serverseitige Bezeichnung sieht und "Ressource" als beidseitige...

                              Den Ressource-Bezeichner des Requests sollte nur der Client ändern können. Das kann durch Umleitung oder durch Link geschehen. Welche Seite (also welcher Content) unter diesem Ressource-Bezeichner zu welchem Zeitpunkt gesendet wird, sollte der Server regeln.

                              Ein Wechsel des Contents ist also möglich.

                              LG
                              Chris

                      2. Hallo Martin,

                        mysql_query("INSERT INTO gaestebuch(gbdate, gbname, gbemail, gbpage, gbicq, gbtext, gbkom)VALUES('$datum','$gbname','$gbemail','$gbpage','$gbicq','$gbtext','$gbkom')");

                        Es ist eine gute Idee, die Abfrage zuerst in einer eigenen Variablen zusammenzubauen. Diese kann man zu Debugzwecken wunderbar mit echo ausgeben. Genau diese Zeichenkette solltest Du hier auch posten, da kommen manchmal richtige Überraschungen vor. Es steht dort nicht das drin, was man annimmt.

                        Weiterhin solltest Du mysql_real_escape_string()  verwenden, siehe dazu bitte Sven Rautenbergs Ausführungen in der aktuellen Forumshauptdatei, bitte auch noch das Posting von dedlfix lesen.

                        Du solltest weiterhin überprüfen, was mysql_query() zurückliefert und mysql_error() auswerten ...

                        Freundliche Grüße

                        Vinzenz

                        1. Hi,

                          Reich es wenn ich die error abfrage am anfang einfüge oder muss sie direkt nach bzw vor der mysql querry ("INSERT zeile sein?

                          Wie mach ich die Error abfrage?

                          Grüße

                          Martin

                          1. echo $begrüßung;

                            Reich es wenn ich die error abfrage am anfang einfüge oder muss sie direkt nach bzw vor der mysql querry ("INSERT zeile sein?

                            Viele MySQL-Befehle können einen Fehler erzeugen. Du solltest alle berücksichtigen.

                            Wie mach ich die Error abfrage?

                            Das Beispiel auf der PHP-Handbuchseite zu MySQL solltest du dir ansehen und deine Abfrage ähnlich gestalten. (Bei mysql_select_db() schadet eine mysql_error()-Abfrage auch nicht.)

                            echo "$verabschiedung $name";

                            1. Hallo deldfix,

                              Das Beispiel auf der PHP-Handbuchseite zu MySQL solltest du dir ansehen und deine Abfrage ähnlich gestalten. (Bei mysql_select_db() schadet eine mysql_error()-Abfrage auch nicht.)

                              ...wobei das "die()" mMn nicht für den Produktivbetrieb geeignet ist, sondern bestenfalls zum Debuggen.

                              Allerdings gebe ich Dir Recht, es ist allenfalls noch besser, als die Fehler vollständig zu ignorieren.

                              Generell ist für die Datenbank-Fehler-Kontrolle in

                              if (mysql_errno($con) > 0)
                                {
                                  #Fehlerbehandlung
                                }

                              der richtige Ansatz zu sehen.

                              Und dann sollte man das Ganze funktional aufbauen. Die Gesamtfunktion setzt sich aus Teilfunktionen zusammen, die alle eine qualifizierte Fehlermeldung erzeugen. Tritt ein Fehler in einer Teilfunktion auf, muss man eben entscheiden, ob man es nochmals versucht, oder aber die Gesamtfunktion gezielt mit Fehlercode abbricht. Dabei sollte man nicht vergessen, erhaltene Handles zurückzugeben. Das ist besonders dann wichtig, wenn die Funktionen in Schleifen Verwendung finden.

                              LG
                              Chris

                              1. echo $begrüßung;

                                Generell ist für die Datenbank-Fehler-Kontrolle in

                                if (mysql_errno($con) > 0)
                                  {
                                    #Fehlerbehandlung
                                  }

                                der richtige Ansatz zu sehen.

                                Das würde ich so nicht unterstreichen wollen. Die mysql_*-Funktionen geben als Rückgabewert false zurück, wenn etwas nicht funktioniert hat. Das Abfragen von mysql_errno() zu diesem Zweck ist überflüssig.

                                Und dann sollte man das Ganze funktional aufbauen. [...]

                                Exceptions sind auch ein dafür geeignetes Konzept (ab PHP5 verfügbar).

                                echo "$verabschiedung $name";

                                1. Hallo Deldfix,

                                  wichtig dabei war mir eigentlich nur, dass ein eifaches die() den User in den Wald stellt, während eine qualifizierte Fehlermeldung ihn wieder in den relevanten Teil der Webseite zurücklieten wird...

                                  But Conveience is not available...

                                  LG
                                  Chris

                      3. Ich hab das Problem mit dem isset jetzt mal so gelöst:

                        <?
                        /*
                        Name: Banddesign
                        Version: 1.0
                        Datum: 10/12/2005

                        Copright © 2005 by Martin Gutmair
                        */
                                 $timestamp = time();
                         $datum = date("d.m.Y - H:i",$timestamp);

                        $ok = true;

                        if (isset($_POST['gbname'])) {
                                 $gbname = $_POST['gbname'];
                                 $gbemail = $_POST['gbemail'];
                                 $gbpage = $_POST['gbpage'];
                                 $gbicq = $_POST['gbicq'];
                                 $gbtext = $_POST['gbtext'];
                                 $gbkom = $_POST['gbkom'];
                                   if ($gbname != "" && $gbtext != "") {
                                        $ok = true;
                                        } else {
                                        $ok = false;
                                }
                                }
                                if (isset($gbname)) {
                                   if ($ok==true) {
                          include("dbcon.php");
                          mysql_select_db($dbname);
                                         mysql_query("INSERT INTO gaestebuch(gbdate, gbname, gbemail, gbpage, gbicq, gbtext, gbkom)VALUES('$datum','$gbname','$gbemail','$gbpage','$gbicq','$gbtext','$gbkom')");
                                         header("Location: gbindex.php");

                        }
                                         else {
                                         $a = 1;
                                        $ok = false;
                                }
                                }
                                 ?>

                        Dann kommen noch n paar meldungen das ein par werte nicht definiert sind aber das sind die value werte des Formulars. Die sollen ja nur angezeigt wenn sie existieren also passt es.

                        Dann kommt jetzt aufeinmal die meldung

                        Warning: Cannot modify header information - headers already sent by (output started at /home/httpd/vhosts/banddesign.de/httpdocs/gb/gbexe.php:20) in /home/httpd/vhosts/banddesign.de/httpdocs/gb/gbexe.php on line 32

                        Wie kann ich nen seitenwechsel ohne header starten?

                        Grüße Martin

                        1. Hallo

                          Dann kommen noch n paar meldungen das ein par werte nicht definiert sind aber das sind die value werte des Formulars. Die sollen ja nur angezeigt wenn sie existieren also passt es.

                          diese Meldungen führen dazu, dass Header gesendet werden, somit ist diese

                          Dann kommt jetzt aufeinmal die meldung

                          Warning: Cannot modify header information - headers already sent by (output started at /home/httpd/vhosts/banddesign.de/httpdocs/gb/gbexe.php:20) in /home/httpd/vhosts/banddesign.de/httpdocs/gb/gbexe.php on line 32

                          Meldung völlig erwartungsgemäß.

                          Du solltest den Hinweisen von Chris und mir hinsichtlich SQL-Injection nachgehen, Du solltest mysql_real_escape_string() verwenden, Du solltest die Tipps lesen, die Dir angeboten werden, Du solltest keine Doppelpostings verfassen, ...

                          Freundliche Grüße

                          Vinzenz

  2. Hallo,

    An was kann es liegen?

    Zeig mal Deine beiden php.ini's

    LG
    Chris

    1. Hm die php.ini müsste doch auf dem server liegen oder? (sry bin phpanfänger)

      ich finde sie nicht...

      in welchem verzeichnis müsste sie ligen?

      Grüße Martin

      1. Hallo,

        Hm die php.ini müsste doch auf dem server liegen oder? (sry bin phpanfänger)

        Meistens in /etc

        Du kannst aber auch mittels der Funktion phpinfo() die Konfiguration abfragen, die für das Verzeichnis gültig ist, in dem diese Funktion aufgerufen wird.

        LG
        Chris

        1. in meim etc odner ist keine php.ini :(

          Ist das die ursache des Problems?

          1. Hi Martin,

            in meim etc odner ist keine php.ini :(

            Deinem etc Ordner? Hast du dir einen angelegt? Nein, von dem ist nicht die Rede. Du solltest dich mal etwas mit der Grundstruktur von Linux Rechnern auseinandersetzen, das Buch Professionelle Websites (Download) von Stefan gibt eine gute Einführung.

            Ist das die ursache des Problems?

            Nein, aber wo die verwendete php.ini liegt, lässt sich in der Ausgabe von phpinfo() herausfinden, dort gibt es direkt im ersten Abschnitt „Configuration File (php.ini) Path” - guck mal, was da steht.

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Die FlatBox 0.3 mit Dokumentation ist da!
            Auf viele Fragen weiß auch Wikipedia eine Antwort.
      2. hallo,

        Hm die php.ini müsste doch auf dem server liegen oder? (sry bin phpanfänger)
        ich finde sie nicht...
        in welchem verzeichnis müsste sie ligen?

        In der Regel kannst du die php.ini nicht unmittelbar auf dem Server ändern. Aber du kannst dir mit php_info() anzeigen lassen, was alles möglich ist.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        http://www.christoph-schnauss.de
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
        1. Hallo Christoph,

          In der Regel kannst du die php.ini nicht unmittelbar auf dem Server ändern. Aber du kannst dir mit php_info() anzeigen lassen, was alles möglich ist.

          schreibt sich aber ohne Unterstrich
          http://de.php.net/phpinfo

          LG
          Chris

          1. Hi Chris,

            schreibt sich aber ohne Unterstrich
            http://de.php.net/phpinfo

            Ich vermute mal, php_info() ist ein Alias dazu, weil entsprechender Aufruf im Manual erfolgreich ist.

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Die FlatBox 0.3 mit Dokumentation ist da!
            Der beste Datenschutz ist das nicht-speichern von Daten. (Christian Kruse)
            1. Hallo Dennis,

              schreibt sich aber ohne Unterstrich
              http://de.php.net/phpinfo
              Ich vermute mal, php_info() ist ein Alias dazu,

              Nein. php_info(); gibt nur ein "Fatal error: Call to undefined function: php_info() [...]".

              weil entsprechender Aufruf im Manual erfolgreich ist.

              es wird lediglich auf http://de2.php.net/phpinfo weitergeleitet - genauso wie http://de2.php.net/htaccess auf http://de2.php.net/configuration.changes weiterleitet.

              Grüße aus Nürnberg
              Tobias