Hjälp med php-felsökning

Tråden skapades och har fått 10 svar. Det senaste inlägget skrevs .
1

Ska göra ett inloggningsfunktion till en site med ett php-script jag blev tipsad om.

Det mesta fungerar förutom vidarebefodringen. Jag får felmeddelandet:
Warning: Cannot modify header information - headers already sent by (output started at /opt/glftpd/site/users/idar.se/public_html/login.php:7) in /opt/glftpd/site/users/idar.se/public_html/login.php on line 35

och koden ser ut:

<?php
# Starta session och inkludera databas uppkopplingen
session_start();
require_once 'database.php';
?>

<?php
# Här loggar vi in om formuläret är postat
if(isset($_POST['username']) && isset($_POST['password']))
{
	# Spara username i en lokal variabler så det är lättare att jobba med den
	$username = $_POST['username'];
	
	# Kör mysql_real_escape_string för att escape:a alla farliga tecken
	$escaped_username = mysql_real_escape_string($username);
	
	# Kör en md5-hash på lösenordet
	$md5_password = md5($_POST['password']);
	
	# Kör mysq-frågan
	$query = mysql_query("select * from users where username = '".$username."' and password = '".$md5_password."'");
	
	if(mysql_num_rows($query) == 1)
	{
		# Om vi hittade en rad som matachade så har vi rätt användarnamn och lösenord
		# Så hämta ut värdena från databasen
		$result = mysql_fetch_assoc($query);
		
		# Sätt session variabler
		$_SESSION['logged_in'] 	= true;
		$_SESSION['user_id']	= $result['user_id'];
		$_SESSION['username']	= $result['username'];
		
		# Vidarebefodra till welcome.php
		header('location:webbshop/index.php');
		exit();
	}else
		echo "<b>Felaktigt användarnamn eller lösenord</b><br /><br />";
}
?>
<h1>Please Login</h1>
<form action="login.php" method="post">
	Username:<br />
	<input name="username" type="text" /><br />
	<br />
	Password:<br />
	<input name="password" type="password" /><br />
	<br />
	<input name="submit" type="submit" value="Login" />
</form>

Har fått lite vägledning av tråden på http://www.phpportalen.net/viewtopic.php?t=4403

men jag är inte reggad där (än) och tråden är flera år gammal.

Någon här som är kung på php/mysql?

  • Medlem
  • Mölndal
  • 2007-12-14 00:00

Aldrig använt något av det! Däremot kan jag lite grand om HTTP. Felmeddelandet du får betyder att du/servern redan skickat vissa HTTP headers till klienten, och då är det för sent att skicka en redirect. Hur man löser det vet jag inte... kanske kan du få php att vänta med att skicka headers genom att buffra och tömma bufferten från din kod innan redirecten.

Du skickar ut information till webbläsaren innan header(Location:...)-funktionen körs. Se till att inte skriva ut något (echo, print, var_dump) eller vanlig html innan kodsnutten ovan. Kanske skriver filen database.php ut något?

/M

  • Medlem
  • Kiruna
  • 2007-12-14 01:40

Det är en blank rad mellan de två php-blocken. Eftersom du inte använder buffring tvingar detta HTTP-headers att skickas.

  • Medlem
  • Gävle
  • 2007-12-14 11:17

Svaret är att du måste sätta på output buffring.

http://www.php.net/ob_start

Förövrigt kan det vara en bra ide att dela upp koden enligt MVC.

eller så räcker det med att rensa blankraden, precis som spot säger

  • Medlem
  • Gävle
  • 2007-12-14 13:50
Ursprungligen av ninjamac:

eller så räcker det med att rensa blankraden, precis som spot säger

Ja, men med den lösningen så kommer han att stöta på problemet om och om igen i andra situationer, eftersom han mixar affärslogik, databaslogik och visningskod i en enda härlig PHP-röra. Så det är ju en ganska tillfällig lösning...

  • Medlem
  • Mölndal
  • 2007-12-14 23:36
Ursprungligen av Jogin:

Ja, men med den lösningen så kommer han att stöta på problemet om och om igen i andra situationer, eftersom han mixar affärslogik, databaslogik och visningskod i en enda härlig PHP-röra. Så det är ju en ganska tillfällig lösning...

Nu syftade väl han på att man inte behöver sätta på buffringen om det hjälper lika bra att ta bort en tom rad.

Vad gäller MVC har du så rätt. Och ändå så fel. Troligt att någon orkar dela upp en skiten inloggningssida i tre lager.

  • Medlem
  • Gävle
  • 2007-12-17 00:03
Ursprungligen av memark:

Nu syftade väl han på att man inte behöver sätta på buffringen om det hjälper lika bra att ta bort en tom rad.

Vad gäller MVC har du så rätt. Och ändå så fel. Troligt att någon orkar dela upp en skiten inloggningssida i tre lager.

Förmodligen så finns det någon slags system bakom inloggningssidan... Och gör det det så är det ju inte helt knasigt att också skapa en användarmodell, eftersom saker och ting ofta är relaterade till användare. Otroligt att jag var tvungen att förklara detta, det händer inte varje dag, den saken är ju säker.

Blankraden gjorde susen. Tack!
Men om det inte är optimalt struntar jag i just nu då det är en tjänst åt en gammal kund.
Tänkte bli kung på php men tar det under nästa är

Om man inte är erfaren programmerare kan man behöva lära sig "the hard way" - dvs, procedurellt. När man sedan har lite mer erfarenhet blir det självklart att jobba med generell logik av något slag - men kanske krävs det lite procedurell tid innan man känner sig bekväm nog att börja abstrahera. Med det sagt kan jag inte nog många gånger uppmuntra folk att kasta sig in den abstrakta världen. Det är inte så svårt att greppa när man väl ger sig i kast med det. Om inte annat - börja med att distribuera ut all kod till funktioner. Försök sedan se om du använder samma typ av förlopp i flera funktioner. Bygg nya generella funktioner av sådana förlopp och återanvänd. Och så vidare, och så vidare. När du börjar få grepp om detta - läs på om objekt och klasser för att ta det vidare. (Ps - många tycker att allt självklart ska göras i objekt - personligen tycker jag att det inte är helt självklart.)

1
Bevaka tråden