Header() funktioniert nicht

Hallo allerseits,
leider bin ich momentan etwas in Verzug; ich habe nämlich für ein paar Freunde ein EM-Tippspiel programmiert (bisher noch nicht online), das jetzt nur noch einen Passwortschutz benötigt. Genau da scheitert es aber. Wie in meiner Testdatei em-tipp.bplaced.net/password_test.php zu sehen ist, kommt beim Aufrufen der Funktion header() die Fehlermeldung:

Im Internet habe ich dazu jetzt bereits die Anmerkung gefunden, das ganze in ASCII zu konvertieren. Das habe ich auch schon mal probehalber gemacht, allerdings gibt es dann an einer anderen Stelle Probleme: Selbst wenn das Passwort richtig eingegeben wird, lädt sich der header()-Dialog neu, als hätte man das falsche eingegeben. Hier zu Ansicht der Code:

<?php
// Verbinde mit MySQL
$link = mysql_connect('localhost', 'em-tipp', '.......');
if (!$link) {
	die('Verbindung fehlgeschlagen: ' . mysql_error() );
}

// Verbinde mit der Datenbank
$db = mysql_select_db('em-tipp', $link);
if (!$db) {
	die('Kann die Datenbank nicht benutzen : ' . mysql_error() );
}

function no_authentification() {
	header("WWW-authenticate: basic realm=\"Anmelden\"");
	header("HTTP/1.0 401 Unauthorized");
	echo ("Sie benötigen Benutzername und Kennwort.");
	exit;
}

if (!isset($_SERVER['PHP_AUTH_USER'])) {
	no_authentification();
}
else {
	echo $_SERVER['PHP_AUTH_USER'];
	$sql = "SELECT * FROM `password` WHERE `user`='".$_SERVER['PHP_AUTH_USER']."'";
	$user_raw = mysql_query($sql);
	$user = mysql_fetch_array($user_raw);
	echo $user;
	
	if (!empty($user) and $user['password'] == $_SERVER['PHP_AUTH_PW']) {
		$content = true;
		//echo "Content wird angezeigt.";
	}
	else {
		no_authentification();
	}
}

if ($content) {
//Eigentlicher Bereich
}
?>

Die Tabelle “password” sieht so aus:

CREATE TABLE IF NOT EXISTS `password` (
  `ID` int(2) NOT NULL,
  `user` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Daten für Tabelle `password`
--

INSERT INTO `password` (`ID`, `user`, `password`) VALUES
(1, 'user1', 'password1'),
(2, 'user2', 'password2'),
(....)

Auf meinem localhost hatte ich übrigens zunächst das selbe Problem wie auf dem bplaced-Server (Cannot modify header information…). Allerdings hatte ich dort eine alte XAMPP-Version (1.7.0) drauf und damit auch noch PHP 5.2.8. Mit einem Update auf die neue Version (1.7.7 mit PHP 5.3.8) haben sich dann alle Probleme gelöst (auch mit Zeichenkodierung UTF-8).

Alternativ wäre ich auch sehr dankbar für den Hinweis auf einen alternativen Passwortschutz (nicht .htaccess, da man auf den Benutzernamen später zugreifen muss)!

Ich bedanke mich schonmal im Voraus für jegliche Hilfe und hoffe, das Tippspiel recht schnell zum Laufen zu bekommen!

Grüße
euratla (em-tipp.bplaced.net/)

Und das soll Lokal bei dir nach Umstellung auf [quote]1.7.7 mit PHP 5.3.8[/quote] geklappt haben???

Wers glaubt!

Lies dir mal das hier durch :wink:

[quote]... in der Zeile 15 eine Ausgabe erfolgte.[/quote]
Wohl eher in Zeile 1 - in Zeile 15 wurde lediglich versucht den Header zu modifizieren.
[quote]Und das soll Lokal bei dir nach Umstellung auf 1.7.7 mit PHP 5.3.8 geklappt haben?[/quote]
Möglich ist's. Zumindest lässt sich unter gewissen Bedingungen der Header auch nach bereits erfolgter Ausgabe noch modifizieren. Hier bei bplaced allerdings nicht.

Des Problems Lösung ist aber ganz einfach: Das Problem taucht in Zeile 1 auf, weswegen es sich zu 99,999999% um BOM handeln dürfte. Einfach die "Byte Order Mark" entfernen und sich freuen.

Wohl eher in Zeile 1 - in Zeile 15 wurde lediglich versucht den Header zu modifizieren.

Möglich ist’s. Zumindest lässt sich unter gewissen Bedingungen der Header auch nach bereits erfolgter Ausgabe noch modifizieren. Hier bei bplaced allerdings nicht.

Des Problems Lösung ist aber ganz einfach: Das Problem taucht in Zeile 1 auf, weswegen es sich zu 99,999999% um BOM handeln dürfte. Einfach die “Byte Order Mark” entfernen und sich freuen.

[quote=“kerbination”]
Des Problems Lösung ist aber ganz einfach: Das Problem taucht in Zeile 1 auf, weswegen es sich zu 99,999999% um BOM handeln dürfte. Einfach die “Byte Order Mark” entfernen und sich freuen.[/quote]
Super, das dürfte wohl die Ursache sein. Das Problem ist nur: Wie kriege ich die Byte Order Mark weg, ohne gleich den Zeichensatz (UTF-8) zu zerstören? In der englischen Wikipedia steht zumindest:

Das heißt ja eigentlich, dass man die ohne Folgen entfernen könnte. Aber wie?

Grüße
euratla

Ganz einfach ohne BOM abspeichern. Das sollte jeder halbwegs gescheite Editor können.

OK, ich habe jetzt das Format in Notepad++ von UTF-8 auf “UTF-8 ohne BOM” (bzw. “ANSI as UTF-8”) konvertiert. Jetzt lädt sich immerhin schonmal der header.

Das Programm funktioniert leider immer noch nicht. Egal ob man das Passwort richtig oder falsch eingibt, der Dialog lädt sich immer wieder neu. Außerdem sind die Umlaute jetzt auch hinüber, obwohl das Entfernen der BOM doch eigentlich keine Auswirkungen haben dürfte. Ich bin etwas ratlos…

Wenn jemand genauer nachschauen will, ich kann gerne mal ein Passwort zum Testen (notfalls auch das PHPMyAdmin-Passwort) per PN schicken.

Grüße
euratla

Mach es doch einfach per .htaccess:
http://www.fueralles.de/htaccess-generator.html

Artikel zur Kodierung:
http://it-republik.de/php/artikel/UTF-8-fuer-alle-2838.html

[quote=“hummer”]Mach es doch einfach per .htaccess:
http://www.fueralles.de/htaccess-generator.html[/quote]
Hätte ich auch gerne gemacht, das Problem an .htaccess ist aber, dass man dort den Zugang entweder hat oder nicht, aber der Benutzername (der für das Funktionieren des Tippspiels zwingend ntowendig ist) nicht übergeben wird.

Grüße
euratla

[quote=“Camou”]Und das soll Lokal bei dir nach Umstellung auf [quote]1.7.7 mit PHP 5.3.8[/quote] geklappt haben???

Wers glaubt![/quote]
Der Ton ist wirklich unangebracht. Außerdem hat XAMPP standardmäßig den Output-Buffer aktiviert, was das ganze natürlich erklärt :stuck_out_tongue: