2013-05-16 38 views
0

我使用了一個簡單的指令從
http://framework.zend.com/manual/2.0/en/modules/zend.authentication.adapter.dbtable.html#advanced-usage-by-example Zend認證。Zend認證'Zend 認證適配器 DbTable'給出錯誤,同時認證

這裏是我的代碼:

$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-共享和ZF-用戶模塊,而不是推倒重來......但作爲相對較新的ZF2我想自己試試吧。

+0

您是否在數據庫中創建了用戶表? –

+0

@Ezequiel - yup,我創建了一個簡單的用戶表。 $適配器都可以,我試着列出表中的所有用戶。這是用戶表的快照。 https://www.dropbox.com/s/9au01uwlz2egfzr/shot_130516_130443.png我希望我沒有做任何愚蠢的事情。 – Laxman

+0

也許使用'$ adapter-> getDbSelect();'方法來查看SQL的外觀? –

回答

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

+1

他實際上是使用setter方法設置所需的參數。 –

+0

yup,@Crisp。我從setter方法中設定了這些參數。 – Laxman

+0

嘿,清晨,我看到一兩杯咖啡之後:o),如果你不使用setter方法並用params實例化,它是否工作? – Crisp

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'。然後,實例化我的數據庫適配器我有任何函數內以下行中我的控制器:

if (!$this->adapter) { 
    $sm = $this->getServiceLocator(); 
    $this->adapter = $sm->get('Zend\Db\Adapter\Adapter'); 
} 

重要的是要注意適配器是這裏重要的是一個類變量。因此,它必須在我的控制器類中定義,如下所示:

public $adapter; 

此步驟足以讓您獲得數據庫適配器。我假設你沒有一個叫做'適配器'的工廠。這應該讓你的例子工作。