2

データベーステーブルを使用してWeb認証を実装するためのzendの指示に従いました。

まったく同じコードですが、ページをレンダリングすると、次の例外が表示されます。

    Zend\Authentication\Adapter\Exception\RuntimeException
    File:
    C:\xampp\htdocs\pfc\vendor\ZF2\library\Zend\Authentication\Adapter\DbTable.php
    Mensaje:
    The supplied parameters to DbTable failed to produce a valid sql statement, please
    check table and column names for validity.

この他のものによって生成されます:

    Zend\Db\Adapter\Exception\InvalidQueryException
    File:
    C:\xampp\htdocs\pfc\vendor\ZF2\library\Zend\Db\Adapter\Driver\Mysqli\Statement.php
    Mensaje:
    Statement couldn't be produced with sql: SELECT `users`.*, (CASE WHEN `password` = ?
    THEN 1 ELSE 0 END) AS `zend_auth_credential_match` FROM `users` WHERE `mail` = ?

Statement.php は上記の sql を実行できないようですが、? を phpmyadmin に置き換えて sql を送信します。文字列と正常に動作します。

$dbAdapter もテスト済みで、列名が「mail」と「password」であるため、問題なく動作すると確信しています。

これは私のコードにあり、$dbAdapter テスト コードも入れています。

    $dbAdapter = new DbAdapter(array(   //This DbAdapter Work ok sure!!
        'driver' => 'Mysqli',
        'database' => 'securedraw',
        'username' => 'root',
        'password' => ''
    ));

    $fp = function($name) use ($dbAdapter) { return $dbAdapter->driver->formatParameterName($name);};
    $sql = 'SELECT * FROM ' . $qi('users') . ' WHERE id = ' . $fp('id');
    $statement = $dbAdapter->query($sql);
    $parameters = array('id' => 1);
    $sqlResult = $statement->execute($parameters);
    $row = $sqlResult->current();
    $mail = $row['mail'];
    $password = $row['password'];  //until here test $dbAdapter exitly!!

    //Start the auth proccess!!
    $authAdapter = new AuthDbTableAdapter($dbAdapter);
    $authAdapter->setTableName('users')
    ->setIdentityColumn('mail')
    ->setCredentialColumn('password');
    $authAdapter->setIdentity('josep')
    ->setCredential('josep');
    $authResult = $authAdapter->authenticate();   //This is the fail method!!!
4

2 に答える 2

3

このテーマについてさらに調査した結果、dbAdapterのドライバーをpdo_mysqlに変更すると、認証メソッドが正常に機能することがわかりました。

問題は、SGBDが将来変更されないため、PDOを使用したくないということです。

誰かがこれが起こるので知っていますか?

于 2012-10-27T22:57:27.007 に答える
0

これは古いように思えるかもしれませんが、このエラーを解決できました。このエラーは、MySQL のバージョンが原因で発生します。

これは私のために働きます。必要なのは、db セットアップから driver_options を削除することだけです。このコードは通常、Config ファイルの global.php または .local.php にあります。

から変更する:

'db' => array(
    'driver'         => 'Pdo_Mysql',
    'dsn'            => 'mysql:dbname=dbName;host=localhost',
    'username'       => 'dbUser',
    'password'       => 'dbPass',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
),

'db' => array(
    'driver'         => 'Pdo_Mysql',
    'dsn'            => 'mysql:dbname=dbName;host=localhost',
    'username'       => 'dbUser',
    'password'       => 'dbPass',
),

ありがとうございました。この解決策は私の問題を解決しました。

于 2013-10-27T01:19:52.567 に答える