Zend认证&x27;Zend\Authentication\Adapter\DbTable';验证时出现错误
我使用了Zend认证&x27;Zend\Authentication\Adapter\DbTable';验证时出现错误,authentication,zend-framework2,Authentication,Zend Framework2,我使用了 用于Zend身份验证 这是我的密码: $adapter = $sm->get('adapter'); $authAdapter = new DbTable($adapter); $authAdapter -> setTableName('users')->setIdentityColumn('username')->setCredentialColumn('password'); $authAdapter -> setIdentity('admin')-&
用于Zend身份验证 这是我的密码:
$adapter = $sm->get('adapter');
$authAdapter = new DbTable($adapter);
$authAdapter -> setTableName('users')->setIdentityColumn('username')->setCredentialColumn('password');
$authAdapter -> setIdentity('admin')-> setCredential('password');
$authAdapter -> authenticate();
上述代码生成如下错误:
提供给DbTable的参数无法生成有效的sql语句,请检查表名和列名的有效性
我知道使用ZF Commons和ZF Users模块而不是重新发明轮子是否有意义。。。但由于对ZF2比较陌生,我想自己尝试一下。答案就在错误消息中,
Zend\Authentication\Adapter\DbTable
需要的不仅仅是适配器作为参数,它还需要表名、标识符和凭证列的名称
$authAdapter = new DbTable($dbAdapter,
'tableName',
'identifierColumnName',
'credentialColumnName'
);
这些信息包含在文档中,这始终是一个很好的起点->我知道这是一个很老的问题,也许你现在已经有了答案。尽管如此,我还是会把我的答案放在这里,供更多的用户参考。我自己也面临许多类似的问题,教程希望我们有一些先决条件 发生此错误的原因是,您在获取DB适配器的语句中不完全正确。您需要使用在本地或全局配置中定义的字符串调用服务管理实例。例如: 我在global.php文件中定义了此工厂:
return array(
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter'
=> 'Zend\Db\Adapter\AdapterServiceFactory',
),
),
'db' => array(
'driver' => 'Pdo',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
);
在my local.php中,我拥有访问数据库服务器的凭据和信息,如下所示:
return array(
'db' => array(
'username' => 'valid_dbusername',
'password' => 'valid_dbpass',
'dsn' => 'mysql:dbname=valid_dbname;host=valid_dbserver',
),
);
这足以定义我的服务调用“Zend\Db\Adapter\Adapter”。然后,为了实例化我的Db适配器,我在控制器中的任何函数中都有以下几行代码:
if (!$this->adapter) {
$sm = $this->getServiceLocator();
$this->adapter = $sm->get('Zend\Db\Adapter\Adapter');
}
需要注意的是,这里的适配器是一个类变量。因此,它必须在我的控制器类中定义,如:
public $adapter;
这些步骤足以让您获得一个DB适配器。我假设你没有一个叫做“适配器”的工厂。这会让你的例子起作用 事实上,他正在使用setter方法设置这些必需的参数。我已经从setter方法中设置了这些参数。嘿,一大早,我看到在喝了一两杯咖啡后:o),如果不使用setter方法,而是用params进行实例化,它会起作用吗?嗨,我尝试在构造函数中传递params。结果总是和使用setter方法一样。你在数据库中创建了users表了吗?@Ezequiel-yup,我创建了一个简单的users表。$adapter很好,我列出了表中的所有用户。下面是users表的快照。我希望我没有做任何傻事。也许使用
$adapter->getDbSelect()代码>方法以查看SQL的外观?您好,$authAdapter->getDbSelect()->getSqlString()生成了一个空字符串…通过下载最新版本的Zend Framework 2.2.0解决了此问题。我想我使用的ZF2.1.0版本有一个bug。无论如何,我现在使用的是新版本,我没有任何问题。谢谢大家的帮助。:)