francoisch Posté 16 Octobre 2010 Posté 16 Octobre 2010 Bonjour Dans un module PHP, jai une logique classique à deux voies, avec un IF dun coté, un ELSE de lautre. Je voudrais émettre un son en passant dans chacune des deux branches, un son différent suivant la branche empruntée. Jai fait un essai avec Dewplayer qui émet bien un son que jai trouvé par ailleurs mais Dewplayer affiche aussi un petit bandeau constitué de petites icônes et dun champ gris qui ne plaisent pas du tout au Php. Jai un message classique : Warning: Cannot modify header information - headers already sent by . Comment faire pour émettre un son qui ne présente pas cet inconvénient? Avec un autre logiciel que Dewplayer ? en mettant le code Html dappel à Dewplayer dans un module indépendant, appelé comment ? En paramétant Dewplayer pour quil naffiche rien du tout (jai cherché sans trouver) ? autre chose ? Par avance merci de votre aide. Francois
Ernestine Posté 16 Octobre 2010 Posté 16 Octobre 2010 Salut François, Je pense que tu mélanges certaines choses (ce n'est pas méchant) PHP s'exécute du côté du serveur, il lui est tout à fait impossible d'émettre le moindre son, et encore moins, comme tu dis, d'être dérangé par des icônes et un champ gris PHP est donc exécuté sur le serveur et produit un code, en particulier html. Ce code est ensuite envoyé au navigateur, et c'est le navigateur qui va jouer le son, par le biais, en l'occurence, du player MP3 Dewplayer. Ce que tu peux faire, c'est choisir le son joué en fonction du if et du else : En gros et très résumé : if(...)$son = truc.mp3;else$son = machin.mp3; Ensuite, dans ton script php qui produit la page où doit être joué le son (voir surtout la troisième ligne) : <object type="application/x-shockwave-flash" data="dewplayer.swf" width="200" height="20" id="dewplayer" name="dewplayer"><param name="movie" value="dewplayer.swf" /><param name="flashvars" value="mp3=<?PHP print($son); ?>" /><param name="wmode" value="transparent" /></object> Voila en gros le mécanisme...
francoisch Posté 19 Octobre 2010 Auteur Posté 19 Octobre 2010 bonjour et merci de ta réponse. Oui, je conviens bien volontiers avec toi que je ne vois pas clair dans ce sujet. Pour le son, j'utilise un code Html très proche du tien: <object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" width="200" height="20"><param name="wmode" value="transparent"><param name="movie" value="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" /></object> Quand jexécute mon code Php, le petit bandeau de Dewplayer saffiche et jai alors 3 erreurs du type que je signalais, 2 des erreurs se produisent sur un SetCookie() et la 3e à la fin sur un header(). Je crois bien que ce type derreur se produit quand il traîne quelque part un ou plusieurs caractères, ce que Php napprécie pas ; jai limpression que le bandeau Dewplayer provoque cette circonstance. Si cest vrai, je cherche le moyen de léviter. Par avance merci de votre aide. Francois
yuston Posté 19 Octobre 2010 Posté 19 Octobre 2010 Il faut que tu insères tout code HTML, en occurrence ton object après avoir mis le cookie/déclaré la session/redirection/... Si tu désires cacher "le bandeau" Dew, qui est en fait le lecteur, tu peux le faire via CSS (ou voir s'il existe une option native - je ne connais que de nom ce lecteur).
francoisch Posté 20 Octobre 2010 Auteur Posté 20 Octobre 2010 Bonjour et merci de ta réponse. Je pourrai mettre le son après les 2 Setcookie mais pas après le header. Par ailleurs, j'ai regardé du coté du player, il existe bien différentes options de présentation mais je n'en ai pas vue qui cache complètement le bandeau. Ca m'intéresserait beaucoup que tu me donnes des indications pour faire qqechose avec une CSS. Javais aussi pensé à isoler le son dans un autre module mais il resterait à trouver un mode de déclenchement de ce module du genre Post dans une Form. Merci par avance de votre aide. Francois
yuston Posté 20 Octobre 2010 Posté 20 Octobre 2010 <div style="display:none;"> <object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" width="200" height="20"><param name="wmode" value="transparent"><param name="movie" value="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" /></object> </div> Tu peux donner une classe et effacer en feuille de style externe aussi. Pour les deux setcookie, oui mets les avant le lecteur dew. Mais pour le header, je parle bien du header = entête http, manipulable par la fonction PHP header(); (et non le header html donné par <head>)
francoisch Posté 22 Octobre 2010 Auteur Posté 22 Octobre 2010 bonjour et merci de ta réponse. Oui, le display:none est une bonne idée, je l'ai ajouté, le bandeau ne s'est pas affiché mais il a dû trainer qqechose quand même car j'ai toujours eu le warning sur le header(), qui est bien un header Php de redirection. Donc mon problème reste entier. Et si je mettais le code Html dans un autre module que j'appellerai de manière asynchrone, comme on le fait avec un Post dans une <form>; mais comment faire ça? mettre une Form juste pour ça? Merci par avance de votre aide. Francois
Ernestine Posté 22 Octobre 2010 Posté 22 Octobre 2010 Salut, Je ne vois pas pour quelle raison Dewplayer provoquerait une erreur du type "Cannot modify header information", ni pourquoi/comment il pourrait faire des setCookie(). A quoi servent ces deux setCookie(), pour quelle raison sont-ils ici, et à quel endroit ? Un setCookie() doit obligatoirement être fait avant toute sortie (avant d'écrire le html). Pour le lecteur Dewplayer, si tu le caches en css, tu peux le mettre où tu veux entre les balises <body> et </body>, tu n'es pas obligé de le mettre en haut. Mais il doit obligatoirement se trouver quelque part entre ces deux balises. Au pire, fais un copier-coller de ton code
francoisch Posté 23 Octobre 2010 Auteur Posté 23 Octobre 2010 bonjour et merci de ta proposition; voici l'essentiel de mon code: if ( $_COOKIE['Service']['reference'] == strtolower ( $reponse ) ) { $score = $_COOKIE['General']['Score']; $score++; SetCookie("General[Score]", $score); ?> <div style="display:none;"> <object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" width="200" height="20"><param name="wmode" value="transparent"><param name="movie" value="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" /></object> </div> <?php }else { SetCookie("General[sequenceErreurs]", $_COOKIE['General']['sequenceErreurs']." * ".$_COOKIE['General']['Numero']); }// compter le nombre d'exercices$nombre = $_COOKIE['General']['Nombre'];$nombre++;SetCookie("General[Nombre]",$nombre);// déclencher la page suivanteheader("Location: http://" . $_SERVER['HTTP_HOST']. rtrim(dirname($_SERVER['PHP_SELF']), '/\\'). "/" . $_COOKIE['Service']['page']); Merci par avance de votre aide. Francois
Ernestine Posté 23 Octobre 2010 Posté 23 Octobre 2010 C'est bien ce qui ressortait de tes messages : ton code d'insertion de Dewplayer n'est pas du tout placé au bon endroit. Là en gros, tu insères Dewplayer et un peu plus loin tu fais un Header Location (redirection vers un autre fichier), il est donc normal que ça produise une erreur. Comme expliqué plus haut, le code de Dewplayer doit impérativement se trouver quelque part entre les balises <body> et </body> de ton fichier. En aucun cas tu ne peux le placer ailleurs. Tu peux tout à fait conserver ce bloc de code mais sans mettre le Dewplayer. Ensuite, dans la page proprement dite (entre <body> et </body>), tu peux effectuer à nouveau le test if : <?php if ( $_COOKIE['Service']['reference'] == strtolower ( $reponse ) ) { ?><div style="display:none;"> <object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" width="200" height="20"><param name="wmode" value="transparent"><param name="movie" value="dewplayer.swf?mp3=Windows XP Erreur.mp3&autostart=1" /></object> </div><?php } ?> (les setCookies(), par contre, doivent bel et bien être faits avant l'envoi du code html)
yuston Posté 24 Octobre 2010 Posté 24 Octobre 2010 On a le temps d'entendre le son d'erreur avec cette redirection?
Ernestine Posté 24 Octobre 2010 Posté 24 Octobre 2010 On a le temps d'entendre le son d'erreur avec cette redirection? La redirection n'est même pas effectuée, puisqu'il est trop tard pour la faire. C'est une redirection serveur (header location), or, comment le serveur pourrait-il rediriger s'il a déjà commencé à envoyer du code html (le code de dewplayer) ? C'est ce qu'indique justement l'erreur "Cannot modify header information".
yuston Posté 24 Octobre 2010 Posté 24 Octobre 2010 Je le sais très bien... je remarque juste que, lorsque tout sera ok, il n'y a pas de temporisation pour que le son puisse être joué en entier (je ne connais pas la durée de ce dernier mais vu le titre, je suppose que ça dure 1-2 secs.) vu que la redirection sera immédiate!
francoisch Posté 24 Octobre 2010 Auteur Posté 24 Octobre 2010 bonjour et merci encore de vos réponses qui font avancer le sujet. En reprenant cette logique depuis la fin, pour moi, le header() est la dernière instruction exécutée avant que le contrôle soit passé à la page suivante spécifiée par ce header. Partant de là, je ne vois pas comment je pourrai mettre une section <body> après le header, si c'est bien ce que vous suggérez. A votre avis? Francois
Ernestine Posté 24 Octobre 2010 Posté 24 Octobre 2010 Mais au final, le serveur envoie envoie une page web avec du code html. Que tu fasses des opérations avant, des setCookie() ou des header location, ça ne change rien, le résultat est le même : la production d'une page web envoyée au client. Et c'est dans cette page web (entre <body> et </body>) que doit se trouver Dewplayer. En reprenant cette logique depuis la fin, pour moi, le header() est la dernière instruction exécutée avant que le contrôle soit passé à la page suivante spécifiée par ce header. Eh bien justement, c'est dans la "page suivante" que doit être inserré le Dewplayer (en réalité ce n'est pas une question de "page", il vaut mieux parler de fichiers, qui eux-mêmes produisent des pages). Je te conseille de reprendre les choses calmement dans l'ordre. Pour commencer, essaie simplement d'intégrer le Dewplayer et de lui faire jouer un son quelconque, sans t'occuper de ton bloc if/else. Une fois que le Dewplayer sera correctement placé et opérationnel, et seulement à ce moment-là, tu pourras y greffer par dessus ton bloc if/else.
francoisch Posté 26 Octobre 2010 Auteur Posté 26 Octobre 2010 Merci Ernestine pour ta réponse. Tu m'as bien mis sur la piste; voila ce que j'ai fait: - je positionne dans mon fichier une variable Php dans la structure if / else - je passe cette variable dans l'Url du header() à la page suivante - la page suivante, dans son code Html, a un peu de Php qui teste la variable et émet le son voulu J'ai aussi appris en cours de route le display:none. Merci encore à vous deux pour m'avoir aidé à trouver la solution. Francois
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant