PHP - Hilfe bei Meldungen nach absenden eines Formulars

07/17/2014 21:37 Cℓoud#1
Serv .. hab mir mit Hilfe von Codeschnipseln ein simples Loginscript geschrieben. Nach dem Klick auf den Button wird das Formular abgeschickt und danach erscheint eine Meldung ob der Login erfolgreich war oder nicht.

Diese Meldung wird allerdings in einem neuen Fenster ausgegeben, ich möchte diese aber über der Loginform ausgeben lassen (siehe rot markierten bereich auf Abbildung). Wäre nett, wenn sich jemand mal mein Script ansieht und mir da weiterhelfen kann.

Außerdem erhalte ich folgende Fehlermeldung bei meinem Script:
"Notice: Undefined index: action in C:\Xampp\Htdocs\fiestaarchive\index.php on line 14"



Code:
<?php
	define('access', true);
	$crapVarr = 'F@#&$^*FG^&F^#$&#&D$%%#$D%&$^%#&D#%&F$#';
	include_once('includes/xinc.config.php');
	include_once('lang/deDE.php');
	
	$behave = 0;

	if(!isset($_SESSION["username"]) and !isset($_GET["action"])) 
	{
		$behave = 0;
	}

	if ($_GET["action"] == "login") 
	{
		
	$username = mysql_escape_string($_POST["username"]);
	$password = md5($_POST["password"]);

		$connect = mysql_connect ($_CONFIG["svr_host"], $_CONFIG["svr_user"], $_CONFIG["svr_pwd"]) 
		or die ($_LANG['cn_error']);

		mysql_select_db ($_CONFIG["svr_db"])
		or die ($_LANG['db_error']);

		$control = 0;		
		$sql = "SELECT * FROM accounts WHERE BINARY username = '$username' AND password = '$password' AND ban = '0'";
		$result = mysql_query($sql);
	
		while($row = mysql_fetch_object($result)) 
		{
			$control++;
		}

	if($control != 0) 
	{
		$_SESSION["username"] = $username;
		$behave = 1;
	} 
	else 
	{
		$behave = 2;
	}
	}
?>
<!DOCTYPE html>
<html lang="de-de">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<meta name="author" content="<?php echo $_CONFIG['cdts_author']; ?>">
	<meta name="publisher" content="<?php echo $_CONFIG['cdts_publisher']; ?>">
	<meta name="keywords" content="<?php echo $_CONFIG['allg_tags']; ?>">
	<meta name="description" content="<?php echo $_CONFIG['allg_desc']; ?>">		
	<title><?php echo $_CONFIG['allg_name'];?></title>
	<link rel="shortcut icon" href="images/favicon.ico" type="image/ico">

	<link rel="stylesheet" type="text/css" href="css/default.css">
    <?php 
		if($behave == 1) 
		{
	?>
    	<meta http-equiv="refresh" content="0; URL=index.php?action=home"> 
    <?php
		}
	?>
</head>
<body>
	<?php
		if($behave == 0)
		{
			
		if(isset($_SESSION["username"]))
		{
	?>
    <div class="nav">Du bist eingeloggt</div>
    <?php
		}
		else
		{
	?>
	<div class="login">
        <form method="post" action="index.php?action=login">
        	<label>Benutzername</label><br />
            <input type="text" name="username" maxlength="20"><br />
            <label>Kennwort</label><br />
            <input type="password" name="password" maxlength="32"><br />
            <input class="submit" type="submit" value="Anmelden">
        </form>
    </div>
    <?php
		}
    	}
    	if($behave == 1) 
		{
			echo 'Login erfolgreich!';
    	}

    	if($behave == 2)
		{
			echo 'Login fehlgeschlagen!';
    	}	
    ?>
</body>
</html>
</body>
</html>
07/17/2014 22:44 VisionEP1#2
<form method="post" action="index.php?action=login">
post form get parameter senden. ist nen bisschen unsauber
07/19/2014 09:47 flogi333#3
PHP Code:
if(!isset($_SESSION["username"]) and !isset($_GET["action"])) 
    {
        
$behave 0;
    } 
Das and ist hier am falschen Platz. Es wird nun hineingegangen, wenn beide nicht gesetzt sind. Wenn du ein oder ( || ) nimmst, betritt es den Verzweigungsrumpf, wenn schon eines der beiden ned gesetzt ist.

Außerdem würde ich den restlichen Code bis zum HTML in den else Zweig setzen, da sonst die Warning noch bleibt.

Das was VisionEP1 kommentiert hat ist falsch, und manuell GET-werte anhängen ist ein sehr verbreitetes, oft genutztes, sauberes und aktzeptiertes Mittel um zum Beispiel zusätzliche hidden-inputs zu umgehen.
07/19/2014 15:21 VisionEP1#4
Weit verbreitet ja.
Trotzdem schlecht.
Wird wie hier nicht gefiltert --> sicherheitslücke
07/20/2014 22:41 flogi333#5
Und welche alternative würdest du statt der Mischung aus POST und GET vorschlagen?
07/20/2014 23:12 CNBR#6
Quote:
Originally Posted by flogi333 View Post
Und welche alternative würdest du statt der Mischung aus POST und GET vorschlagen?

Einfach ohne GET und mit einzelne Dateien arbeiten?
07/21/2014 20:42 ThinSmoke#7
Mach das ganze doch über nen AJAX-Request. Lässt sich viel sauberer realisieren und du hast keinen page reload..
07/22/2014 10:44 Baaam01#8
Wie ThinSmoke bereits sagte, über nen AJAX Request das Formular abschicken (unterbindet den Redirect) und nen leeres Div an dem Platz wo die Meldung hinsoll definieren, die Antwort vom Ajax Request mit .Html(variable) setzen.