Authentication 使用DbTable故障的zend framework 2自动识别
我遵循了使用数据库表实现web身份验证的步骤 代码完全相同,但在呈现页面时,会出现以下异常:Authentication 使用DbTable故障的zend framework 2自动识别,authentication,zend-framework2,zend-db-table,zend-auth,Authentication,Zend Framework2,Zend Db Table,Zend Auth,我遵循了使用数据库表实现web身份验证的步骤 代码完全相同,但在呈现页面时,会出现以下异常: Zend\Authentication\Adapter\Exception\RuntimeException File: C:\xampp\htdocs\pfc\vendor\ZF2\library\Zend\Authentication\Adapter\DbTable.php Mensaje: The supplied parameters to DbTable
Zend\Authentication\Adapter\Exception\RuntimeException
File:
C:\xampp\htdocs\pfc\vendor\ZF2\library\Zend\Authentication\Adapter\DbTable.php
Mensaje:
The supplied parameters to DbTable failed to produce a valid sql statement, please
check table and column names for validity.
由另一方制作:
Zend\Db\Adapter\Exception\InvalidQueryException
File:
C:\xampp\htdocs\pfc\vendor\ZF2\library\Zend\Db\Adapter\Driver\Mysqli\Statement.php
Mensaje:
Statement couldn't be produced with sql: SELECT `users`.*, (CASE WHEN `password` = ?
THEN 1 ELSE 0 END) AS `zend_auth_credential_match` FROM `users` WHERE `mail` = ?
似乎是Statement.php无法执行上面的sql,但我用phpmyadmin发送的sql替换了?对于字符串和工作ok
我确信$dbAdapter也可以正常工作,因为我已经对它进行了测试,并且列名称是
“邮件”和“密码”
在我的代码中,我还添加了$dbAdapter测试代码
$dbAdapter = new DbAdapter(array( //This DbAdapter Work ok sure!!
'driver' => 'Mysqli',
'database' => 'securedraw',
'username' => 'root',
'password' => ''
));
$fp = function($name) use ($dbAdapter) { return $dbAdapter->driver->formatParameterName($name);};
$sql = 'SELECT * FROM ' . $qi('users') . ' WHERE id = ' . $fp('id');
$statement = $dbAdapter->query($sql);
$parameters = array('id' => 1);
$sqlResult = $statement->execute($parameters);
$row = $sqlResult->current();
$mail = $row['mail'];
$password = $row['password']; //until here test $dbAdapter exitly!!
//Start the auth proccess!!
$authAdapter = new AuthDbTableAdapter($dbAdapter);
$authAdapter->setTableName('users')
->setIdentityColumn('mail')
->setCredentialColumn('password');
$authAdapter->setIdentity('josep')
->setCredential('josep');
$authResult = $authAdapter->authenticate(); //This is the fail method!!!
在对这个主题进行了更多的研究之后,我发现如果将dbAdapter的驱动程序更改为pdo_mysql,则验证方法可以正常工作 问题是我不想使用PDO,因为SGBD在将来不会改变
有人知道是因为发生了这种情况吗?这可能看起来很旧,但我能够解决这个错误。此错误是由您的MySQL版本引起的 这个适合我。您需要做的就是从db设置中删除driver_选项,这些代码通常位于配置文件中的global.php或.local.php中 更改为:
'db' => array(
'driver' => 'Pdo_Mysql',
'dsn' => 'mysql:dbname=dbName;host=localhost',
'username' => 'dbUser',
'password' => 'dbPass',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
到
多谢各位。这个解决方案解决了我的问题
'db' => array(
'driver' => 'Pdo_Mysql',
'dsn' => 'mysql:dbname=dbName;host=localhost',
'username' => 'dbUser',
'password' => 'dbPass',
),