[gw] bigBENNE: Problem mit Gästebuch beim Eintragen

Ich hab angefangen mir ein Gästebuch (PHP/MYSQL) zu basteln, habe allerdings ZWEI probleme: Beim ersten Aufruf steht die Variable $flag als undefiniert, und nach dem Absenden auf der Weiterleitungs-seite steht $fehler als undefiniert.

ich hab nun schon allerlei rumprobiert (mit isset()) etc. bin aber zu keinem Ergebnis gekommen.

Deshalb poste ich das script mal hier, vielleicht könnt ihr mir ja weiterhelfen.

<?php include("includes/db_connect.inc.php");

if($flag == 1)

{
$name=trim($name);
$mail=trim($mail);
$hp=trim($hp);
$beitrag=trim($beitrag);

$name=strip_tags($name);
$mail=strip_tags($mail);
$hp=strip_tags($hp);
$beitrag=strip_tags($beitrag);

if(!$name)
{$fehler="Gib bitte einen Name an! <br>";}
if(!$beitrag)
{$fehler.="Gib bitte einen Beitrag ein! <br>";}

if ($fehler)
{
$meldung="<p class="error">".$fehler."</p>";
unset($flag);

}

else
{
@mysql_connect($host, $user, $pwd);
@mysql_select_db($dbname);
@mysql_query("INSERT INTO gaestebuch (name, mail, hp, beitrag, datum, zeit) values ('$name', '$mail', '$hp', '$beitrag', now(), now() ) ");
$meldung="<span class="beitrag">Dein Beitrag wurde ins Gästebuch gepostet!<br><a href="index.php">Zur Übersicht</a></span>";
}
echo $meldung;
}
if(!isset($flag))

{

?>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr height="20">
<td class="top" colspan="3">
<p class="top">Gästebuch - Eintragen</p>
</td>
</tr>
<tr>
<td colspan="3"><?php
//if(isset($meldung))
//{

//}
?></td>
</tr>
<?php echo '<form action="'.$PHP_SELF.'?id=eintragen" name="eintragen" method="post">'; ?> <input type="hidden" name="flag" value="1">
<tr class="eintraege_0">
<td width="25%"><span class="titel">Name:</span></td>
<td width="65%" colspan="2"><input type="text" name="name" value="<?php echo isset($name); ?>"></td>
</tr>
<tr class="eintraege_1">
<td width="25%"><span class="titel">E-Mail:</span></td>
<td width="65%" colspan="2"><input type="text" name="mail" value="<?php echo isset($mail); ?>"></td>
</tr>
<tr class="eintraege_0">
<td width="25%"><span class="titel">Homepage:</span></td>
<td width="65%" colspan="2"><input type="text" name="hp" value="<?php echo isset($hp); ?>"></td>
</tr>
<tr class="eintraege_1">
<td width="25%"> </td>
<td width="65%" colspan="2"> </td>

</tr>
<tr class="eintraege_0">
<td width="25%"><span class="titel">Beitrag:</span></td>
<td width="56%"><textarea name="beitrag" rows="8" cols="40"><?php echo isset($beitrag); ?>
</textarea></td><td><?php include('includes/smilies.php'); ?></td>
</tr>
<tr class="eintraege_1">
<td width="25%"> </td>
<td width="65%" colspan="2"> </td>
</tr>
<tr class="eintraege_0">
<td width="25%"> </td>
<td width="65%" colspan="2"><input type="submit" value="Eintrag abschicken"></td>
</tr>
</form>
</table>
<?php
}
?>

  1. Du solltes den Variablen einfach mal so irgendetwas zuweisen, damit das Script auch weiss das es die gibt.
    Wenn Du Variablen nicht zum anfang difinierst kann es schon vorkommen, dass es ab einem bestimmten Punkt diese Varaible noch nicht kennt.
    Generell allen Varaiblen einfach mal "" zuweisen um diese zu initialisiern.

    Bei anderen hochsprachen musst du sowas explizit machen.

    <?php include("includes/db_connect.inc.php");

    $flag = "";
    $fehler = "";

    if($flag == 1)

    {
    $name=trim($name);
    $mail=trim($mail);
    $hp=trim($hp);
    $beitrag=trim($beitrag);

    $name=strip_tags($name);
    $mail=strip_tags($mail);
    $hp=strip_tags($hp);
    $beitrag=strip_tags($beitrag);

    if(!$name)
    {$fehler="Gib bitte einen Name an! <br>";}
    if(!$beitrag)
    {$fehler.="Gib bitte einen Beitrag ein! <br>";}

    if ($fehler)

    1. Hallo Matze!

      Du solltes den Variablen einfach mal so irgendetwas zuweisen, damit das Script auch weiss das es die gibt.

      Wer sagt das?

      Wenn Du Variablen nicht zum anfang difinierst kann es schon vorkommen, dass es ab einem bestimmten Punkt diese Varaible noch nicht kennt.

      Warum sollte das denn so sein?

      Generell allen Varaiblen einfach mal "" zuweisen um diese zu initialisiern.

      Was soll das denn bringen?

      Bei anderen hochsprachen musst du sowas explizit machen.

      Ja!
      C,C++,Java etc. sind streng statisch typisiert und verlangen explizite Deklaration der Variablen!
      Aber:
      PHP nicht! Genau wie in Perl (daher hat PHP nun mal einen Großteil entlehnt - auch wenn es viele Leute
      nicht gerne lesen/hören) sind Variablen in PHP dynamisch typisiert und können ohne Initialiserung verwendet werden.
      Das ist ja gerade ein/der Vorteil bei dieser Art von  High-Level-Languages: man verwendet eine Variable einfach

      • ohne  Typisierung oder eine andere Art von Deklaration zu dem Zweck Daten (welcher Art auch immer) temporär zu speichern, weil man dies nun mal im moment tun will...

      Gruss Sven

      1. Prinzipiell hast Du recht. jedoch fragst Du die Variablen shon zu einem Zeitpunkt ab, zu welchem es diese nicht gibt.
        Und deswegen machen gute Programmierer einen initialisierungs Block und initialisieren dies Variablen.

      2. Hallo Sven,

        Hallo Matze!

        Du solltes den Variablen einfach mal so irgendetwas zuweisen, damit das Script auch weiss das es die gibt.
        Wer sagt das?

        Das sagen die leute, die ständig mit Scripten arbeiten.
        Ausserdem weiss man schon am anfang welche Variablen existieren bzw. existieren werden. Grössere Scripte verleiten gerne dazu, Variablen doppelt zu definieren. Das passiert nicht wenn man die Zentral mal anlegt.

        Wenn Du Variablen nicht zum anfang difinierst kann es schon vorkommen, dass es ab einem bestimmten Punkt diese Varaible noch nicht kennt.
        Warum sollte das denn so sein?

        Ja ganz einfach weil eine Abfrage auch bei einer hochsprache wie z.B. PHP oder Perl (if $testwert == "irgendwas")
        Gründsätzlich schief geht, wenn Du die Variable $testwert nicht schon vorher gesetzt hast z.B.
        $testwert = ""; # Das ist ein teswert zum testen.

        Ja und mit Kommentar weiss man dann auch wozu die Variable gut ist.

        Generell allen Varaiblen einfach mal "" zuweisen um diese zu initialisiern.
        Was soll das denn bringen?

        Das bringt wenn man es an der richtigen Stelle macht, z.B. den vorteil, dass Dein Perlscript nicht sagt: $xy ist nicht initialisiert. :-))

        Bei anderen hochsprachen musst du sowas explizit machen.
        Ja!
        C,C++,Java etc. sind streng statisch typisiert und verlangen explizite Deklaration der Variablen!
        Aber:
        PHP nicht! Genau wie in Perl (daher hat PHP nun mal einen Großteil entlehnt - auch wenn es viele Leute
        nicht gerne lesen/hören) sind Variablen in PHP dynamisch typisiert und können ohne Initialiserung verwendet werden.

        Da liegst Du etwas falsch.
        Du musst unter anderen hochsprachen wie PHP und PERL zwar nicht typisieren.... aber Du musst Sie initialisieren um diese Variable zu haben. Und wenn es erst dann passiert, wenn Du Ihr einen Wert zu weisst. Sprich irgendwo innmitten eines Scriptes aber immer bevor Du die Variable überprüfst oder weiter zuweisen möchtest.....

        Das ist ja gerade ein/der Vorteil bei dieser Art von  High-Level-Languages: man verwendet eine Variable einfach

        Und der ganz grosse Nachteil solcher sprachen ist... kein Fake!!
        Wenn Du innerhalb einer Funktion z.B. Perl eine Varible nicht als my $xy = ""; deklarierst ist die Global gültig und taucht eventuell mal ganz wonderster wieder auf wo du gar nicht mehr damit rechnest, wenn die Funktion zu ende ist. Da gab es schon böse überraschungen.

        Nur weil etwas nicht zwingend notwendig ist heisst das noch lange nicht, dass man nicht trotzdem sauber arbeiten muss.

        • ohne  Typisierung oder eine andere Art von Deklaration zu dem Zweck Daten (welcher Art auch immer) temporär zu speichern, weil man dies nun mal im moment tun will...

        Jaja und schon viele sind dabei auf die Schnauze gefallen und haben Tagelang mit debugger einen Fehler gesucht...

        Gruss Sven

        Gruss Matze
        Nimms mir nicht übel aber das Problem oben im Script ist eben so eines wo eine Variable noch nicht existiert obwohl man mit Ihr arbeiten möchte.....
        Genau deshalb ist es nicht verkehrt Variabeln rechtzeitig zu definieren.

  2. Hallo ??               # wir benutzen hier gerne ein Anrede

    ohne deinen fast 100 zeiligen Code gelesen zu haben empfehle ich dir:
    http://www.dynamic-webpages.de/php/security.registerglobals.php

    gruss Sven              # sowas ist auch ok ;)

    btw: hast du einen Namen?

    1. Hallo ??               # wir benutzen hier gerne ein Anrede
      gruss Sven              # sowas ist auch ok ;)
      btw: hast du einen Namen?

      sry, aber ich hatte vergessen mich einzuloggen, dann stehts ja automatisch da. aber jetzt nochmal nachgereicht:

      Hallo,

      MfG [gw] bigBENNE - Benedikt Loepp

      --

      [gw] bigBENNE - Benedikt Loepp - www.gw-clan.com

  3. <?php include("includes/db_connect.inc.php");

    !!! 1. Fehler $flag wurde noch nie gesetzt.
    Du frägst jedoch nach dem Wert einer Variablen welche noch gar nicht bekannt ist.
    Am Anfang des Scrirptes definieren nund der Fehler tauch nicht mehr auf.

    if($flag == 1)

    {
    $name=trim($name);
    $mail=trim($mail);
    $hp=trim($hp);
    $beitrag=trim($beitrag);

    $name=strip_tags($name);
    $mail=strip_tags($mail);
    $hp=strip_tags($hp);
    $beitrag=strip_tags($beitrag);

    if(!$name)
    {$fehler="Gib bitte einen Name an! <br>";}
    if(!$beitrag)
    {$fehler.="Gib bitte einen Beitrag ein! <br>";}

    !!!! 2. Fehler wenn die obigen bedingenen nicht zutreffen.
    Also kein Fehler vorliegt kennt die nächste Abfrage wieder die Variable nicht. Weil es diese zu dem Zeitpunkt einfach noch nicht gibt.

    if ($fehler)
    {
    $meldung="<p class="error">".$fehler."</p>";
    unset($flag);

    }

    else
    {
    @mysql_connect($host, $user, $pwd);
    @mysql_select_db($dbname);
    @mysql_query("INSERT INTO gaestebuch (name, mail, hp, beitrag, datum, zeit) values ('$name', '$mail', '$hp', '$beitrag', now(), now() ) ");
    $meldung="<span class="beitrag">Dein Beitrag wurde ins Gästebuch gepostet!<br><a href="index.php">Zur Übersicht</a></span>";
    }
    echo $meldung;
    }
    if(!isset($flag))

    {

    ?>

    Gruss Matze

    PS. Soviel dazu, dass es besser ist seine benötigte Variablen Rechtzeitig zu indizieren und eben wenn auch nicht notwendig zu declarieren.