这是一个SmartJobBoard软件,我不知道如何生成以下错误:
Fatal error: Call to a member function getType() on a non-object in /home/_web/html/engjobs/system/lib/classifieds/SearchEngine/SearchSqlTranslator.php on line 21
我去找这个文件SearchSqlTranslator.php
,下面的代码是getType的函数:
function buildSQLQuery($criteria, &$valid_criterion_number, $sorting_fields, $inner_join = false, $count = false, $relevance = false)
{
foreach ($criteria['common'] as $crit) {
foreach($crit as $criterion) {
$type = $criterion->getProperty()->getType();
if ($criterion->getProperty() !== null && $type == 'monetary') {
$this->isMonetary = true;
break;
}
if ($criterion->getProperty() !== null && $criterion->getProperty()->isComplex()) {
$this->isComplex = true;
break;
}
}
}
if ($relevance)
$this->isRelevance = true;
$sorting_block = $this->_getSortingStatement($sorting_fields);
if ($count)
$select_block = $this->_getSelectCountStatement();
elseif ($relevance)
$select_block = $this->_getSelectRelevanceStatement($relevance);
else
$select_block = $this->_getSelectStatement();
$from_block = $this->_getFromStatement($inner_join);
$where_block = $this->_getWhereStatement($criteria);
$group_block = '';
if (SJB_DB::table_exists($this->object_table_prefix.'_properties'))
$group_block = $this->_getGroupStatement();
$having_block = '';
if ($this->valid_criterion_number != 0 && !empty($group_block)) {
$having_block = " HAVING `count` = {$this->valid_criterion_number} ";
}
$limit_block = '';
if ($this->limit)
$limit_block = ' LIMIT ' . $this->limit;
$valid_criterion_number = $this->valid_criterion_number;
return $select_block . $from_block . $where_block . $group_block . $having_block . $sorting_block . $limit_block;
}
现在我已经看到了类文件,显然该函数是从其他地方调用的。那么我该怎么找到哪个类调用这个函数呢?
我是否必须猜测并浏览每个类文件以查找它的位置,或者我可能在shell上使用类似grep
的内容来寻找此函数及其类?
虽然有多层(至少6-7次),但如果出现类似错误的情况,则很难追溯。有没有办法系统地调试这类问题?
此外,上述函数是class SJB_SearchSqlTranslator
的一部分,并且不会扩展到任何其他类。
智能工作板脚本使用Zend作为其库,但似乎他们已经创建了自己的框架。
答案 0 :(得分:1)
您应该使用错误/异常处理程序,在这些错误上生成堆栈跟踪。这样你就可以获得完整的调用堆栈。错误处理程序将附加set_error_handler,您可以使用debug_backtrace获取堆栈跟踪。
this manual comment中有一个例子:
<?php
set_error_handler('errorHandler');
function errorHandler( $errno, $errstr, $errfile, $errline, $errcontext)
{
echo 'Into '.__FUNCTION__.'() at line '.__LINE__.
"\n\n---ERRNO---\n". print_r( $errno, true).
"\n\n---ERRSTR---\n". print_r( $errstr, true).
"\n\n---ERRFILE---\n". print_r( $errfile, true).
"\n\n---ERRLINE---\n". print_r( $errline, true).
"\n\n---ERRCONTEXT---\n".print_r( $errcontext, true).
"\n\nBacktrace of errorHandler()\n".
print_r( debug_backtrace(), true);
}
function a( )
{
//echo "a()'s backtrace\n".print_r( debug_backtrace(), true);
asdfasdf; // oops
}
function b()
{
//echo "b()'s backtrace\n".print_r( debug_backtrace(), true);
a();
}
b();