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。无论如何,我现在使用的是新版本,我没有任何问题。谢谢大家的帮助。:)