これは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;
}
これでクラスファイルを確認しましたが、関数が別の場所から呼び出されていることは明らかです。では、どのクラスがこの関数を呼び出しているかをどのように見つける必要がありますか?
すべてのクラスファイルを推測して調べて、それがどこにあるかを見つける必要がありますか、それともgrep
シェルのようなものを使用して、この関数とそのクラスを見つける可能性がありますか?
複数のレイヤーがあり(少なくとも6〜7倍)、このようなエラーが発生した場合に追跡するのは非常に困難です。この種の問題を体系的にデバッグする方法はありますか?
また、上記の関数はの一部でclass SJB_SearchSqlTranslator
あり、他のクラスには拡張されません。
Smart Job Boardスクリプトは、ライブラリとしてZendを使用していますが、独自のフレームワークを作成しているようです。