Problem mit Variablen Form <-> PHP "post"

Diskutiere mit über: Problem mit Variablen Form <-> PHP "post" im Web-Programmierung Forum

  1. chicoconfuso

    chicoconfuso Thread Starter MacUser Mitglied

    Beiträge:
    626
    Zustimmungen:
    0
    Registriert seit:
    15.10.2005
    So, und schon schleicht sich das nächste Problem ein.
    Ich habe mir aus dem Netz ein kleines Script als Kontakt-Formular zusammen gebastelt...
    Code:
    Code:
    <?PHP
    $sendto = "mail@sts-foto.de";
    $message = "
    Name : $name
    Email : $email
    
    Anfrage : 
    $nachricht
    ";
    if ($action == "send") {
    if ($name == "" || $betreff == "" || $nachricht == "" || !preg_match("/[.a-z0-9_-]+@+[.a-z0-9_-]+.+[.a-z0-9_-]{2,}/i", $email)) {
    echo "Es ist ein Fehler aufgetreten!<br>";
    echo "Bitte Überprüfen Sie, ob alle Felder korrekt ausgefüllt wurden!<br>";
    } else {
    mail($sendto, $betreff, $message);
    echo "Ihre Nachricht wurde erfolgreich versendet!<br>";
    }
    }
    ?>
    
    <form action="index.php?site=kontakt&action=send" method="POST">
    <table border="0" cellspacing="0" cellpadding="0">
    <tr>
    <td width="200" valign="middle" class="mainpage">Name :</td>
    <td height="35" valign="middle"><input type="text" name="name" size="20"></td>
    </tr>
    <tr>
    <td valign="middle" class="mainpage">E-Mail :</td>
    <td height="35" valign="middle"><input type="text" name="email" size="20"></td>
    </tr>
    <tr>
    <td height="22" valign="middle" class="mainpage">Betreff :</td>
    <td height="35" valign="middle"><input type="text" name="betreff" size="20"></td>
    </tr>
    <tr>
    <td valign="middle" class="mainpage">Anfrage :</td>
    <td height="180" valign="middle"><textarea name="nachricht" cols="50" rows="10"></textarea></td>
    </tr>
    </table>
    <div align="center">
    <input type="submit" value="Abschicken"></div>
    </form>
    
    Das ganze klappt auch soweit, aaaaaber es wird immer gesagt:

    Notice: Undefined variable: name in /www/htdocs/w0082ea4/content/kontakt.php on line 8

    Notice: Undefined variable: email in /www/htdocs/w0082ea4/content/kontakt.php on line 10

    Notice: Undefined variable: nachricht in /www/htdocs/w0082ea4/content/kontakt.php on line 12

    Notice: Undefined variable: action in /www/htdocs/w0082ea4/content/kontakt.php on line 13

    Das ist genau dieser Abschnitt hier:
    Code:
    Email : $email
    
    Anfrage : 
    $nachricht
    ";
    if ($action == "send") {
    
    Ich kann mir denken, das ich irgendwie die Variablen $email, $nachricht und $action definieren muss, aber wie?!
     
  2. simusch

    simusch MacUser Mitglied

    Beiträge:
    2.221
    Zustimmungen:
    186
    Registriert seit:
    27.09.2004
    wenn du ein Formular mit POST übergibst, musst du auch ausdrücklich die POST-Variablen auslesen... ich denke, der Fehler kommt von dort, weil in PHP muss man die Variablen nicht audrücklich definieren (wie z.b. in Javascript)

    also:

    PHP:
    Email$_POST["email"]

    Anfrage:
    $_POST["nachricht"]
    ";
    if( 
    $_POST["action"] == "send") {
     
  3. chicoconfuso

    chicoconfuso Thread Starter MacUser Mitglied

    Beiträge:
    626
    Zustimmungen:
    0
    Registriert seit:
    15.10.2005
    hmm, dann kommt

    Parse error: syntax error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in /www/htdocs/w0082ea4/content/kontakt.php on line 8
     
  4. kazu

    kazu MacUser Mitglied

    Beiträge:
    1.364
    Zustimmungen:
    47
    Registriert seit:
    09.11.2005
    Was solleigentlich immer der Zeilenumbruch zwischen $_POST["nachricht"] und dem Semikolon? :suspect:
     
  5. 2nd

    2nd MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    Registriert seit:
    25.07.2004
    Das ist kein Fehler, "nur" eine PHP-Notice. Da es keine Variablendeklarationspflicht gibt, funktioniert das trotzdem. Ausserdem ist auf den Webservern das Reporting und Anzeigen von PHP-Notizen ausgeschaltet, zumindest in der Regel.

    Du arbeitest sicher lokal mit angeschaltetem Reporting (E_ALL).

    Die Variablen kannst Du vorher einfach deklarieren:

    Code:
    $email = '';
    $nachricht = '';
    $action = '';
    
    Mit diesem Snippet machst Du dem PHP-Interpreter die Variablen bekannt, indem Du sie als Leerstring deklarierst. Das Snippet muss vor dem von Dir geposteten Bereich stehen. Dieser Schritt ist aber nun hinfällig, da das $_POST-Array gebraucht wird (siehe unten).

    Am Rande: Generell würde ich Variablen und Strings immer verketten und nicht einfach durcheinander in den String schreiben:

    Code:
    $message = "Name :" . $name . " Email :" . $email . " Anfrage :" . $nachricht;
    Ausserdem hat Simusch Recht: POST-Daten müssen auch via dem entsprechenden superglobalen Array ausgelesen werden. Du hast Register_Globals auf ON, deswegen funktioniert das bei Dir. Ist ziemliches Gehacke und sicherheitstechnisch extrem bedenklich. Schalte Register_Globals generell aus!

    Beispielhaft für eine Variable:

    PHP:
    if ( isset($_POST['email']) && !empty($_POST['email']) ) { $email $_POST['email']; } else { $emailError true; }
    Zu obiger Zeile gehört noch eine Typen- und Validitätsprüfung, damit niemand Unsinn mit den Formularen macht, Stichwort Cross-Site-Scripting etc..

    2nd
     
    Zuletzt bearbeitet: 15.03.2007
  6. chicoconfuso

    chicoconfuso Thread Starter MacUser Mitglied

    Beiträge:
    626
    Zustimmungen:
    0
    Registriert seit:
    15.10.2005
    Ich habs jetzt so gemacht:
    PHP:
        if ( isset($_POST['name']) && !emtpy($_POST['name']) ) { $name $_POST['name']; } else { $nameError true; }  
                if ( isset(
    $_POST['email']) && !emtpy($_POST['email']) ) { $email $_POST['email']; } else { $emailError true; }  
                if ( isset(
    $_POST['nachricht']) && !emtpy($_POST['nachricht']) ) { $nachricht $_POST['nachricht']; } else { $nachrichtError true; }  
                if ( isset(
    $_POST['action']) && !emtpy($_POST['action']) ) { $action $_POST['action']; } else { $actionError true; }
                if ( isset(
    $_POST['betreff']) && !emtpy($_POST['betreff']) ) { $betreff$_POST['betreff']; } else { $betreffError true; }
                if ( isset(
    $_POST['message']) && !emtpy($_POST['message']) ) { $message$_POST['message']; } else { $messageError true; }  


    $sendto "mail@sts-foto.de";
    $message "Name: " $_POST['name'] . "
    Email: " 
    $_POST['email'] . "

    Anfrage:
    $_POST['nachricht'];
    if (
    $_POST['action'] == "send") {
    if (
    $_POST["name"] == "" || $_POST['betreff'] == "" || $_POST['nachricht'] == "" || !preg_match("/[.a-z0-9_-]+@+[.a-z0-9_-]+.+[.a-z0-9_-]{2,}/i"$email $_POST['email'])) {
    echo 
    "Es ist ein Fehler aufgetreten!<br>";
    echo 
    "Bitte Überprüfen Sie, ob alle Felder korrekt ausgefüllt wurden!<br>";
    } else {
    mail($sendto$_POST['betreff'], $_POST['message']);
    echo 
    "Ihre Nachricht wurde erfolgreich versendet!<br>";
    }
    }
    Jetzt kommt zwar nicht mehr "undefined variable", sondern "undefinded index", und zwar zu: name, email, nachricht, action

    und wenn ich dann auf abschicken klicke, egal ob ausgefüllt oder nicht, kommt:

    Fatal error: Call to undefined function: emtpy() in /www/htdocs/w0082ea4/content/kontakt.php on line 5

    line 5:
    PHP:
                if ( isset($_POST['name']) && !emtpy($_POST['name']) ) { $name $_POST['name']; } else { $nameError true; }  
     
  7. 2nd

    2nd MacUser Mitglied

    Beiträge:
    8.902
    Zustimmungen:
    242
    Registriert seit:
    25.07.2004
    Ich frage mich ja, warum Du die POST-Variablen an normale Variablen übergibst und dan trotzdem mit den POSTs weiterarbeitest?

    Ändere mal überall emtpy in empty - das war ein Tippfehler von mir, sorry.

    Und Undefined Index kommt, weil beim ersten Aufruf des Skriptes natürlich keine POST-Variablen existent sind, das Formular ist ja noch nicht abgeschickt.

    Sinngemäss muss die Abarbeitung so erfolgen:

    Wenn kein Formular abgeschickt sein kann (Erstaufruf, nicht auf den Sende-Button geklickt) -> zeige nur das Formular ohne Abarbeitung
    Wenn Formular abgechickt ist -> dann überprüfe und übernehme Variablen aus dem POST-Array und schicke die Mail


    2nd
     
  8. chicoconfuso

    chicoconfuso Thread Starter MacUser Mitglied

    Beiträge:
    626
    Zustimmungen:
    0
    Registriert seit:
    15.10.2005
    okay, die fehler meldung mit empty kommt nicht mehr. hätte mir aber auch auffallen müssen, sowas lernt man ja in der schule ...

    PHP:
            if ( isset($_POST['name']) && !empty($_POST['name']) ) { $name $_POST['name']; } else { $nameError true; }  
            if ( isset(
    $_POST['email']) && !empty($_POST['email']) ) { $email $_POST['email']; } else { $emailError true; }  
            if ( isset(
    $_POST['nachricht']) && !empty($_POST['nachricht']) ) { $nachricht $_POST['nachricht']; } else { $nachrichtError true; }  
            if ( isset(
    $_POST['action']) && !empty($_POST['action']) ) { $action $_POST['action']; } else { $actionError true; }
            if ( isset(
    $_POST['betreff']) && !empty($_POST['betreff']) ) { $betreff$_POST['betreff']; } else { $betreffError true; }
            if ( isset(
    $_POST['message']) && !empty($_POST['message']) ) { $message$_POST['message']; } else { $messageError true; }  
                
            
    // $email = '';
            // $nachricht = '';
            // $name = '';

    $sendto "mail@sts-foto.de";
    $message "Name: " .$name "
    Email: " 
    $email "

    Anfrage:
    $nachricht;

    if (
    $action == "send") {
    if (
    $name == "" || $betreff == "" || $nachricht == "" || !preg_match("/[.a-z0-9_-]+@+[.a-z0-9_-]+.+[.a-z0-9_-]{2,}/i"$email)) {
    echo 
    "Es ist ein Fehler aufgetreten!<br>";
    echo 
    "Bitte Überprüfen Sie, ob alle Felder korrekt ausgefüllt wurden!<br>";
    } else {
    mail($sendto$betreff$message);
    echo 
    "Ihre Nachricht wurde erfolgreich versendet!<br>";
    }
    }
    So siehts nun aus.
    Aber:


    Notice: Undefined variable: name in /www/htdocs/w0082ea4/content/kontakt.php on line 17

    Notice: Undefined variable: email in /www/htdocs/w0082ea4/content/kontakt.php on line 18

    Notice: Undefined variable: nachricht in /www/htdocs/w0082ea4/content/kontakt.php on line 21

    Notice: Undefined variable: action in /www/htdocs/w0082ea4/content/kontakt.php on line 23
     
  9. derMatze

    derMatze MacUser Mitglied

    Beiträge:
    777
    Zustimmungen:
    51
    Registriert seit:
    02.06.2006
    du setzt ja die variable $name auch nur dann wenn die bedingung erfüllt ist, ansonsten ist sie überhaupt nich existent:

    isset($_POST['name']) && !empty($_POST['name']) ) { $name = $_POST['name']; } else { $nameError = true; $name = ""; }

    selbes dann auch für die anderen

    //Edit: quatsch, wozu brauchst du denn überhaupt "$nameError"? Nenn die error-variablen doch einfach um in $name, $email, $nachricht, ...
     
  10. chicoconfuso

    chicoconfuso Thread Starter MacUser Mitglied

    Beiträge:
    626
    Zustimmungen:
    0
    Registriert seit:
    15.10.2005
    ok, das hab ich jetzt dabei geschrieben.
    aber jetzt tut sich gar nix. also das lädt normal, aber wenn ich auf senden gehe, dann kommt die seite wieder, so wie sie vorher war, als ob ich einfach auf refresh gedrückt habe. (eingetragen oder nicht, bei beidem)
     
Die Seite wird geladen...
Ähnliche Themen - Problem Variablen Form Forum Datum
XAMPP Problem mit Zugriffsrechte Web-Programmierung 30.04.2014
Syntax Problem PHP Variable an JS-Funktion Web-Programmierung 12.09.2013
Swiftmailer Problem mit der Danke-Seite Web-Programmierung 03.07.2013
PHP anfänger Problem Web-Programmierung 17.05.2013
Problem mit Klassen und protected... Web-Programmierung 04.03.2013

Diese Seite empfehlen