我有以下例外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?
谢谢大家
如上所述,这取决于 MySQL 版本。以下 MySQL 5.5 版本文档:
“如果应用程序存储来自返回十六进制数字字符串的函数(例如 MD5() 或 SHA1())的值,则可以通过使用 UNHEX() 将十六进制表示形式转换为二进制并将结果存储在BINARY(N) 列。每对十六进制数字需要一个二进制形式的字节,因此 N 的值取决于十六进制字符串的长度。对于 MD5() 值,N 为 16,对于 SHA1() 值,N 为 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 函数生成的十六进制字符串),那么 Zend_Auth_Adapter_DbTable 的最后一个参数应该是:
'UNHEX(SHA1(CONCAT(?, LOWER(HEX(salt)))))'
因此,在与密码连接之前,我们将盐转换回小写的十六进制字符串。 HEX() 以大写形式返回盐,因此如果在使用 UNHEX() 存储盐之前盐最初是大写的,则可以省略 LOWER() 调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)