0

これは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を使用していますが、独自のフレームワークを作成しているようです。

4

1 に答える 1

1

エラー/例外ハンドラを使用して、このようなエラーでスタック トレースを生成する必要があります。そうすれば、完全なコール スタックを取得できます。エラー ハンドラはset_error_handlerでアタッチされ、 debug_backtraceでスタック トレースを取得できます。

このマニュアルのコメントに例があります:

<?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();
于 2013-01-21T08:22:16.733 に答える