当PHP代码位于html标记内时,PHP会自动失败
问题已更新,请阅读下面的内容 由于某些原因,我的CI在加载视图时会自动失败。当PHP代码位于html标记内时,PHP会自动失败,php,debugging,codeigniter,Php,Debugging,Codeigniter,问题已更新,请阅读下面的内容 由于某些原因,我的CI在加载视图时会自动失败。 加载视图只是从控制器中调用 $this->load->view('templates/default.php'); 现在。加载的视图中有一些函数未定义,除非也加载了适当的辅助对象。通常,php会抛出一个错误,但在这里它会无声地失败。我不知道为什么。模板被输出到包含未定义函数的行 我花了很长时间才意识到我的剧本在哪里失败了 以下是我的设置: Windows7终极版 Apache 2.2.15 具有以下错误
加载视图只是从控制器中调用
$this->load->view('templates/default.php');
现在。加载的视图中有一些函数未定义,除非也加载了适当的辅助对象。通常,php会抛出一个错误,但在这里它会无声地失败。我不知道为什么。模板被输出到包含未定义函数的行
我花了很长时间才意识到我的剧本在哪里失败了
以下是我的设置:
- Windows7终极版
- Apache 2.2.15
- 具有以下错误报告设置的PHP 5.3.2:
display\u errors=On
display\u startup\u errors=On
error_reporting=E_ALL | E_STRICT
- 编码点火器1.7.2
更新 经过进一步调试,当PHP代码与HTML内联并在HTML标记内时,PHP无法报告任何错误。现在这很奇怪 这将返回致命错误:
<p><?php echo $bogus(); ?></p>
这不会发生,并且会以静默方式失败:
<p class="<?php echo $bogus(); ?>">paragraph</p>
查看文档,您可以让CI生成自己的错误报告。查看
/system/application/config/config.php
文件和/index.php
文件,查看CI指示php执行的错误报告级别
index.php文件顶部有以下内容,这些内容应该可以解决您的问题:
/*
|---------------------------------------------------------------
| 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);
在配置文件中(为了完整性),如下所示:
/*
|--------------------------------------------------------------------------
| 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;
我认为这只是用于记录,而不是显示。尝试访问不存在的对象将导致一个无声(空白屏幕)错误。原因非常简单。这是因为浏览器没有呈现您的错误,但是如果右键单击->查看源代码,您可以在HTML源代码中看到错误
谢谢大家的帮助。你不会相信是什么问题
浏览器本身!!!事实上,Chrome 6-dev。
它实际上是完全剥离了无效的html行
进一步测试显示:
- IE8通常在浏览器中显示错误(这是错误的,因为它应该只在源代码中可见)
- Firefox 3.6在源代码中显示错误
- Opera 10.53显示源中的错误
再次感谢您的帮助。无需更改您可以添加的整个应用程序的错误显示策略
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);
我知道CI的错误处理,但这与我的经历无关。失败的是php,而不是CI。整个渲染过程只是在包含未定义函数的行处停止,并在不返回任何错误的情况下静默退出。是的,它听起来好像无法在视图中找到您试图加载的文件。仔细检查文件是否位于application/views/templates/default.phpIt中,以正确查找该文件。解析文件时出现问题。原来CI和这件事无关。阅读my update.codeigniters错误处理不会捕获php错误/通知/警告。它更像是抛出异常的替代品。它被设置为4,但CI的最后一条消息仍然是:DEBUG-2010-06-10 15:14:31-->控制器类已初始化
,而它应该显示已加载的文件:
重新更新:它可能不会自动失败。它只是在浏览器中不可见。看一下源代码,检查过了。源代码在bogus()
函数前面的一行结束。听起来您可能在引发PHP错误?或者,这可能是一个技巧,一个预先用美元表示的不存在函数被转换为变量?你可以试着用大括号({$bogus}()
)把它包起来。听起来我需要提出一个bug,但我不敢相信没有人注意到这一点!直接用函数名调用函数也没有任何区别。不过,错误只会出现在文件中。只有当您将PHP配置为不显示特定类型的错误时(可能通过显示错误禁用所有错误)。Michal已经在其问题下面的注释中指出,情况并非如此:“选中了。源代码在bogus()
函数前面的一行结束。”现在一切都好了。检查我自己的答案以查看解决方案。