Résolu [php] Remplacer erreur par un texte si include n'a plus de cible.

Solutions (46)
Tags :
  • Php
  • Programmation
|
Bonjour,

J'ai une question concernant la fonction php " include(); ".

J'ai un site internet développé pour une webradio hébergée par Radionomy. Radionomy propose des API tel que "nombre d'auditeur" ou encore "derniers titres diffusés". J'affiche les informations envoyée par ces API via la fonction " include(); " mais lorsque ces API bug et que mon serveur n'y accède plus, une erreur php s'affiche à la place et au lieu d'avoir 3 caractères avec le nombre d'auditeurs, j'ai 10 lignes avec des messages d'erreurs.

Est-il possible de faire afficher un texte à la place du message d'erreur lorsque l'API est inaccessible ?


Merci d'avance

Guitarre78
Contenus similaires
  • Autres pages sur : php remplacer erreur texte include cible
Meilleure solution
partage
|
Non, c'est un appel de script, et si l'identifiant est faux, il renvoie bien "".
Donc le plus simple est de faire:
  1. <?php
  2. if (!$fp = @fopen('http://api.radionomy.com/currentaudience.cfm?radiouid=d6856de1-7bfd-49f8-9d35-f88761ad3dd3')) {
  3. echo "Erreur";
  4. } else {
  5. while (($data = fgets($fp, 4096)) !== false) {
  6. if (intval($data) == 0) {
  7. echo "Pas de données";
  8. } else {
  9. echo $data;
  10. }
  11. }
  12. fclose($fp);
  13. }
  14. ?>


Edit: Corrigé, je n'avais pas vu que la ligne avait été tronquée.
  • Commenter cette solution |
Score
0
òh
òi
|
Meilleure réponse sélectionnée par guitarre78.
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
  • Commenter cette réponse |
Score
0
òh
òi
|
Si tu m'expliques ça ira je pense ^^
  • Commenter cette réponse |
Score
0
òh
òi
|
Le seul moyen de gérer une erreur (adresse inexistante, page introuvable, ping timeout) est d'utiliser fsockopen. Ce sera bien plus compliqué qu'un simple include ou fopen.

Si tu t'en sens le courage, fonce :) 
  • Commenter cette réponse |
Score
0
òh
òi
|
Toujours pas de réponse ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Peut-être ... en tout cas j'ai hâte de cliquer sur "Elire meilleure réponse" à celui qui aura réussi :p 
  • Commenter cette réponse |
Score
0
òh
òi
|
Donc a priori, mon intval($data) qui équivaut à "si je n'ai pas un résultat numérique supérieur à 0".
Il faut peut-être afiner un peu.
  • Commenter cette réponse |
Score
0
òh
òi
|
Bah une erreur c'est en gros quand le truc m'affiche sur la page qu'il n'a pas réussi à prendre les données de l'adresse URL etc quoi ... comme si tu fais "include" vers une adresse qui n'existe pas ...
  • Commenter cette réponse |
Score
0
òh
òi
|
Non. Si tu tombes sur une erreur 404 (fichier inexistant) ou sur une page vide, tu arrives bien à ouvrir une page, donc il n'y a pas d'erreur (au sens technique et fonctionnel).
Maintenant, c'est à toi de définir ce qu'est réellement une erreur.
  • Commenter cette réponse |
Score
0
òh
òi
|
SI je falsifie l'Url du lien, ça ne m'affiche toujours pas Erreur, ça m'affiche rien du tout :p 

On dirait que j'ai posé un gros problème aux habitué du PHP non ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Ca affiche "Erreur" si ça n'arrive pas à ouvrir le fichier distant.

Tu diras par contre au crétin qui t'aide (donc moi) que quand il corrige sa source, il doit bien le faire.
La ligne 2 doit être:
  1. if (!$fp = @fopen('http://api.radionomy.com/currentaudience.cfm?radiouid=d6856de1-7bfd-49f8-9d35-f88761ad3dd3', 'r')) {
  • Commenter cette réponse |
Score
0
òh
òi
|
Oui mais quand ça marche pas ça affiche erreur ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Bizarre, depuis ma machine de test ça marche bien ("12" à l'heure actuelle)
  • Commenter cette réponse |
Score
0
òh
òi
|
Ça ne fonctionne pas ... il m'affiche "Erreur" en permanence (avec version Edit corrigé de ton msg)
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
crazycat@idn a dit :
Non, c'est un appel de script, et si l'identifiant est faux, il renvoie bien "".

Il y a pas la priorité des opérateurs qui joue là ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Tu a oublié un " { " après l'url je crois :-) Sinon bah maintenant ça affiche "Erreur" en permanence ...
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Je pense qu'il doit manquer des parenthèses autour de $fp = @fopen(...,...), pour faire le ! sur le résultat, non ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Ça affiche bien le nombre d'auditeur, mais en cas d'absence du fichier distant, ça n'affiche rien du tout ...

Note : pour tester l'erreur, j'ajoute un faute dans l'URL de l'API (URL qui n'existe pas donc).
  • Commenter cette réponse |
Score
0
òh
òi
|
Au temps pour moi, j'ai oublié des parenthèses:
  1. <?php
  2. if (!$fp = @fopen('http://www.domaine.tld/fichier.php', 'r')) {
  3. echo "Erreur";
  4. } else {
  5. while (($data = fgets($fp, 4096)) !== false) {
  6. echo $data;
  7. }
  8. fclose($fp);
  9. }
  • Commenter cette réponse |
Score
0
òh
òi
|
Maintenant il m'affiche aléatoirement "Erreur" ou "1". J'ignore complètement le format de fichier qu'est l'API mais ça ne doit pas être du format web...

Tiens voilà l'adresse de l'API si ça peut t'aider : http://2doc.net/4zine (lien réduit)
  • Commenter cette réponse |
Score
0
òh
òi
|
Le plus simple (mais avec le moins de gestion d'erreur) est donc fopen. Je pars du postulat que le fichier que tu veux inclure est du html (ou js, ou css, ou n'importe quoi déjà interprété).
  1. <?php
  2. if (!$fp = @fopen('http://www.domaine.tld/fichier.php', 'r')) {
  3. echo "Erreur";
  4. } else {
  5. while ($data = fgets($fp, 4096) !== false) {
  6. echo $data;
  7. }
  8. fclose($fp);
  9. }
  • Commenter cette réponse |
Score
0
òh
òi
|
crazycat@idn a dit :
Je me permet encore une disgression. Ne serait-il pas plus judicieux, dans le cas d'un fichier distant, de passer par un fopen() ou encore mieux par un fsockopen() ?


Moi je veux bien essayer perso ... mais comme je l'ai dit plus haut : "ich bin débutant" ... tu pourrais me détailler l'utilisation de la fonction et m'expliquer comment ça procède pour fonctionner (histoire que j'apprenne quelque chose).
  • Commenter cette réponse |
Score
0
òh
òi
|
Je me permet encore une disgression. Ne serait-il pas plus judicieux, dans le cas d'un fichier distant, de passer par un fopen() ou encore mieux par un fsockopen() ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonjour à tous !

Citation :
Code :
$retour = @include($url);
if ($retour != "1" ) {
echo 'KO';
}

Cette solution me retourne le message d'erreur 1 fois sur 10 sans pour autant qu'il y ai d'erreur. C'est déjà pas mal ... mais c'est pas parfait :-D !

Citation :

Code :
if (!@include($url)) {
echo "Service indisponible", chr(13), chr(10);
}


J'essai ça de suite je vous tient au courant.
  • Commenter cette réponse |
Score
0
òh
òi
|
Effectivement, l'include peut retourner un peu n'importe quoi selon ce qui est dans le fichier inclus.
C'est pour cela que tester que @include() == "1" est génant dans le sens où il peut très bien, et sans la moindre erreur, retourner n'importe quoi.
Par contre, il y a un bon paquet de chances pour avoir false en retour si l'inclusion échoue.

Un exemple plus parlant est l'ouverture d'un fichier:
  1. $fp = fopen("file.txt");

Si on teste $fp == 1, il y a de grandes chances que cela échoue car $fp est un id de ressource. On teste donc l'inverse: if (!$fp = fopen("file.txt")) { die('Error'); }
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
J'avais regardé le manuel d'include, mais impossible de savoir que ça retourne un booléen (je fais plus de PHP depuis quelques années :p ).

Il est indiqué que ça peut retourner ce qu'on veut, si on fait un return dans la page incluse, et sinon, ils indiquent que si on fait un echo du retour, ça retourne 1...
Bref, j'ai hésité pendant un moment à faire un if (!$retour) (d'ailleurs je l'ai écrit, puis effacé), tant pis. :) 


Edit: @Crazycat: et puis personne ne t'empêche de mettre ton grain de sel, je pense que c'est un peu le but, d'avoir des avis / réponses de plusieurs personnes :) 
  • Commenter cette réponse |
Score
0
òh
òi
|
Non que je veuille mettre mon grain de sel, mais ce n'est pas comme ça que l'on teste ce genre de fonction.
include() est le type de fonction qui retourne un booléen, donc on fait:
  1. if (!@include($url)) {
  2. echo "Service indisponible", chr(13), chr(10);
  3. }

Faire un cast de $retour est un risque potentiel d'erreur.
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Et si tu mets :
  1. $retour = @include($url);
  2. if ($retour != "1") {
  3. echo 'KO';
  4. }



(aaaaah PHP et les variables...)
  • Commenter cette réponse |
Score
0
òh
òi
|
Il marque ... 1 !
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Et si tu mets :
  1. $retour = @include($url);
  2. echo "#######$retour######";


Qu'est ce qu'il te met au milieu des # ?
  • Commenter cette réponse |
Score
0
òh
òi
|
  • Commenter cette réponse |
Score
0
òh
òi
|
Le mieux serait de montrer ce que tu mets dans include();
  • Commenter cette réponse |
Score
0
òh
òi
|
Le fichier distant est une API dont j'ignore l'extension. Tout ce que je sais c'est qu'elle génère un chiffre (nombre d'auditeurs) et quand je fais "include" du lien de cette API ça affiche le nombre d'auditeur sur ma page.

Citation :
Code :
if ((include $url) == 1) {
echo 'OK';
} else {
echo 'KO';
}


Ça affiche OK en permanence, même lorsque le lien n'existe pas.

Citation :
Code :
$retour = @include($url);
if ($retour != 1) {
echo 'KO';
}


Ça ne fait rien de plus que "@include" (en gros soit ça affiche le nombre, soit rien du tout).
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Le problème c'est que c'est certainement un fichier distant, du coup le file_exists ne doit pas fonctionner.
Je suppose que ça devrait le faire :
  1. if ((include $url) == 1) {
  2. echo 'OK';
  3. } else {
  4. echo 'KO';
  5. }


ou sinon peut être :
  1. $retour = @include($url);
  2. if ($retour != 1) {
  3. echo 'KO';
  4. }
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
en fait c'est quoi exactement ?

car file_exists(); vas vérifier si le fichier est présent sur le serveur !

je suis pas sur mais regarde du coter de linkinfo(); http://www.php.net/manual/fr/function.linkinfo.php
  • Commenter cette réponse |
Score
0
òh
òi
|
J'ai remplacé "lien du fichier.php" par l'adresse de l'API c'est tout ...
  • Commenter cette réponse |
Score
0
òh
òi
|
guitarre78 a dit :
Ça m'affiche le mot erreur en permanence (bien entendu même quand l'API fonctionne).


Tu as remplacer la variable $url par quoi?
  • Commenter cette réponse |
Score
0
òh
òi
|
Ça m'affiche le mot erreur en permanence (bien entendu même quand l'API fonctionne).
  • Commenter cette réponse |
Score
0
òh
òi
|
Essaye:

  1. <?php
  2. $url = "liendufichier.php";
  3. if (file_exists($url)) {
  4. include ($url);
  5. } else {
  6. echo "Erreur";
  7. }
  8. ?>


Pas tester!
  • Commenter cette réponse |
Score
0
òh
òi
|
Super ça fonctionne !
C'est possible de remplacer le "rien" par un texte choisi ?
  • Commenter cette réponse |
Score
0
òh
òi
|
C'est comme include(); sauf que tu n'auras pas de message d'erreur ;) 
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonjour,

Peux-tu détailler l'utilisation de cette fonction s'il te plait ? Je suis débutant :-)

Merci
  • Commenter cette réponse |
Score
0
òh
òi
|
Salut,

Essaye peut-être

@include ();
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonjour,

Merci pour ta réponse mais cela ne fonctionne pas malheureusement ...

Une solution ?
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
salut,

j'ai trouvais ça :
  1. if ((include 'vars.php') == 'OK') {
  2. echo 'OK';
  3. }


http://php.net/manual/fr/function.include.php
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS