Form Action in einem Div ausgeben

atlantyz

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein kleines Javascript Problem, das ich einfach nicht gelöst bekomme:

Ich habe auf meiner Index- Seite ein Div, indem bei Drücken eines Knopfes ein Login- Formular geladen wird. Wenn ich mich nun einlogge, wird im Grunde die selbe Seite nochmal geladen und halt geprüft, ob die Daten korrekt eingegeben wurden. Wenn ja, dann werde ich weitergeleitet, wenn nein soll das gleiche Formular mit einer Fehlermeldung nochmal erscheinen.

So weit funktioniert das auch (in der Theorie). Aber, wenn ich meine Login- Daten eingebe und den Login- Button drücke, dann wird das Ergebnis nicht mehr in das Div geladen, sondern ich komme auf eine extra Seite, wo mir dann das Ergebnis (Login erfolgreich oder eben nicht) angezeigt wird.

Ich kann zwei Dinge: 1.ich kann ein Submit mit Javascript schicken (dann wird die Seite neugeladen, weil ja logischerweise im Action-Teil des Forms nur login.php drin steht).

2. ich könnte das Div nachladen. Dann mach ich aber kein Submit und die Daten werden nicht geprüft.

Ich bräuchte jetzt also ein Zwischending aus Punkt 1 und 2. Praktisch ein Submit, was im Action Teil des Forms in ein Div nachlädt oder sowas.

Ich geb euch hier nochmal ein bisschen Quellcode:

Das Div, in das das Login eingebunden wird (index- Seite):
Code:
 <div id ="lightbox" class = "schrift"></div>

Die komplette Login-Datei:
PHP:
<?php
session_start();

if (isset($_SESSION["id"]))
{
    session_destroy();
}
include_once "../global/funktionen.php";

