4

PHP サイト認証に PEAR Auth を使用しようとしています。公式ドキュメントの例に従いましたが、次のような多くの通知アラートを取り除くことができません。

Notice: Constant DB_OK already defined in /usr/share/php/DB.php on line 47
Call Stack:
0.0005 647400 1. {main}() /var/www/concursosRep/admin/index.php:0
0.0751 7100160 2. include('/var/www/concursosRep/admin/loginbeta.php') /var/www/concursosRep/admin/index.php:60
0.0788 7448160 3. Auth->start() /var/www/concursosRep/admin/loginbeta.php:114
0.0790 7448528 4. Auth->login() /usr/share/php/Auth.php:528
0.0790 7448608 5. Auth->_loadStorage() /usr/share/php/Auth.php:546
0.0790 7448608 6. Auth->_factory() /usr/share/php/Auth.php:445
0.0809 7681728 7. include_once('/usr/share/php/Auth/Container/DB.php') /usr/share/php/Auth.php:468
0.0839 8066384 8. require_once('/usr/share/php/DB.php') /usr/share/php/Auth/Container/DB.php:32
0.0869 8374552 9. define() /usr/share/php/DB.php:47

何らかの方法でライブラリが複数回含まれていることを意味していることはわかっていますが、修正方法はわかりません。私のphp.iniでは、include_pathにこれがあります:

include_path    .:/usr/share/php:/usr/share/php/libzend-framework-php

Zend が pear auth のクラスをどこかにロードしていることが問題だと最初に思ったので、include_path を .:/usr/share/php に変更しましたが、同じ問題があります。

これが私がそれを使用している方法です:

require_once ('Auth.php');//Pear Auth

   $dns = 'mysql://'.USER.':'.Util::decodePass(PASSWORD).'@'.SERVER.'/'.DBNAME;

  $options = array(
   'dsn' => $dns,
   'table' => 'usuario',
   'usernamecol' => 'login',
   'passwordcol' => 'password',
   'cryptType' => 'md5', //'sha1'
   'db_fields' => '*'
   );

  // Create the Auth object:
  $auth = new Auth('DB', $options, 'show_login_form');

  // Start the authorization:
  $auth->start();

  // Confirm authorization:
  if ($auth->checkAuth()) {
     //Authorized
          echo(javaScriptRedirect(true,$js));             

   } else { // Unauthorized.         
     echo(javaScriptRedirect(false,$js));

   }

DB.phpシステムで2 つのファイルを見つけようとしました。ここに私が得たものがあります:

 # sudo find -name DB.php -print
 ./usr/share/php/DB.php
 ./usr/share/php/Auth/Container/DB.php 

スクリプトに含まれる重複ファイルを見つけようとしましたが、これが得られたものです。

#var_dump(get_included_files());
string(23) "/usr/share/php/Auth.php" [30] => string(36) "/usr/share/php/Auth/Container/DB.php" [31] => string(33) "/usr/share/php/Auth/Container.php" [32] => string(21) "/usr/share/php/DB.php" [33] => string(23) "/usr/share/php/PEAR.php" [34] => string(24) "/usr/share/php/PEAR5.php" [35] => string(27) "/usr/share/php/DB/mysql.php" [36] => string(28) "/usr/share/php/DB/common.php" }

誰かが問題の原因を突き止めるのを手伝ってくれることを願っています。よろしく。

4

2 に答える 2

1

注1:Pear DBは非推奨のライブラリであるため、MDB2を使用するようにAuthを構成する必要があります。

注2:これは通知であるため、コードは正常に機能している可能性があります。

あなたが与えた情報では、DB_OK定数が以前にどこで定義されたかを知るのは難しいです。これを行うには、完全なコードが必要になります。

このようなエラーをデバッグするには、XDEBUGの使用方法を学び、コードを段階的に実行することができます。または、プロのようにこれを学び、実行したくない場合は、それを見つける方法に関するいくつかの醜いアイデアがあります:

これをコードの最初に置きます。

declare(ticks=1);
function my_tick_function()
{
    if (defined('DB_OK'))
    {
        echo 'DB_OK defined for the first time as ' . DB_OK;
        var_dump(debug_backtrace());
        unregister_tick_function('my_tick_function');
    }
}
// using a function as the callback
register_tick_function('my_tick_function', true);

(私はそれを実行していません、それは単なるアイデアです)

http://php.net/manual/en/function.register-tick-function.php

于 2013-02-05T17:43:11.250 に答える
1

DB.php定数だけでなく、クラスが既に定義されているという致命的なエラーが発生するため、2回ロードされるとは思いません。

私があなただったら、とgrepのコードをDB_OK呼び出しdefineます。選択を一部のファイルに限定するには、

var_dump(get_included_files());

47 行目です/usr/share/php/DB.php。どのファイルが既に含まれているかが表示されるため、define()呼び出しをそれらのファイルに含める必要があります。


別の方法は、xdebug の関数トレースdefine()を使用して、呼び出しが行われている場所をログに記録することです。xdebug がインストールされている場合、これがおそらく最も簡単な解決策です。

于 2013-02-05T18:48:37.603 に答える