Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/04/2011, 22h27   #1
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Bonsoir,

je souhaite forcer le téléchargement d'un fichier. J'ai mis le code suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// code pour forcer un téléchargement
$full_path = '---'; // chemin système (local) vers le fichier
$file_name = basename($full_path);
 
ini_set('zlib.output_compression', 0);
$date = gmdate(DATE_RFC1123);
 
header('Pragma: public');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
header('Content-Length: '.filesize($full_path));
header('Content-MD5: '.base64_encode(md5_file($full_path)));
header('Content-Type: application/octetstream; name="'.$file_name.'"');
header('Content-Disposition: attachment; filename="'.$file_name.'"');
 
header('Date: '.$date);
header('Expires: '.gmdate(DATE_RFC1123, time()+1));
header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($full_path)));
 
readfile($full_path);
exit; // nécessaire pour être certain de ne pas envoyer de fichier corrompu
et ça se traduit par une série de warnings :
Citation:
Warning: ini_set() [ref.outcontrol]: Cannot change zlib.output_compression - headers already sent in /home/djtoo375/public_html/cpttel/coucou.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at /home/djtoo375/public_html/cpttel/connect.php:17) in /home/djtoo375/public_html/cpttel/coucou.php on line 18

Warning: Cannot modify header information - headers already sent by (output started at /home/djtoo375/public_html/cpttel/connect.php:17) in /home/djtoo375/public_html/cpttel/coucou.php on line 19
...
savez-vous ce qui ne va pas dans mon code ?

Le plus étrange, c'est que ça semble dépendre de l'hébergeur, car exactement le même code marche chez l'un et pas chez l'autre. Pouvez-vous m'expliquer ?

J'ai nettement simplifié le truc, mais j'ai encore 2 problèmes. D'abord, les fichiers à télécharger sont des mp3, et donc pour proposer leur téléchargement, il suffit de faire un lien html dessus ; mais mon souci, c'est que je voudrais mettre un compteur de téléchargement. Ma page principale est donc :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="content-type">
  <title>clu---</title>
  <meta http-equiv="refresh" content="5;URL=---/cpttel/test.php">
  <!-- content="5;URL=---/cpttel/test.php" -->
</head>
<body>
<table><tr><td>
<a href="coucou.php" target="_blank">---.mp3</a></td><td width=10></td>
<?php
include_once("connect.php"); 
include_once("config.php"); 
 $id_conn = connect();
 $sql="SELECT compteur FROM `coucou`";
$result = mysql_query($sql); 
while ($row = mysql_fetch_assoc($result))
	{ $compteur = $row['compteur']; } 
echo "<td>nombre de t&eacute;l&eacute;chargements=".$compteur."</td></tr></table><br>"; 
 
close($id_conn);?>
 
</body>
</html>
et dans le fichier php appelé quand on clique, on a :
coucou.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// code pour incrementer un compteur
 include_once("connect.php"); include_once("config.php"); 
$id_conn = connect(); 
 
$sql="UPDATE `coucou` SET compteur = compteur +1;"; 
$result = mysql_query($sql)or die(mysql_error());
echo '<iframe src="http://www.djtoonsanimation.com/cpttel/clubbing_session_12.mp3" frameborder=0 scrolling="0"></iframe>';	
 
close($id_conn);
 
 ?>
Le premier problème, c'est que le compteur ne s'incrémente pas de 1 mais de 2 : la page semble être appelée 2 fois et je ne sais pas pourquoi et le 2e problème, c'est que la page principale n'est jamais rafraichie malgré le code
Code :
  <meta http-equiv="refresh" content="5 ;url=---/cpttel/test.php">
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 11h06   #2
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Houla, plusieurs problèmes et plutôt que de les comprendre et de les régler, vous avez essayé des "astuces" qui ont ratées aussi...

On commence par le début.

Citation:
Warning: ini_set() [ref.outcontrol]: Cannot change zlib.output_compression - headers already sent in /home/djtoo375/public_html/cpttel/coucou.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at /home/djtoo375/public_html/cpttel/connect.php:17) in /home/djtoo375/public_html/cpttel/coucou.php on line 18

Warning: Cannot modify header information - headers already sent by (output started at /home/djtoo375/public_html/cpttel/connect.php:17) in /home/djtoo375/public_html/cpttel/coucou.php on line 19
...
zlib.output_compression permet la compression des fichiers pour un affichage plus rapide par le navigateur.
Quoi qu'il en soit votre problème, ici, est qu'un "header" a déjà été envoyé avant même la ligne 15. Ce qui signifie que vous envoyez déjà "quelque chose" avant. (un espace, un bout de code html, une erreur, etc...)

Il faut donc voir ce qui est envoyé avant ce code (on n'a pas le début du fichier, là dessus, on peut pas aider).
----------------------------------
Citation:
Le plus étrange, c'est que ça semble dépendre de l'hébergeur, car exactement le même code marche chez l'un et pas chez l'autre. Pouvez-vous m'expliquer ?
Si un message d'erreur est envoyé avant les "header(" à cause d'une configuration différente, l'un fonctionnera, l'autre ne comprendra pas.
----------------------------------
Citation:
<meta http-equiv="refresh" content="5 ;url=---/cpttel/test.php">
n'est plus utilisé depuis les années 90 . C'est une balise lue et interprétée par les navigateurs et elle l'est de moins en moins. Pour rafraîchir la page (ce qui n'est pas apprécié par tout le monde, moi le 1er, je quitte les sites qui font cela), il faut passer par du javascript.

Citation:
<a href="coucou.php" target="_blank">---.mp3</a>
vous mènera vers "coucou.php" mais n'incluera pas l'iframe dans la page courante ! (comme il semble en être votre intention)
Je pense que vous devriez vous tourner vers l'AJAX.
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 11h52   #3
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Merci de m'avoir répondu.

Citation:
Quoi qu'il en soit votre problème, ici, est qu'un "header" a déjà été envoyé avant même la ligne 15. Ce qui signifie que vous envoyez déjà "quelque chose" avant. (un espace, un bout de code html, une erreur, etc...)
Pour résoudre ce problème, j'ai placé le code qui fait le téléchargement dans un fichier séparé et fait une iframe.
Les erreurs suivantes sont apparues dans un autre essai, donc je n'ai pas creusé et de plus, vous me conseillez l'AJAX : je ne connais pas.
Donc revenons au code qui fait le téléchargement : je n'ai plus les warnings que je citais mais d'autres :
Citation:
Warning: filesize() [function.filesize]: stat failed for clubbing_session_10.mp3 in /.../cpttel/clubbing_session_12.php on line 13

Warning: Cannot modify header information - headers already sent by (output started at .../cpttel/clubbing_session_12.php:13) in /.../cpttel/clubbing_session_12.php on line 13
...
sachant que le code qui produit ça est :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
// code pour forcer un téléchargement
$full_path = 'clubbing_session_10.mp3'; // chemin système (local) vers le fichier
$file_name = basename($full_path);
 
ini_set('zlib.output_compression', 0);
$date = gmdate(DATE_RFC1123);
 
header('Pragma: public');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
header('Content-Length: '.filesize($full_path));
header('Content-MD5: '.base64_encode(md5_file($full_path)));
header('Content-Type: application/octetstream; name="'.$file_name.'"');
header('Content-Disposition: attachment; filename="'.$file_name.'"');
 
header('Date: '.$date);
header('Expires: '.gmdate(DATE_RFC1123, time()+1));
header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($full_path)));
 
readfile($full_path);
exit; // nécessaire pour être certain de ne pas envoyer de fichier corrompu
 
//echo '<iframe src=".../cpttel/clubbing_session_12.mp3" frameborder=0 scrolling="0"></iframe>';	
 
 
 ?>
(et le rafraichissement de la page, que vous n'aimez pas, je pense être obligé, vu que la valeur du compteur change)
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 13h59   #4
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Excusez-moi si vous avez mal pris mes remarques, je cherche juste à faire avancer le problème vers sa résolution, à comprendre vos choix et à vous faire entendre une solution.

Citation:
Envoyé par laurentSc Voir le message
vous me conseillez l'AJAX : je ne connais pas.
Si vous êtes webmaster (comme le suggère votre profil), vous devriez vous y intéresser. Je vous suggère firefox (avec firebug) ou chrome avec jQuery. ça s'apprend facilement

Citation:
Envoyé par laurentSc Voir le message
Code :
1
2
3
4
 
Warning: filesize() [function.filesize]: stat failed for clubbing_session_10.mp3 in /.../cpttel/clubbing_session_12.php on line 13
 
Warning: Cannot modify header information - headers already sent by (output started at .../cpttel/clubbing_session_12.php:13) in /.../cpttel/clubbing_session_12.php on line 13
Voilà qui est intéressant.
Le problème vient donc d'une erreur lancée à cause de filesize($full_path).
Plusieurs raisons possibles :
  • Le chemin et les dossiers n'existent pas ou sont erronés
  • Le fichier n'existe pas à cet endroit
  • Les permissions ne sont pas bonnes sur le dossier parent ou/et sur le fichier.

Il faudrait tester avec :

Code :
1
2
3
4
5
6
<?php
$full_path = '/path/to/mp3/clubbing_session_10.mp3'; // chemin système (local) vers le fichier (pas juste le nom de fichier)
if(!file_exist($full_path)){
    die('le fichier '.$full_path.' n\'existe pas.');
}
...
Si le fichier n'est pas téléchargé, mais uploadé via FTP (ou autre), vérifiez le CHMOD du dossier et du fichier.
Citation:
Envoyé par laurentSc Voir le message
(et le rafraichissement de la page, que vous n'aimez pas, je pense être obligé, vu que la valeur du compteur change)
Je ne vois pas le rapport entre le compteur (dont l'incrémentation est vraisemblablement dans coucou.php) et la page actuelle (différente de coucou.php apparemment).
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 17h46   #5
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
Excusez-moi si vous avez mal pris mes remarques, je cherche juste à faire avancer le problème vers sa résolution, à comprendre vos choix et à vous faire entendre une solution.
Je ne sais pas pourquoi vous avez pû comprendre que j'avais mal pris vos remarques, mais pas du tout, et au contraire, je vous remercie d'essayer de m'aider.

Citation:
Si vous êtes webmaster (comme le suggère votre profil), vous devriez vous y intéresser. Je vous suggère firefox (avec firebug) ou chrome avec jQuery. ça s'apprend facilement
Je suis effectivement webmaster depuis 2006, et fort aidé par un passé d'une dizaine d'années comme codeur en langage C (auquel ressemblent beaucoup Javascript et PHP (dont ils dérivent, je crois) (je connais les 2)). Et si ça s'apprend facilement, est-ce que je peux l'apprendre tout seul (avec un bouquin) ou bien vaut-il mieux recourir à une formation ? Et pourquoi me recommandez-vous des navigateurs ? Je ne vois pas du tout le rapport.

Citation:
Il faudrait tester avec :...
Pas la peine ; effectivement le fichier n'existait pas et je m'étais trompé dans le code (il faut dire que j'ai 2 versions à 2 endroits, et que ce n'est pas le même fichier)

Citation:
Je ne vois pas le rapport entre le compteur (dont l'incrémentation est vraisemblablement dans coucou.php) et la page actuelle (différente de coucou.php apparemment).
maintenant, tout va bien, sauf justement l'affichage de la valeur du compteur : car si l'incrémentation est effectivement faite dans coucou.php (nom choisi juste pour cet essai ), la valeur est stockée dans une base MySQL et j'en lis la valeur dans la page principale, qui n'est pas coucou.php, d'où ce rafraichissement à moins que vous ayez une autre idée...
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 18h11   #6
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Citation:
Envoyé par laurentSc Voir le message
Je ne sais pas pourquoi vous avez pû comprendre que j'avais mal pris vos remarques, mais pas du tout, et au contraire, je vous remercie d'essayer de m'aider.
Au temps pour moi alors

Citation:
Envoyé par laurentSc Voir le message
Et si ça s'apprend facilement, est-ce que je peux l'apprendre tout seul (avec un bouquin) ou bien vaut-il mieux recourir à une formation ? Et pourquoi me recommandez-vous des navigateurs ? Je ne vois pas du tout le rapport.
Cela s'apprend plus ou moins facilement selon votre niveau en javascript.
L'achat d'un livre dédié est, pour moi, un peu superflu, il existe pas mal de tutoriaux là dessus, y compris sur developpez.
Personnellement, j'utilise jQuery régulièrement sur mes projets, il simplifie énormément la syntaxe et l'utilisation des retour d'AJAX (en contre partie, il faut apprendre à utiliser un framework JS, ce qui prend du temps).

Citation:
Envoyé par laurentSc Voir le message
Pas la peine ; effectivement le fichier n'existait pas et je m'étais trompé dans le code (il faut dire que j'ai 2 versions à 2 endroits, et que ce n'est pas le même fichier)
Il suffit de lire et de comprendre les messages d'erreur donc

Citation:
Envoyé par laurentSc Voir le message
maintenant, tout va bien, sauf justement l'affichage de la valeur du compteur : car si l'incrémentation est effectivement faite dans coucou.php (nom choisi juste pour cet essai ), la valeur est stockée dans une base MySQL et j'en lis la valeur dans la page principale, qui n'est pas coucou.php, d'où ce rafraichissement à moins que vous ayez une autre idée...
2 possibilités :
  • Vous gardez la structure de 2 pages : 1 affiche la page principale, l'autre incrémente, fait télécharger et affiche un lien de retour
  • Vous utilisez AJAX pour l'incrémentation et l'affichage du compte modifié
Pour ce dernier, en gros, vous envoyez le nom du fichier vers coucou.php (nom provisoire ) via AJAX et en retour vous récupérez le nombre total et vous l'affichez grâce à js
Une fois le principe et la syntaxe d'AJAX assimilés, vous ne pourrez plus vous en passer
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 18h47   #7
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
2 possibilités :
  • Vous gardez la structure de 2 pages : 1 affiche la page principale, l'autre incrémente, fait télécharger et affiche un lien de retour
  • Vous utilisez AJAX pour l'incrémentation et l'affichage du compte modifié
Pour ce dernier, en gros, vous envoyez le nom du fichier vers coucou.php (nom provisoire ) via AJAX et en retour vous récupérez le nombre total et vous l'affichez grâce à js
En gros, vous me conseillez de gérer ce compteur en ajax, donc tant que je ne l'aurai pas appris, je suis cuit ; c'est bien ça ?

Citation:
Pour rafraîchir la page (ce qui n'est pas apprécié par tout le monde, moi le 1er, je quitte les sites qui font cela), il faut passer par du javascript
Même si vous n'aimez pas, en attendant d'apprendre l'AJAX (et je suis tenté, car vous avez l'air de dire que c'est facile), pouvez-vous m'indiquer comment on rafraichit en js ?
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 00h07   #8
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
Même si vous n'aimez pas, en attendant d'apprendre l'AJAX (et je suis tenté, car vous avez l'air de dire que c'est facile), pouvez-vous m'indiquer comment on rafraichit en js ?
Avec Google, c'était facile à trouver, et voilà le résultat (reste plus qu'à le faire en AJAX (sans rafraichissement, of course))
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h22.


 
 
 
 
Partenaires

Hébergement Web