0

我使用了来自
http://framework.zend.com/manual/2.0/en/modules/zend.authentication.adapter.dbtable.html#advanced-usage-by-example的简单指令来进行 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 来说相对较新,我想自己尝试一下。

4

2 回答 2

0

我知道这是一个旧的,可能你现在有答案了。尽管如此,我还是会将我的答案放在这里以供更多用户使用。我自己也遇到过很多类似的问题,教程希望我们具备一些先决条件。

出现此错误是因为您在获取 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\''
        ),
    ),
);

在我的 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 适配器。我假设您没有名为“适配器”的工厂。这应该使您的示例工作。

于 2014-05-20T00:18:54.797 回答
0

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

$authAdapter = new DbTable($dbAdapter,
                           'tableName',
                           'identifierColumnName',
                           'credentialColumnName'
                           );

此信息包含在文档中,这始终是一个很好的起点-> http://zf2.readthedocs.org/en/release-2.1.4/modules/zend.authentication.adapter.dbtable.html

于 2013-05-16T06:52:17.750 回答