2010-06-10 6 views
2

PROBLÈME MISE À JOUR, LIRE CI-DESSOUSPHP échoue silencieusement lorsque le code php-est dans balise html

Pour une raison quelconque mon CI échoue silencieusement lors du chargement de vue.
vue de chargement est simplement appelé contrôleur de

$this->load->view('templates/default.php'); 

maintenant. Certaines fonctions de la vue chargée ne sont pas définies à moins qu'un assistant approprié soit également chargé. Normalement, php jette une erreur, mais à la place il échoue silencieusement ici. Je ne sais pas pourquoi. Le template est sorti jusqu'à la ligne contenant la fonction indéfinie.

Il m'a fallu beaucoup de temps pour réaliser où mon script échoue.

Voici ma configuration:

  • Windows 7 Édition Intégrale
  • Apache 2.2.15
  • PHP 5.3.2 avec les paramètres suivants de rapports d'erreur:
    • display_errors = On
    • display_startup_errors = On
    • error_reporting = E_ALL | E_STRICT
  • CodeIgniter 1.7.2

Toutes les idées pourquoi serait-ce?


MISE À JOUR

Après le débogage plus, il est apparu que PHP ne signale aucune erreur lorsque le code php est en ligne avec HTML et dans la balise HTML. Maintenant c'est bizarre.

Ce retourne Erreur fatale:

<p><?php echo $bogus(); ?></p> 

Cela ne veut pas et échoue silencieusement:

Pourquoi? : O


MISE À JOUR 2

enquête plus poussée a montré que si un error_log en PHP est spécifié, les erreurs sont signalées en fait dans ce dossier, mais pas encore dans le navigateur ... Encore une fois, Pourquoi?


MISE À JOUR 3

En fait, mon code devrait être légèrement différent. Vérifié une autre installation PHP sur une machine complètement différente et cela a confirmé le bug PHP.Rapporté ici: http://bugs.php.net/bug.php?id=52040

+0

Re votre mise à jour: Il n'échoue probablement pas en silence. Ce n'est tout simplement pas visible dans le navigateur. Jetez un oeil sur le code source. –

+0

Vérifié cela. La source se termine à la ligne précédant la fonction 'bogus()'. –

+0

Vous semblez élever un bug PHP? Ou pourrait-il s'agir d'une astuce où une fonction inexistante pré-prested avec un dollar est convertie en variable? Vous pourriez essayer de l'entourer d'accolades ('{$ bogus}()'). – Kurucu

Répondre

2

Merci pour toute l'aide les gars. Vous ne croiriez pas quel était le problème!
Le navigateur lui-même !!! Chrome 6-dev en fait.
En fait, il supprimait complètement la ligne html invalide.

D'autres tests ont révélé:

  • IE8 affiche l'erreur normalement dans le navigateur (ce qui est faux vraiment comme il devrait être visible que dans la source)
  • Firefox 3.6 montre l'erreur dans la source
  • Opera 10.53 montre l'erreur dans la source

Merci encore pour votre aide.

-1

Jetez un oeil à la documentation error handling, vous pouvez obtenir CI pour produire ses propres rapports d'erreurs.

+0

Je suis au courant de la gestion des erreurs de CI, mais cela n'a rien à voir avec ce que je vis. C'est le php qui échoue, pas CI. L'ensemble du processus de rendu s'arrête simplement à la ligne contenant la fonction indéfinie et se ferme silencieusement sans renvoyer d'erreur. –

+0

Oui, il semble qu'il ne peut pas trouver le fichier que vous essayez de charger dans la vue. Vérifiez que le fichier est dans l'application/views/templates/default.php – fire

+0

Il était de trouver le fichier correctement. Un problème est apparu lors de l'analyse du fichier. Il s'avère que CI n'a rien à voir avec ça. Lisez ma mise à jour –

0

Examinez le fichier /system/application/config/config.php et le fichier /index.php et vérifiez le niveau d'erreur que CI demande à PHP de faire.

En haut du fichier index.php est le suivant, ce qui devrait résoudre votre problème:

/* 
|--------------------------------------------------------------- 
| PHP ERROR REPORTING LEVEL 
|--------------------------------------------------------------- 
| 
| By default CI runs with error reporting set to ALL. For security 
| reasons you are encouraged to change this when your site goes live. 
| For more info visit: http://www.php.net/error_reporting 
| 
*/ 
    error_reporting(E_ALL); 

Et dans le fichier de configuration (pour être complet) est la suivante:

/* 
|-------------------------------------------------------------------------- 
| Error Logging Threshold 
|-------------------------------------------------------------------------- 
| 
| If you have enabled error logging, you can set an error threshold to 
| determine what gets logged. Threshold options are: 
| You can enable error logging by setting a threshold over zero. The 
| threshold determines what gets logged. Threshold options are: 
| 
| 0 = Disables logging, Error logging TURNED OFF 
| 1 = Error Messages (including PHP errors) 
| 2 = Debug Messages 
| 3 = Informational Messages 
| 4 = All Messages 
| 
| For a live site you'll usually only enable Errors (1) to be logged otherwise 
| your log files will fill up very fast. 
| 
*/ 
$config['log_threshold'] = 2; 

Ce que je crois est seulement pour l'enregistrement, pas l'affichage.

+0

Il est mis à 4 et toujours le dernier msg de CI est: 'DEBUG - 2010-06-10 15:14:31 -> Classe de contrôleur Initialized' alors qu'il devrait afficher' Fichier chargé: ' –

+0

Voir mon réponse mise à jour concernant le fichier 'index.php'. – Kurucu

+0

Il s'avère que CI n'a rien à voir avec ça. Lisez ma mise à jour –

0

Si vous tentez d'accéder à un objet qui n'est pas présent, une erreur silencieuse (écran vide) se produit.

+0

Seulement si vous avez configuré PHP pour ne pas afficher ce type spécifique d'erreur (éventuellement en désactivant toutes les erreurs via display_errors). –

0

La raison est vraiment très simple. C'est parce que le navigateur ne rend pas votre erreur, mais si vous faites un clic droit -> Voir la source, vous pouvez voir l'erreur dans votre code source HTML.

<p class="<?php echo $bogus(); ?>">paragraph</p>

génèrerait

<p class="Fatal error: Call to undefined function on line ...">paragraph</p>

ou quelque chose de similaire. Le navigateur pense simplement que ces mots sont une collection de classes CSS, donc vous ne voyez rien sur votre écran. Il est contenu dans un attribut HTML.

+0

Michal a déjà indiqué que ce n'est pas le cas dans les commentaires ci-dessous sa question: "Vérifié que la source se termine à la ligne avant la fonction' bogus() '." – Kurucu

0

sans avoir à changer la politique d'affichage d'erreur pour l'ensemble de l'application, vous pouvez ajouter

ini_set('display_errors', 1); 
error_reporting(E_ALL); // Or what ever fits 

//If one would like to log the errors one could use 
ini_set('log_errors', 1); 
ini_set('error_log', FILE_TO_LOG_TO); 

au script en question.

+0

Tous triés maintenant. Vérifiez ma propre réponse pour voir la solution. –

Questions connexes