1

次の例外Caught exception: The supplied parameters to Zend_Auth_Adapter_DbTable failed to produce a valid sql statement, please check table and column names for validity.があります。コードを何度もグーグルでチェックしましたが、解決策が見つかりませんでした。テーブル名と列名はすべて正しいです。

この問題の原因となっているコードのセクションは$result = $auth->authenticate($authAdapter);. 実際、コントローラーのコード全体は以下のとおりです。

class AuthenticationController extends Zend_Controller_Action
{
public function init()
{
    $uri = $this->_request->getPathInfo();

    $activenav = $this->view->navigation()->findByUri($uri);
    $activenav->active = true;
}

public function indexAction()
{
    // action body
}

public function loginAction()
{

    if(Zend_Auth::getInstance()->hasIdentity())
    {
        $this->_redirect('index/index');
    }

    $request = $this->getRequest();
    $form = new Application_Form_LoginForm();
    if($request->isPost())
    {
        if($form->isValid($this->_request->getPost()))
        {

            $authAdapter = $this->getAuthAdapter();

            $username = $form->getValue('username');
            $password = $form->getValue('password');

            $authAdapter->setIdentity($username)
                        ->setCredential($password);

            $auth = Zend_Auth::getInstance();

            try
            {
                $result = $auth->authenticate($authAdapter);
            }
            catch (Exception $e) 
            {
                echo 'Caught exception: ',  $e->getMessage(), "\n";
            }

                if ($result->isValid()) 
                {
                    $identity = $authAdapter->getResultRowObject();
                    $authstorage = $auth->getStorage();
                    $authstorage->write($identity);

                   $this->_redirect('index/index');
                }
                else
                {
                    $this->view->errorMessage = "User name or password is wrong";
                }
            }
        }

    $this->view->form = $form;


}

public function logoutAction()
{
    Zend_Auth::getInstance()->clearIdentity();
    $this->_redirect('index/index');
}

private function getAuthAdapter()
{
    $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
    $authAdapter->setTableName('users')
                ->setIdentityColumn('username')
                ->setCredentialColumn('password')
                ->setCredentialTreatment('SHA1(CONCAT(?,salt))');

    return $authAdapter;
}
}

私はこれで数日間立ち往生しており、それが私を狂わせています。ところで、生成されている実際の sql をどのようにエコーアウトできますか? 皆さんありがとう

4

7 に答える 7

3

上記のように、MySQL のバージョンに依存します。バージョン 5.5 の次の MySQL ドキュメント:

「アプリケーションが 16 進数の文字列を返す MD5() や SHA1() などの関数から値を格納する場合、UNHEX() を使用して 16 進表現をバイナリに変換し、結果をBINARY(N) 列. 16 進数の各ペアにはバイナリ形式で 1 ​​バイトが必要であるため、N の値は 16 進文字列の長さに依存します. N は MD5() 値の場合は 16、SHA1() 値の場合は 20 です。 ."

そのため、MySQL のバージョンをダウングレードする代わりに、次のようにすることができます。

  • 「パスワード」列のタイプを varchar(32) から binary(16) に変更します
  • 'UNHEX()' MySQL 関数を ZF コードの MySQL クエリに追加します。例:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

私の場合はうまくいきます。

編集 -- パスワードソルトもバイナリ列に格納されている場合 (たとえば、それも SHA1 関数で生成された 16 進文字列である場合)、Zend_Auth_Adapter_DbTable の最後のパラメータは次のようになります: 'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))' したがって、パスワードと連結する前に、salt を小文字の 16 進文字列に変換し直しています。HEX() はソルトを大文字で返すため、UNHEX() を使用して保存する前にソルトが元々大文字だった場合は、LOWER() 呼び出しを省略できます。

于 2012-01-29T23:10:39.797 に答える
3

Unicode 'utf-8' 設定が、MySQL サーバーが期待するものと一致していることを確認してください。

つまり、サーバーがそのように構成されていない場合 (デフォルトのように)、application.ini ファイルで文字セットを「utf-8」として設定しないでください。あ...

SET NAMES 'utf8'

ZF から MySQL に送信され、エラーが発生します。

application.ini の「utf-8」文字セットを削除すると、これが解決されました。

于 2012-07-04T21:14:34.350 に答える
3

わかりましたので、最初に、この回答が特許を取得し、同様の回答を読んだり、思いついたりすることさえできないライセンスの 1 つの下でライセンスされていることをすべて認識させる必要があります (冗談ですよね?)。わかりました。要点はわかりました....

3日後、私は解決策を見つけました。原因の奇妙なものですが、それは私の問題を解決しました。物事がうまくいかず、誰も私の質問に答えてくれなかったので、問題から気をそらすために購入したこの新しい zend の本を手に入れました。もう 1 つの気晴らしは、Windows ではなく Linux を起動することでした (私はデュアル ブートします)。

Linux では、問題のあるプロジェクト用の仮想ホストを作成し、それを試して実行することにしました。驚いたことに、問題なく動作します。ログインできました。次に、phpmyadmin を調べたところ、mysql のバージョンが 5.1 であるのに対し、未亡人セットアップのバージョンは 5.5 であることがわかりました。そこで、Windows の mysql を 5.5 から 5.1 にダウングレードしない理由を考えました。

だから私はエトビオラをしました私の問題はなくなりました. mysql の担当者が何をしたかはわかりませんが、バージョン 5.5 では SHA1 に問題があるようです。ただし、他のハッシュ関数に適用されるかどうかはわかりません。誰かがこの疑惑を確認するでしょうか?

于 2011-01-03T15:37:04.707 に答える
0

私はこれを以下のように解決しました:

1)vim /etc/php.ini

error_reporting = E_ALL & ~E_NOTICE
; which actually disable the notice errrors in log files too

2)次に、以下のようなphpの他のパッケージをインストールし、不足しているパッケージをメインサーバーに追加すると、機能します。

# yum list installed php*
Loaded plugins: auto-update-debuginfo, langpacks, presto, refresh-packagekit
Installed Packages
php.i686                                                                5.3.10-1.fc15                         @updates
php-Smarty.noarch                                                       2.6.26-2.fc15                         @fedora 
php-ZendFramework.noarch                                                1.11.10-1.fc15                        @updates
php-ZendFramework-Cache-Backend-Apc.noarch                              1.11.10-1.fc15                        @updates
php-ZendFramework-Cache-Backend-Memcached.noarch                        1.11.10-1.fc15                        @updates
php-ZendFramework-Services.noarch                                       1.11.10-1.fc15                        @updates
php-ZendFramework-demos.noarch                                          1.11.10-1.fc15                        @updates
php-ZendFramework-extras.noarch                                         1.11.10-1.fc15                        @updates
php-bcmath.i686                                                         5.3.10-1.fc15                         @updates
php-cli.i686                                                            5.3.10-1.fc15                         @updates
php-common.i686                                                         5.3.10-1.fc15                         @updates
php-devel.i686                                                          5.3.10-1.fc15                         @updates
php-gd.i686                                                             5.3.10-1.fc15                         @updates
php-mbstring.i686                                                       5.3.10-1.fc15                         @updates
php-mcrypt.i686                                                         5.3.10-1.fc15                         @updates
php-mysql.i686                                                          5.3.10-1.fc15                         @updates
php-pdo.i686                                                            5.3.10-1.fc15                         @updates
php-pear.noarch                                                         1:1.9.4-1.fc15                        @updates
php-pear-Cache-Lite.noarch                                              1.7.11-1.fc15                         @updates
php-pear-XML-Beautifier.noarch                                          1.2.2-2.fc15                          @fedora 
php-pear-XML-Parser.noarch                                              1.3.4-2.fc15                          @fedora 
php-pear-XML-RPC2.noarch                                                1.0.6-1.fc15                          @fedora 
php-pear-XML-RSS.noarch                                                 1.0.2-1.fc15                          @updates
php-pear-XML-Serializer.noarch                                          0.20.2-2.fc15                         @fedora 
php-pecl-apc.i686                                                       3.1.9-1.fc15                          @updates
php-pecl-apc-devel.i686                                                 3.1.9-1.fc15                          @updates
php-pecl-memcache.i686                                                  3.0.5-3.fc15                          @fedora 
php-php-gettext.noarch                                                  1.0.11-3.fc15                         @updates
php-process.i686                                                        5.3.10-1.fc15                         @updates
php-qt.i686                                                             4.6.5-1.fc15                          @updates
php-qt-devel.i686                                                       4.6.5-1.fc15                          @updates
php-snmp.i686                                                           5.3.10-1.fc15                         @updates
php-soap.i686                                                           5.3.10-1.fc15                         @updates
php-xml.i686                                                            5.3.10-1.fc15                         @updates
phpMyAdmin.noarch                                                       3.4.9-1.fc15                          @updates
于 2012-03-10T10:17:20.070 に答える
0
    $dbAdapter = Zend_Db_Table::getDefaultAdapter();
    $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);

    $version = $dbAdapter->getServerVersion();

    if (!is_null($version))
    {
        if (version_compare($version, '5.5', '>=')){
            $credentialTreatment = 'CAST(SHA1(CONCAT(?, salt)) AS CHAR) AND active = 1';
        }else{
            $credentialTreatment = 'SHA1(CONCAT(?, salt)';
        }
    }


    $authAdapter->setTableName('users')
    ->setIdentityColumn('username')
    ->setCredentialColumn('passwd')
    ->setCredentialTreatment($credentialTreatment);

    return $authAdapter;

これをチェックしてください

MySQL 5.5.3 以降、戻り値は接続文字セットの非バイナリ文字列です。5.5.3 より前では、戻り値はバイナリ文字列です。値を非バイナリ文字列として使用する方法については、このセクションの冒頭にある注意事項を参照してください。

それは私にとってはうまくいきます。

于 2015-09-05T10:51:45.657 に答える
0

同じエラーがあり、誤解を招くことがわかりました。私の場合、説明する価値のない理由で間違ったデータベースに接続していたことが判明しました。あなたがしたいことは、Zend_Auth_Adapter_DbTable があなたが言及した例外をスローする原因となった前の例外を取得することです。以下は私がこれをどのように達成したかです:

    $adapter = $this->_getAuthAdapter();
    $adapter->setIdentity($values['username']);
    $adapter->setCredential($values['password']);

    $auth = \Zend_Auth::getInstance();
    try {
        $result = $auth->authenticate($adapter);

    } catch (\Zend_Auth_Adapter_Exception $ex) {
        die($ex->getPrevious()->getMessage());
    }

結局のところ、答えは正確ではありません。

    SET NAMES 'utf8'

それは本当にいくつもの問題になる可能性があります。最善の策は、前の例外を取得して、MySQL に通知させることです。おそらく答えは文字エンコーディングに関連するでしょう。私の場合はそうではありませんでした。

于 2014-07-31T19:50:46.283 に答える
0

Kervin が既に回答しているように、このエラーは、php と mysql の照合の不一致が原因で表示されます。

上記の解決策で提案されているように utf8 の使用を停止するか、データベース テーブルを変更して utf8 を使用することができます (テーブル内のデータを削除して再挿入した後にのみ機能しました)。

于 2012-08-12T16:42:24.663 に答える