首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend Authentication 'Zend\Authentication\Adapter\DbTable‘在进行身份验证时出错

Zend Authentication 'Zend\Authentication\Adapter\DbTable‘在进行身份验证时出错
EN

Stack Overflow用户
提问于 2013-05-16 14:40:51
回答 2查看 879关注 0票数 0

我使用了一条简单的指令

Zend身份验证的http://framework.zend.com/manual/2.0/en/modules/zend.authentication.adapter.dbtable.html#advanced-usage-by-example

下面是我的代码:

代码语言:javascript
复制
$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的新手,我想亲自尝试一下。

EN

回答 2

Stack Overflow用户

发布于 2013-05-16 14:52:18

答案就在错误消息中,Zend\Authentication\Adapter\DbTable需要的不仅仅是适配器作为参数,它还需要一个表名,以及标识符和凭据列的名称……

代码语言:javascript
复制
$authAdapter = new DbTable($dbAdapter,
                           'tableName',
                           'identifierColumnName',
                           'credentialColumnName'
                           );

文档中介绍了此信息,这始终是-> http://zf2.readthedocs.org/en/release-2.1.4/modules/zend.authentication.adapter.dbtable.html的良好起点

票数 0
EN

Stack Overflow用户

发布于 2014-05-20 08:18:55

我知道这是一个古老的问题,也许你现在已经有了答案。尽管如此,我还是会把我的答案放在这里,以供更多的用户使用。我自己也遇到了很多类似的问题,教程希望我们有一些前提条件。

出现此错误的原因是,您在语句中没有完全正确地获取DB适配器。您需要使用在本地或全局配置中定义的字符串调用服务管理实例。例如:

我在global.php文件中定义了这个工厂:

代码语言:javascript
复制
    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\''
        ),
    ),
);

在我的local.php中,我有访问数据库服务器的凭据和信息,如下所示:

代码语言:javascript
复制
return array(
    'db' => array(
        'username' => 'valid_dbusername',
        'password' => 'valid_dbpass',
        'dsn'            => 'mysql:dbname=valid_dbname;host=valid_dbserver',
    ),
);

这足以定义我的服务名称'Zend\Db\Adapter\Adapter‘。然后,为了实例化我的Db适配器,我在控制器中的任何函数中都有以下几行代码:

代码语言:javascript
复制
if (!$this->adapter) {
    $sm = $this->getServiceLocator();
    $this->adapter = $sm->get('Zend\Db\Adapter\Adapter');
}

需要注意的是,adapter在这里是一个类变量。因此,必须在我的控制器类中定义它,如下所示:

代码语言:javascript
复制
public $adapter;

这些步骤足以让您获得一个DB适配器。我假设你没有一个叫做“适配器”的工厂。这应该会让你的例子工作起来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16580609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档