数据库
首页 > 数据库> > mysql-Zend_Auth_Adapter_DbTable提供的参数未能生成有效的sql语句

mysql-Zend_Auth_Adapter_DbTable提供的参数未能生成有效的sql语句

作者:互联网

我有以下异常捕获的异常:Zend_Auth_Adapter_DbTable提供的参数未能生成有效的sql语句,请检查表和列名称的有效性.我已经在Google上搜索了一遍又一遍,但是没有找到解决方案.表和列的名称都是正确的.

导致此问题的代码部分是$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?
谢谢大家

解决方法:

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

“如果应用程序存储了诸如MD5()或SHA1()之类的函数的返回十六进制数字字符串的值,则可以通过使用UNHEX()将十六进制表示形式转换为二进制并将结果存储在其中来获得更有效的存储和比较. BINARY(N)列,每对十六进制数字都需要一个字节的二进制形式,因此N的值取决于十六进制字符串的长度,MD5()值的N为16,SHA1()值的N为20 “.

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

>将“密码”列的类型从varchar(32)更改为binary(16)
>在ZF代码中向您的MySQL查询添加’UNHEX()’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()以大写形式返回盐,因此,如果在使用UNHEX()存储盐之前,盐最初是大写,则可以省略LOWER()调用.

标签:mysql,zend-framework,zend-auth
来源: https://codeday.me/bug/20191012/1900711.html