• 23.04.2024, 12:10
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

PHP unexpected t_break..

Samstag, 2. April 2005, 22:02

hi,

wo ist hier der fehler ?

Zitat

<html>
<head>
<title></title>
<meta name="author" content="DerMaddin">
<meta name="generator" content="Ulli Meybohms HTML EDITOR">
</head>
<?php

function download($file , $name) {
$size = filesize($file);
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=".$name);
header("Content-Length: ".$size);
header("Pragma: no-cache");
header("Expires: 0");
readfile($file);
}
function error(){
echo("Download fehlerhaft");
}

switch($id){
case "1": $file = "img/00001.jpg"; $name = "affe.jpg"; break;
default: error(); break;
}

// Download der Datei
download("$file","$name");
?>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<center>Der Download startet!</center>
</body>
</html>
}


der downloaded das bild nich, sondern gibt es als text aus

ach ja: hier der link zum selber testen:
funblog.de/downloads/download.php?id=1

gruß maddin.

Re: PHP unexpected t_break..

Samstag, 2. April 2005, 22:31

ganz einfach: du gibst bereits html aus und der kram wird somit als text/html o.ä. gesendet. du darft vor den header-angaben keinen output senden, schon gar keinen der nicht zum bild gehört. beachte auch, dass vor und nach den <?php ... ?> keine weiteren zeichen stehen dürfen, auch keine leerzeichen und zeilenumbrüche.

Re: PHP unexpected t_break..

Samstag, 2. April 2005, 23:03

Außerdem gehören die Anführungszeichen hier:
download("$file","$name");
weg.

Re: PHP unexpected t_break..

Samstag, 2. April 2005, 23:44

Zitat von »hurra«

Außerdem gehören die Anführungszeichen hier:
download("$file","$name");
weg.

das ist nicht zwingend erforderlich, aber ganz schlechter "stil". in doppelten anführungszeichen werden variablen ersetzt, in strings mit einfachen dagegen nicht. daher bringt es auch tatsächlich geschwindigkeitsvorteile, wenn man alle strings in einfachen anführungszeichen setzt, weil diese nicht geparst (d.h. nach variablen durchsucht) werden.

Quellcode

1
2
3
4
5
6
7
8
# schlecht:
$str1 = "Dein Name lautet $name.";

# besser:
$str2 = 'Dein Name lautet ' . $name . '.';

# auch ne möglichkeit, z.b. bei ankertags:
$str = sprintf('Dein Name lautet %s.', $name);

Re: PHP unexpected t_break..

Samstag, 2. April 2005, 23:56

Ok, bins halt nur von "strengeren" Sprachen à la C gewöhnt.

Die Variante mit sprintf gefällt mir deßhalb auch am Besten )

Cu Hurra

Re: PHP unexpected t_break..

Sonntag, 3. April 2005, 22:54

in php suckt das extrem, in python dagegen ist das erste liga. beispiel gefällig?

die X. zeile in php entspricht der X. in python:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#php
$str1 = sprintf('Dein Name ist %s.', $name);
$str2 = sprintf('<a href="%s" title="%s">%s</a>', $url, $title, $label);
# wiederverwendung von variablen, vgl. [url]http://de3.php.net/sprintf[/url]
$str3 = sprintf('<a href="%1$s" title="%2$s">%$2s</a>', $url, $title);

# python
str1 = 'Dein Name ist %s.' % name
str2 = '<a href="%s" title="%s">%s</a>' % (url, title, label)
# benannte platzhalter; dictionary in der gleichen zeile...
str3 = '<a href="%(url)s" title="%(title)s">%(label)s</a>' % ({'url': '...', 'title': '...', 'label': '...'})
# ... oder separat, z.b. weil aus nem datenbank-query bezogen
dict = {'url': '...', 'title': '...', 'label': '...'
str3b = '<a href="%(url)s" title="%(title)s">%(label)s</a>' % dict


bei php müssen in $str3 die dollarzeichen mit backslashes escaped werden ("%2\$s"), wenn doppelte anführungszeichen für die strings verwendet werden.