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

好的,所以首先我需要让所有人都知道,这个答案已经获得专利并在其中一个许可下获得许可,这意味着你甚至无法阅读或想出类似的答案。(你知道我在开玩笑吗?)。好的好的。

3天后,我偶然发现了一个解决方案。一个奇怪的原因,但它解决了我的问题。所以事情没有奏效,没有人回答我的问题,所以我拿到了我买的这本新的 Zend 书,只是试图分散自己对这个问题的注意力。另一个让人分心的是引导到 Linux 而不是 Windows(你知道我是双引导)。

在 Linux 中,我只是决定为有问题的项目创建一个虚拟主机,然后尝试运行它。令我惊讶的是,它运行没有问题。我能够登录。然后我查看了 phpmyadmin,发现我的 mysql 版本是 5.1,而我的寡妇设置中的版本是 5.5。所以我想为什么不将windows中的mysql从5.5降级到5.1。

所以我做了 et viola 我的问题就消失了。我不知道 mysql 的人对它做了什么,但似乎 5.5 版可能与 SHA1 有问题。不确定它是否适用于其他哈希函数。可能有人会证实这种怀疑?

于 2011-01-03T15:37:04.707 回答
3

如上所述,它取决于 MySQL 版本。遵循 5.5 版的 MySQL 文档:

“如果应用程序存储来自返回十六进制数字字符串的函数(例如 MD5() 或 SHA1())的值,则可以通过使用 UNHEX() 将十六进制表示形式转换为二进制并将结果存储在一个 BINARY(N) 列。每对十六进制数字需要一个二进制形式的字节,因此 N 的值取决于十六进制字符串的长度。对于 MD5() 值,N 为 16,对于 SHA1() 值,N 为 20 。”

因此,您可以执行以下操作,而不是降级 MySQL 版本:

  • 将“密码”列的类型从 varchar(32) 更改为 binary(16)
  • 在 ZF 代码中将 'UNHEX()' MySQL 函数添加到您的 MySQL 查询中,例如:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

在我的情况下效果很好。

编辑——如果您的密码盐也存储在二进制列中(例如,如果它也是通过 SHA1 函数生成的十六进制字符串),那么 Zend_Auth_Adapter_DbTable 的最后一个参数应该是: 'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))' 因此,在与密码连接之前,我们将盐转换回小写十六进制字符串。HEX() 以大写形式返回你的 salt,因此如果你的 salt 在使用 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 回答
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

正如 Kervin 已经回答的那样,由于 php 和 mysql 之间的排序规则不匹配而出现此错误。

您可以按照上述解决方案中的建议停止使用 utf8,也可以将数据库表更改为使用 utf8。(只有在我删除表中的数据并重新插入它们之后,它才对我有用。)

于 2012-08-12T16:42:24.663 回答
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
    $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 回答