【问题标题】:Zend Framework: Initialize session (Database) errorZend 框架:初始化会话(数据库)错误
【发布时间】:2012-04-17 19:45:52
【问题描述】:

致命错误:带有消息的未捕获异常“Zend_Db_Table_Exception” '没有找到 Zend_Session_SaveHandler_DbTable 的适配器' C:\wamp\www\hol\library\Zend\Db\Table\Abstract.php 在第 755 行(!) Zend_Db_Table_Exception:找不到适配器 Zend_Session_SaveHandler_DbTable 中 C:\wamp\www\hol\library\Zend\Db\Table\Abstract.php 在第 755 行调用 堆栈

时间记忆函数位置 1 0.0005 373664 {main}( ) ..\init.php:0

2 0.0325 2749720 Zend_Session_SaveHandler_DbTable->__construct( ) ..\init.php:40 3 0.0325 2750168 Zend_Db_Table_Abstract->__construct( ) ..\DbTable.php:207 4 0.0325 2750480 Zend_Session_SaveHandler_DbTable->_setup( ) ..\Abstract.php:268 5 0.0325 2750480 Zend_Db_Table_Abstract->_setup( ) ..\DbTable.php:403 6 0.0325 2750480 Zend_Db_Table_Abstract->_setupDatabaseAdapter( ) ..\Abstract.php:739

代码:

//Configuration consumption
$config = new Zend_Config(require 'config.php');

//Database configuration
$db = Zend_Db::factory($config->database->adapter, array(
    'host'     => $config->database->params->host,
    'username' => $config->database->params->username,
    'password' => $config->database->params->password,
    'dbname'   => $config->database->params->dbname
));

$sess_config = array(
    'name'              => 'session',
    'primary'           => array(
        'session_id',
        'save_path',
        'name',
    ),
    'primaryAssignment' => array(
        'sessionId',
        'sessionSavePath',
        'sessionName',
    ),
    'modifiedColumn'    => 'modified',
    'dataColumn'        => 'session_data',
    'lifetimeColumn'    => 'lifetime',
);

Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($sess_config));

//Initialize the session
Zend_Session::start();

配置

<?php
// config.php
return array(
    'database' => array(
        'adapter' => 'Pdo_Mysql',
        'params'  => array(
            'host'     => 'localhost',
            'username' => 'root',
            'password' => '',
            'dbname'   => 'hol'
        )
    ),
    'session' => array(
        'name'              => 'session',
        'primary'           => array(
            'session_id',
            'save_path',
            'name',
        ),
        'primaryAssignment' => array(
            'sessionId',
            'sessionSavePath',
            'sessionName',
        ),
        'modifiedColumn'    => 'modified',
        'dataColumn'        => 'session_data',
        'lifetimeColumn'    => 'lifetime'
    )
);

SQL:

CREATE TABLE `session` (
    `session_id` char(32) NOT NULL,
    `save_path` varchar(32) NOT NULL,
    `name` varchar(32) NOT NULL DEFAULT '',
    `modified` int,
    `lifetime` int,
    `session_data` text,
    PRIMARY KEY (`Session_ID`, `save_path`, `name`)
);

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    您没有发布config.php 的内容,但基于错误我怀疑您没有指定适配器(mysql、pdo 等)。

    我的配置文件看起来像(yaml):

    database:
      adapter: Pdo_Mysql
      params:
        host:     myhost
        dbname:   mydb
        username: myusername
        password: mypassword
    

    根据Zend API docs,您必须像这样指定适配器:

    // Set this before you make the call to setSaveHandler()
    Zend_Db_Table_Abstract::setDefaultAdapter($db);
    
    Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($sess_config));
    

    【讨论】:

    • 我添加了配置文件,我确实有一个适配器我很确定
    • 看起来您可能需要在 $session_config 数组中添加一个数据库部分。错误'No adapter found for Zend_Session_SaveHandler_DbTable',指的是您传递给Zend_Session_SaveHandler_DbTable 类的数组。
    • 我刚刚做了,请在下面的答案中查看我的评论。
    • 你需要更清楚地了解“崩溃”。具体发生了什么?
    • "Apache 出现问题,必须关闭..." 窗口弹出:S 就在我浏览该特定文件时。
    【解决方案2】:

    您需要调用Zend_Db_Table_Abstract::setDefaultAdapter($db) 提供您在配置示例中创建的$db 对象,因为出现错误时您似乎没有设置默认数据库适配器,或者您需要添加@987654325 @ 对象到$sess_config 数组,因此它被设置为Zend_Session 的数据库适配器。

    Zend_Session_SaveHandler_DbTable 扩展 Zend_Db_Table_AbstractZend_Session_SaveHandler_DbTable 未知的任何选项(例如数据库配置选项)然后传递给设置 DbTable 的 Zend_Db_Table_Abstract 的构造函数。

    试试这个:

    $sess_config = array(
        'db'                => $db, // Pass the $db adapter as the 'db' parameter to Zend_Db_Table_Abstract
        'name'              => 'session',
        'primary'           => array(
            'session_id',
            'save_path',
            'name',
        ),
        'primaryAssignment' => array(
            'sessionId',
            'sessionSavePath',
            'sessionName',
        ),
        'modifiedColumn'    => 'modified',
        'dataColumn'        => 'session_data',
        'lifetimeColumn'    => 'lifetime',
    );
    

    【讨论】:

    • 由于某种原因,当我访问该页面时,我的 Apache 服务器崩溃了……但我可以毫无问题地加载任何其他文件,例如 config.php。
    • @John 因段错误或 500 内部服务器错误而崩溃?
    • 它说“程序”已经崩溃,然后我被重定向到:localhost.se/hol/init.php 而不是通常的地址localhost/hol/init.php
    • 这是否发生在所有使用数据库连接的页面上?
    • 不,只是在特定文件 init.php 上,所有其他文件似乎都很好,当我删除 "Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($sess_config));"它再次工作..(我没有其他文件要测试,因为我只有一个数据库文件)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多