if (isset($_POST["login"])) {

    db_connect();
    $sqlab=sprintf("select * from tabelle where benutzername = '" . $_POST["ben"] . "' and passwort = '" . sha1($_POST["pass"]) . "'",
        mysql_real_escape_string($_POST["pass"]),
        mysql_real_escape_string($_POST["ben"]));

    $res=@mysql_query($sqlab); // Fehlermeldungen mit @ unterdrücken
    $num=@mysql_num_rows($res); // keine Übereinstimmung von Anmeldeinfo und Daten darf keinen SQL Fehler ausgeben

    if ($num !=0) {
        if (isset($_POST["mieten"])) {

            $_SESSION["id"] = "1234";

        mysql_close();
        if (isset($_POST["mieten"])) {
            link('shop/pruefen.php', 'content');
        } else {
            link('shop/uebersicht_bestellungen.php', 'content');
        }

    }
    else {
        link('shop/login.php', 'lightbox');
        echo "Benutzername oder Passwort falsch!";
    }
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Webseite</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src = "../global/js/lib.js"></script>
    <link rel="stylesheet" type="text/css" href = "../global/registrieren.css"  />
</head>
<body onload="self.focus();document.index.ben.focus()" >

<form name = 'login' action="shop/login.php" method= "post">
    <fieldset id = "login_form">
    <legend>Loginseite Teamspeak3-4you.de</legend>
    <?php if (isset($_POST["mieten"])) { ?>
        <input type = "hidden" name = "slots" value = "<?php echo $_POST["slots"];?>">
        <input type = "hidden" name = "mv" value = "<?php echo $_POST["mv"];?>">
        <input type = "hidden" name = "ft" value = "<?php echo $_POST["ft"];?>">
        <input type = "hidden" name = "gs" value = "<?php echo $_POST["gs"];?>">
        <input type = "hidden" name = "mieten" value = "<?php echo $_POST["mieten"];?>">
    <?php } ?>
    <ul>
        <li>
            <label for="benname">Benutzer</label>
            <input name="ben">
        </li>
        <li>
            <label for="password">Passwort</label>
            <input type="password" name="pass">
        </li>
        <li>
            <input type="button" name="login" value="Einloggen" class = "btnSend" onclick ="abschicken(document.login);">
            <input type ="button" name = "cancel" value="Abbrechen" class = "btnCancel" onclick = "unsichtbar('lightbox');">
        </li>
    </fieldset>
</form>
</body>
</html>

Und hier dann noch die Funktion Abschicken():
Code:
function abschicken(dokument)
{
	dokument.submit();
}

und link():

Code:
function link(url,div)
{
	var a = new XMLHttpRequest();
	a.open("GET","http://edv-schloss/ts/"+url+"",true);
	a.onreadystatechange = function()
	{
		//antwort = "";
		if(a.readyState == 4)
		{
				var d = document.getElementById(div);
				d.innerHTML = a.responseText;
				//antwort = a.responseText;
				
		}
	}
	a.send(null);
}

Ich hab schonmal in diversen Foren gestöbert, aber so richtig was gefunden habe ich nicht. Weil die meisten die Daten nicht nochmal auswerten, sondern einfach nur eine Seite nachladen.

Kann mir jemand helfen?
 
Wenn du mir sagst, wie ich damit ein Login- Fenster realisiere, das vor dem eigentlichen Text erscheint, kann ich das gerne mit iFrame machen.
 
Ich habe erstmal deinen Quelltext etwas aufgeräumt. Vielleicht fällt es damit nicht nur mir leichter dein Skript zu lesen. Übrigens brauchst du deine Funktion abschicken nicht und deine Funktion link funktioniert so auch nicht, da du diese Funktion in Javascript definierst, aber in PHP verwendest.
PHP:
<?php
  session_start();
  
  if (isset($_SESSION['id']))
  {
    session_destroy();
  }
  
  require_once '../global/funktionen.php';
  
  if (isset($_POST['login']))
  {
    db_connect();
    $sqlab = sprintf(
      'SELECT *
        FROM
          tabelle
        WHERE
          benutzername="%s" AND passwort="%s"',
      mysql_real_escape_string($_POST['ben']),
      sha1($_POST['pass'])
    );
    
    # bitte deine Fehlermeldungen nicht ignorieren, sondern behandeln
    $res = @mysql_query($sqlab); // Fehlermeldungen mit @ unterdrücken
    $num = (int) @mysql_num_rows($res); // keine Übereinstimmung von Anmeldeinfo und Daten darf keinen SQL Fehler ausgeben
    
    if ($num !== 0)
    {
      if (isset($_POST['mieten']))
      {
        $_SESSION['id'] = '1234';
        
        mysql_close();
        if (isset($_POST['mieten']))
        {
          link('shop/pruefen.php', 'content'); # bitte ändern!
        }
        else
        {
          link('shop/uebersicht_bestellungen.php', 'content'); # bitte ändern!
        }
      }
      else
      {
        link('shop/login.php', 'lightbox'); # bitte ändern!
        echo 'Benutzername oder Passwort falsch!'; # solltest du an anderer Stelle ausgeben
      }
    }
  }
?>
<!DOCTYPE html>
<html>
<head>
  <title>Webseite</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" type="text/css" href="../global/registrieren.css"  />
  <script type="application/javascript" src= "../global/js/lib.js"></script>
</head>
<body onload="self.focus();document.index.ben.focus()">
  <form name="login" action="shop/login.php" method="post">
    <fieldset id="login_form">
      <legend>Loginseite Teamspeak3-4you.de</legend>
      <?php if (isset($_POST['mieten'])): ?>
      <input type="hidden" name="slots" value="<?php  echo $_POST['slots'];  ?>" />
      <input type="hidden" name="mv" value="<?php     echo $_POST['mv'];     ?>" />
      <input type="hidden" name="ft" value="<?php     echo $_POST['ft'];     ?>" />
      <input type="hidden" name="gs" value="<?php     echo $_POST['gs'];     ?>" />
      <input type="hidden" name="mieten" value="<?php echo $_POST['mieten']; ?>" />
      <?php endif; ?>
      <ul>
        <li>
          <label for="benname">Benutzer</label>
          <input type="text" name="ben" />
        </li>
        <li>
          <label for="password">Passwort</label>
          <input type="password" name="pass">
        </li>
        <li>
          <button type="submit" name="login" class="btnSend">Einloggen</button>
          <button type="button" name="cancel" class="btnCancel" onclick="unsichtbar('lightbox');">Abbrechen</button>
        </li>
    </fieldset>
  </form>
</body>
</html>
 
So, ich hab mein Script dann mal verändert. Leider hat sich zu meinem vorherigen Problem absolut nix geändert und die Texte werden immer noch auf einer komplett neuen Browserseite und nicht in dem Div ausgegeben.

Es ist auch vollkommen egal, was ich im PHP Teil habe. Solange die Form-Action mich zu der Seite 'shop/login.php' weiterleitet, wird immer eine neue Seite geladen anstatt die Seite nochmal in dem Div, wo mir zuerst die Login- Seite angezeigt wird.

Ich wollte hier auch eigentlich nicht über guten oder schlechten PHP- Code diskutieren (trotzdem Danke nochmal für die Bemerkungen an meinem PHP Code zwecks Fehlerbehandlung, auch wenn die Fehlerbehandlung in dem Fall unnötig ist), sondern ich wollte wissen, wie ich die Login- Seite nochmals in die Div geladen bekomme, sobald ich auf den Submit Button drücke und zwar mit allen POST- Variablen, die ich nachher brauche.

Dazu hab ich leider noch keine Antwort. Dafür hab ich jetzt einen strukturierteren PHP Code, obwohl der in dem Fall überhaupt nix zur Sache tut...


PHP:
<?php
  session_start();
  
  if (isset($_SESSION['id']))
  {
    session_destroy();
  }
  
  require_once '../global/funktionen.php';
  
  if (isset($_POST['login']))
  {
    db_connect();
    $sqlab = sprintf(
      'SELECT *
        FROM
          tabelle
        WHERE
          benutzername="%s" AND passwort="%s"',
      mysql_real_escape_string($_POST['ben']),
      sha1($_POST['pass'])
    );
    
    # bitte deine Fehlermeldungen nicht ignorieren, sondern behandeln
    $res = @mysql_query($sqlab); // Fehlermeldungen mit @ unterdrücken
    $num = (int) @mysql_num_rows($res); // keine Übereinstimmung von Anmeldeinfo und Daten darf keinen SQL Fehler ausgeben
    
    if ($num !== 0)
    {
      if (isset($_POST['mieten']))
      {
        $_SESSION['id'] = '1234';
        
        mysql_close();
        if (isset($_POST['mieten']))
        {
          echo "hat alles wunderbar geklappt";
        }
        else
        {
          echo "hat ebenfalls alles wunderbar geklappt";
        }
      }
      else
      {
        echo 'Benutzername oder Passwort falsch!'; # solltest du an anderer Stelle ausgeben -> zwar keine Ahnung wo, tut aber für mein Problem auch nix zur Sache.
      }
    }
  }
?>
<!DOCTYPE html>
<html>
<head>
  <title>Webseite</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" type="text/css" href="../global/registrieren.css"  />
  <script type="application/javascript" src= "../global/js/lib.js"></script>
</head>
<body onload="self.focus();document.index.ben.focus()">
  <form name="login" action="shop/login.php" method="post">
    <fieldset id="login_form">
      <legend>Loginseite</legend>
      <?php if (isset($_POST['mieten'])): ?>
      <input type="hidden" name="slots" value="<?php  echo $_POST['slots'];  ?>" />
      <input type="hidden" name="mv" value="<?php     echo $_POST['mv'];     ?>" />
      <input type="hidden" name="ft" value="<?php     echo $_POST['ft'];     ?>" />
      <input type="hidden" name="gs" value="<?php     echo $_POST['gs'];     ?>" />
      <input type="hidden" name="mieten" value="<?php echo $_POST['mieten']; ?>" />
      <?php endif; ?>
      <ul>
        <li>
          <label for="benname">Benutzer</label>
          <input type="text" name="ben" />
        </li>
        <li>
          <label for="password">Passwort</label>
          <input type="password" name="pass">
        </li>
        <li>
          <button type="submit" name="login" class="btnSend">Einloggen</button>
          <button type="button" name="cancel" class="btnCancel" onclick="unsichtbar('lightbox');">Abbrechen</button>
        </li>
    </fieldset>
  </form>
</body>
</html>
 
Du kannst doch mit jQuery einen Ajax-Request absetzen mit den Formulardaten. Diesen lässt du in deinem DIV dann anzeigen. Wie man ein Formular nicht "hart" abschickt sollte hier eigentlich min.1000 mal beschrieben worden sein:

HTML:
$(document).ready(
   function (){
      $('#myForm').submit(
           function(){
                 return false;
                 $.post('shop/login.php', $('#myForm'), function(data){
                      $('#myDIV').html(data);
                 }, 'json');
           }
      );
   }
);

Hab ich jetzt mal so aus dem Kopf geschrieben, kann sein das es noch nicht ganz ****t...
 
Ich habe dein Skript nochmals korrigiert:
PHP:
<?php
  session_start();
  
  if (isset($_SESSION['id']))
  {
    session_destroy();
  }
  
  require_once '../global/funktionen.php';
  
  if (isset($_POST['login']))
  {
    db_connect();
    $sqlab = sprintf(
      'SELECT *
        FROM
          tabelle
        WHERE
          benutzername="%s" AND passwort="%s"',
      mysql_real_escape_string($_POST['ben']),
      sha1($_POST['pass'])
    );
    
    # bitte deine Fehlermeldungen nicht ignorieren, sondern behandeln
    if(($result = mysql_query($sqlab)) !== false)
    {
      $count = mysql_num_rows($result);
    }
    else
    {
      $count = 0;
    }
    
    if ($count !== 0)
    {
      if (isset($_POST['mieten']))
      {
        $_SESSION['id'] = '1234';
        
        mysql_close();
        # --> beginn: sinnlos, da du vorher schon geprüft hast, ob dieser Index existiert
        if (isset($_POST['mieten']))
        {
          echo "hat alles wunderbar geklappt";
        }
        # wird niemals ausgeführt, da die Bedingung immer wahr ist ...
        else
        {
          echo "hat ebenfalls alles wunderbar geklappt";
        }
        # <-- ende: sinnlos
      }
      else
      {
        echo 'Benutzername oder Passwort falsch!'; # solltest du an anderer Stelle ausgeben -> zwar keine Ahnung wo, tut aber für mein Problem auch nix zur Sache.
      }
    }
  }
?>
<!DOCTYPE html>
<html>
<head>
  <title>Webseite</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" type="text/css" href="../global/registrieren.css"  />
  <script type="application/javascript" src= "../global/js/lib.js"></script>
</head>
<body onload="self.focus();document.index.ben.focus()">
  <form name="login" action="shop/login.php" method="post">
    <fieldset id="login_form">
      <legend>Loginseite</legend>
      <?php if (isset($_POST['mieten'])): ?>
      <input type="hidden" name="slots" value="<?php  echo $_POST['slots'];  ?>" />
      <input type="hidden" name="mv" value="<?php     echo $_POST['mv'];     ?>" />
      <input type="hidden" name="ft" value="<?php     echo $_POST['ft'];     ?>" />
      <input type="hidden" name="gs" value="<?php     echo $_POST['gs'];     ?>" />
      <input type="hidden" name="mieten" value="<?php echo $_POST['mieten']; ?>" />
      <?php endif; ?>
      <ul>
        <li>
          <label for="benname">Benutzer</label>
          <input type="text" name="ben" />
        </li>
        <li>
          <label for="password">Passwort</label>
          <input type="password" name="pass">
        </li>
        <li>
          <button type="submit" name="login" class="btnSend">Einloggen</button>
          <button type="button" name="cancel" class="btnCancel" onclick="unsichtbar('lightbox');">Abbrechen</button>
        </li>
    </fieldset>
  </form>
</body>
</html>
Ansonsten würde ich gerne wissen, was du eigentlich vor hast: Wenn man das erste Mal auf diese Seite kommt, gibt man seine Werte in die Eingabefelder auf Zeile 82 und 85 ein. Danach wird auch der Bereich zwischen Zeile 73 und 77 angezeigt. Wo kommen die Werte dafür her? Sollen außerdem die vorher eingegeben Werte aus Zeile 82 und 85 sichtbar angezeigt werden, damit man sie korrigieren kann? Und was ist diese lightbox die in Zeile 90 erwähnt wird? Außerdem: was soll nach der Korrekturmöglichkeit passieren?
 
Also folgendes: das Script soll das tun , was ein Login-Script tun soll: gucken, obs den Benutzer in der Datenbank gibt und wenn net eben ne meldung ausgeben. Und falls es ihn gibt eben anmelden.

Also die "Lightbox" ist ein Div, dass auf der Seite angezeigt wird und wo die Leute ihre Logindaten eingeben können. Also parktisch sowas wie ein Popup, nachdem man auf einen Button geklickt hat zum einloggen, so wie es das auf vielen Seiten gibt, die dich fürs einloggen nicht auf eine externe Seite weiterleiten.

Also, ich komm das erste Mal auf die Seite, das Loginformular wird angezeigt und wenn ich meine Daten da eingebe, soll mir einfach im gleichen Div angezeigt werden, ob ich den nun in der DB existiere, ob evtl. meine eingegebenen Daten falsch sind oder (falls alles richtig ist) bin ich eben im System eingeloggt. Also eben einfach das, was ein typisches Login macht.

Warum du jetzt 50 mal meinen PHP- Code korrigierst, weiß ich nicht. Wenn ich den Login über eine externe Seite und nicht in einem Div machen lasse funktioniert nämlich alles genauso, wie ich es mir vorstelle. Mein Problem ist auch nicht der PHP Code (sonst wäre ich im PHP-Forum), sondern lediglich, dass ich nicht weiß, wie ich die geprüften Daten wieder in dem gleichen Div ausgeben lasse.

Ich möchte den Login nicht über eine zusätzliche Seite machen und überprüfen, sondern eben auf der Hauptseite in einem kleinen Fenster. Ich würd auch ein popup oder sonstwas nehmen, hauptsache ich komme nicht nach dem Klick auf Login auf eine neue Seite sondern bleibe eben auf der Hauptseite in meinem kleinen Fensterchen (in meinem Fall momentan das Div "lightbox"). Wenn das allerdings unmöglich ist, dann werd ich wohl oder übel einfach den Login über eine zusätzliche Seite durchführen lassen.

Und ich hab mein Skript nochmals korrigiert, da dir der PHP-Teil ja keine Ruhe zu lassen scheint:

PHP:
<?php
  
  if (isset($_POST['login']))
  {
     echo "Hallo, ich stehe im gleichen Div, wie vorher!<br>";
     echo" Dein Benutzername lautet: " .$_POST["ben"];
  }

?>
<!DOCTYPE html>
<html>
<head>
  <title>Webseite</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" type="text/css" href="../global/registrieren.css"  />
  <script type="application/javascript" src= "../global/js/lib.js"></script>
</head>
<body onload="self.focus();document.index.ben.focus()">
  <form name="login" action="shop/login.php" method="post">
    <fieldset id="login_form">
      <legend>Loginseite</legend>
      <ul>
        <li>
          <label for="benname">Benutzer</label>
          <input type="text" name="ben" />
        </li>
        <li>
          <label for="password">Passwort</label>
          <input type="password" name="pass">
        </li>
        <li>
          <button type="submit" name="login" class="btnSend">Einloggen</button>
          <button type="button" name="cancel" class="btnCancel" onclick="unsichtbar('lightbox');">Abbrechen</button>
        </li>
    </fieldset>
  </form>
</body>
</html>

Also ganz einfach: wie kann ich nach dem Klick auf den Button mit dem Namen "login" erreichen, dass mir der Satz "Hallo, ich stehe im gleichen Div, wie vorher!" in dem Div "lightbox" (oder welches Div auch immer) angezeigt wird und zusätzlich dann noch die Post- Daten von Benutzername zur Verfügung stehen, damit ich auch den Benutzernamen nochmal ausgeben kann?
 
Mit AJAX! Du musst einen AJAX-Request an dein PHP-Script schicken mit den eingegebenen Daten und prüfen ob dieser schon existiert. Etwa so in der Art wie ich es oben mit jQuery gemacht habe.

Und wenn jemand deinen PHP-Code korrigiert, egal ob er funktioniet hat oder nicht, wird er schon wissen warum und wo fehler bzw. Sicherheitslücken vorhanden waren.

Eigentlich schon mal die Forum-Suche verwendet?

Stichwörter:

javascript login
ajax login
....

diese Themen wurden nämlich schon hundertfach hier besprochen.
 
Zu meinen Korrekturen: Hinweise, warum ich etwas geändert habe, habe ich mit Kommentaren angemerkt. Ansonsten habe ich deinen Quelltext nur so formatiert, dass es den Anderen in diesem Forum nicht die Lust darauf verdirbt dir zu antworten.
 

Neue Beiträge

Zurück