PHP Newbie / Fehlermeldung beim einbinden von PHP-Code
Frank S.
- sonstiges
Hallo,
ich habe bis heute noch nie mit PHP gearbeitet und habe grade probiert einen vorgegebenen HTML-Code in meine index.php einzufügen. Wenn ich die Seite per Browser aufrufe erhalte ich folgende Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/w00a53e4/Test/index.php:6) in /www/htdocs/w00a53e4/Test/index.php on line 140
Warning: imagettftext() [function.imagettftext]: Could not find/open font in /www/htdocs/w00a53e4/Test/index.php on line 159
Warning: imagettftext() [function.imagettftext]: Could not find/open font in /www/htdocs/w00a53e4/Test/index.php on line 162
Versteh die Fehlermeldung nicht :-(, könnt ihr mir bei der Lösung behilflich sein.
Vielen Dank schon jetzt.
Hallo,
Welche Fehlermeldung verstehst Du nicht? Die beiden letzten sollten doch eindeutig sein.
Die erste sagt, dass du in index.php in Zeile 6 den Header sendest und in Zeile 140 vrsuchst Headerinformationen anzupassen. Der is aber schon weg. Das kan ein BOM sein oder vielleicht hast Du einfach schon sonst eine Ausgabe gemacht, bevor Du Headerinformationen aendern moechtest.
Das ist natuerlich recht allgemein. Genau wie deine Fehlerbeschreibung.
Das ist natuerlich recht allgemein. Genau wie deine Fehlerbeschreibung.
Hier mal der Quellcode:
<html>
<head>
<title>PHP-Test</title>
</head>
<body>
<?php ### visitcount04.php ### 12.07.2009 ###
# zählt die Requests und merkt sich die IP der Requestoren für die Dauer der
# COUNTER_LOCKTIME. In dieser Zeit wird ein erneuter Request derselen IP
# nicht gezählt. Ein erneuter Request wird auch nach Ablauf von COUNTER_LOCKTIME
# nicht gezählt, wenn zwischendurch kein Request mit einer abweichenden IP
# eingetroffen ist.
#
# Hinweis:
# IPs als Grundlage für die Client-Erkennung zu benutzen ist keine saubere
# Methode. Durch NAT, Proxies und automatische Lastverteilungen, sowie
# Anonymisierungsdienste können die IPs nicht einem bestimmten Client zugeordnet
# werden. Für die Funktionsweise dieses Zählers ist die Genauigkeit aber
# hinreichend.
define('COUNTER_LOCKTIME', 3600);
## Counterfile entweder als '.htcounter.dat' oder außerhalb der Document_Root
#$counterfile = rtrim($_SERVER['DOCUMENT_ROOT'],'/').'/../data/counter.dat';
$counterfile = '.htcounter.dat';
## Counterfile anlegen, wenn nicht vorhanden.
touch($counterfile);
#------------------------------------------------------------------------------
function visitcount($filename, $time, $retrigger = true, $clean = true)
{
$fh = fopen($filename, 'rb+');
if (!$fh) return false;
if (!flock($fh, LOCK_EX))
{
fclose($fh);
return false;
}
$userabort = ignore_user_abort("1");
## Defaults für das Array
$_data = array();
$_data['time'] = array();
$_data['time'][$_SERVER['REMOTE_ADDR']] = $time;
$_data['count'] = 1;
$_data['lastIP'] = $_SERVER['REMOTE_ADDR'];
$filesize = filesize($filename);
if ($filesize > 0)
{
$filedata = fread($fh, $filesize);
if (false === ($_data = unserialize($filedata))
or !isset($_data['time'], $_data['count'], $_data['lastIP']))
{
$_data = array();
$_data['time'] = array();
$_data['time'][$_SERVER['REMOTE_ADDR']] = $time;
$_data['count'] = 1;
$_data['lastIP'] = $_SERVER['REMOTE_ADDR'];
}
else
{
## Nur berücksichtigen, wenn die Requestor-IP noch
## nicht in der Liste der letzten Requests steht
if (!isset($_data['time'][$_SERVER['REMOTE_ADDR']]))
{
## IP in Liste eintragen
$_data['time'][$_SERVER['REMOTE_ADDR']] = $time;
## nur zählen, wenn zwischendurch ein Request
## von einer anderen IP eingetroffen ist
if ($_data['lastIP'] != $_SERVER['REMOTE_ADDR']) #
{
$_data['count']++;
}
}
elseif ($_data['time'][$_SERVER['REMOTE_ADDR']] + COUNTER_LOCKTIME < $time)
{
$_data['time'][$_SERVER['REMOTE_ADDR']] = $time;
if ($_data['lastIP'] != $_SERVER['REMOTE_ADDR'])
{
$_data['count']++;
}
}
elseif ($retrigger)
{
$_data['time'][$_SERVER['REMOTE_ADDR']] = $time;
}
else
{
## ignore visit
}
if ($clean)
{
foreach ($_data['time'] as $ip => $lasttime)
{
if($time - $lasttime > COUNTER_LOCKTIME)
{
unset($_data['time'][$ip]);
}
}
}
}
}
$useronline = count($_data['time']);
$filedata = serialize($_data);
fseek($fh, 0, SEEK_SET);
fwrite($fh, $filedata);
ftruncate($fh, strlen($filedata));
fclose($fh);
ignore_user_abort("$userabort");
$_result = array('visitors'=>$_data['count'], 'useronline'=>$useronline);
return $_result;
}
#------------------------------------------------------------------------------
function writetext($text, $font)
{
// content-type für das Bild setzen
header("Content-type: image/gif");
// Das leere Bild im Speicher erzeugen
$im = imagecreatetruecolor(200, 20);
// Ein paar Farben festlegen
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0 );
$blue = imagecolorallocate($im, 0, 0, 255);
$red = imagecolorallocate($im, 255, 0, 0);
// Das leere Bild mit rotem Hintertgrund füllen
imagefilledrectangle($im, 0, 0, 199, 19, $red);
// Das rote Bild innen weiß füllen
imagefilledrectangle($im, 1, 1, 198, 18, $white);
// Einen Schatten hinter den Text legen
imagettftext($im, 13, 0, 10, 17, $grey, $font, $text);
// Den Text ins Bild einsetzen
imagettftext($im, 13, 0, 9, 16, $blue, $font, $text);
// Das Bild ausgeben. imagegif() erzeugt einen schärferen Text als imagejpeg()
imagegif($im);
imagedestroy($im);
}
#==============================================================================
# php main
#==============================================================================
$font = './ARIAL.TTF';
#$font = 'C:/WINNT/Fonts/GLACIERN.TTF';
if (false !== ($_result = visitcount($counterfile, time() )))
{
$text = "Online:{$_result['useronline']} Visits:{$_result['visitors']}";
}
else
{
$text = "bitworks Deutschland";
}
if (!isset($_GET['noshow']))
{
writetext($text, $font);
}
else
{
header("Content-type: image/gif");
readfile('1pix.gif');
}
?>
</body>
</html>
Hi!
Wie ich gesagt habe. Hier faengst Du eine HTML Datei an.
<html>
<head>
<title>PHP-Test</title>
</head>
<body>
Erst dann startet dein php. Der Header wird schon gesendet: Hier kommt gleich Text.
<?php ### visitcount04.php ### 12.07.2009 ###
Spaeter versuchst Du einen Header zu senden, der allerdings eine GIF Datei ankuendigt. Es wurde aber schon ein Header gesendet und der Inhalt ist auch definif Text: Das HTML.
// content-type für das Bild setzen
header("Content-type: image/gif");
Kannst Du mal erklaeren was Du ueberhaupt machen willst? Sieht eher konfus aus.
Kannst Du mal erklaeren was Du ueberhaupt machen willst? Sieht eher konfus aus.
Guten Morgen Steel,
ich hab den Code ja nur irgendwo kopiert kann da garnicht nallvollziehen :-).
Ich würde gerne folgendes umsetzen:
Brauch ich für diese Umsetzung überhaupt PHP oder geht das auch nur mit HTML?
So.
Du möchtest nen Counter!
- wäre natürlich super, wenn mit jeder IP nur einmal ein Voting abgegeben werden kann (ist aber zunächstmal nicht so wichtig)
Ist nicht nur unwichtig. Macht auch keinen Sinn.
Brauch ich für diese Umsetzung überhaupt PHP oder geht das auch nur mit HTML?
Das geht nicht nur mit HTML. HTML ist nur eine Auszeichnungssprache. Das ganze läuft auf dem Browser ab. Woher soll aber mein Browser wissen, daß jemand auf den Button geklickt hat? Da muss schon mit dem Server kommuniziert werden.
Was macht denn eine Grafik in dem Counter? Du scheinst in deinem Script eine Grafik zu erstellen (deren Schriftart nicht gefunden wird) allerding mitten in einem HTML Dokument. Was nun? Entweder Du lieferst ein HTML Dokument aus oder eine Grafik.
Mir drängt sich der vage Verdacht auf, daß Du nicht nur keine Ahnung von php hast sondern auch allgemein keinen Schimmer von der Funktionsweise des Webs.
Wenn Du einen Button willst, dann erstelle einen mit HTML. Wie das geht erklärt Dir unter anderem SELFHTML. Und wenn Du mit diesem Button etwas anstellen willst, das den Server betrifft (z.B. eine Stimme zählen), dann rufe mit diesem Button die entsprechende Ressource dafür auf, die die Stimme speichert. Das kann die gleiche sein, die auch die Seite generiert. Oder du rufst einfach nochmal die Seite mit dem Counter auf, um ihn aktualisiert darzustellen. Das ganze ginge natürlich per AJAX, aber da jetzt noch Javascript hinzuzufügen, halte ich nicht für sinnvoll. Ob das Speichern in einer Textdatei oder in einer Datenbank passiert ist Dir überlassen.
Ansonsten hast Du mittlerweile diverse Links zur Erklärung deines geschilderten Fehlers gefunden.
Hi,
Warning: Cannot modify header information - headers already sent
Versteh die Fehlermeldung nicht :-(
Dann suche bitte nach dem Wortlaut der Meldung - sie ist im Netz schon hundertausendfach dokumentiert und diskutiert worden, weil fast alle Newbies diesen Fehler machen - obwohl auch das Handbuch klar und deutlich dokumentiert, worauf bei der Verwendung von header zu achten ist.
MfG ChrisB
Hallo Frank,
ich habe bis heute noch nie mit PHP gearbeitet
Du verblüffst mich. Kein Wunder, dass Du Dich nicht mehr gemeldet hast, obwohl wir Dir interessante Ansätze geliefert haben.
und habe grade probiert einen vorgegebenen HTML-Code in meine index.php einzufügen. Wenn ich die Seite per Browser aufrufe erhalte ich folgende Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/w00a53e4/Test/index.php:6) in /www/htdocs/w00a53e4/Test/index.php on line 140
zu dieser Meldung gibt es Millionen Treffer in $suchmaschine :-)
Vinzenz