Php Zend_Db_抽象子类(模型)

Php Zend_Db_抽象子类(模型),php,mysql,zend-framework,Php,Mysql,Zend Framework,我的应用程序模型有问题。它应该在mysql数据库中保存一个新用户 application/config/application.ini [production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap

我的应用程序模型有问题。它应该在mysql数据库中保存一个新用户

application/config/application.ini

[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.params.displayExceptions = 1
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts"
resources.frontController.params.displayExceptions = 0
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = "pass"
resources.db.params.dbname = "cms"
resources.db.isDefaultTableAdapter = true

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
应用程序/controllers/MemberController.php:

public function newAction()
{
    $frmNewMember = new Form_MemberRegisterationForm();
    $frmNewMember->setMethod('post');
    $frmNewMember->setAction('/member/new');
    if ($this->getRequest()->isPost())
    {
        if ($frmNewMember->isValid($_POST))
        {
            $memberModel = new Model_Members();
            // process the data
            $result = true;
            $result = $memberModel->createMember(
                $frmNewMember->getValue('name'), 
                $frmNewMember->getValue('lastName'), 
                $frmNewMember->getValue('uid'), 
                $frmNewMember->getValue('email'), 
                $frmNewMember->getValue('password'));
            if ($result)
            {
                $this->_forward('confirm');
            }
        }
    }
    $this->view->form = $frmNewMember;
}
application/models/Members.php:

public function createMember($name, $lastName, $uid, $email, $password)
{
    // Create row data
    $row = $this->createRow();
    $row->name = $name;
    $row->lastName = $lastName;
    $row->uid = $uid;
    $row->email = $email;
    $row->pasword = md5($password);
    // Save the row
    $row->save();
    $id = $this->_db->lastInsertId();
    return $id;
}
单击“发送”按钮时,出现以下错误:

Fatal error: Undefined class constant 'EXCEPTION_NO_ROUTE' 
in /var/www/project/application/controllers/ErrorController.php on line 11
我知道问题是关于
$row=$this->createRow()代码。因为当我用
return$true
替换整个
createMember
方法的主体时,没有错误

更新:

这是我在Bootsreap.php中的
\u initAutoload()
。我应该添加一些东西来配置数据库吗

protected function _initAutoload()
{
    // Add autoloader empty namespace
    $autoLoader = Zend_Loader_Autoloader::getInstance();
    $autoLoader->registerNamespace('CMS_');
    $resourceLoader = new Zend_Loader_Autoloader_Resource(
        array ('basePath' => APPLICATION_PATH, 'namespace' => '', 
            'resourceTypes' => array (
                'form' => array ('path' => 'forms/', 
                    'namespace' => 'Form_' ), 
                'model' => array ('path' => 'models/', 
                    'namespace' => 'Model_' ) ) ));
    // Return it so that it can be stored by the bootstrap
    return $autoLoader;
}
第二次更新: 引发的异常是:


异常“Zend_Db_Adapter_exception”,消息为“SQLSTATE[HY000][2002]无法通过/usr/local/Zend/share/ZendFramework/library/Zend/Db/Adapter/Pdo/Abstract.php中的socket'/tmp/MySQL.sock'(2)”连接到本地MySQL服务器:138堆栈跟踪:#0/usr/local/Zend/share/ZendFramework/library/Zend/Adapter/Pdo/MySQL.php(96):Zend_Db_Adapter_Pdo_Abstract->_connect()php(156):zend_Db_Adapter_Pdo_Abstract->query('descripe
cms
…')4/usr/local/zend/share/ZendFramework/library/zend/Db/Table/Abstract.php(727):zend_Db_Adapter->_Mysql可描述('members','cms'))php(753):zend_Db_Table_Abstract->setupMetadata()#6/usr/local/zend/share/ZendFramework/library/zend/Db/Table/Abstract.php(1297):zend_Db_Table_Abstract->getCols()#7/var/www/project/application/models/Members/Members.php(33):zend_Db_Table_Table_Abstract,NULL,createRow,true)#8/var/www/project/application/controllers/MemberController.php(32):Model_Members->createMember('1','1','1','soroush)。rabiei@...“,NULL)#9/usr/local/zend/share/ZendFramework/library/zend/Controller/Action.php(512):MemberController->newAction()#10/usr/local/zend/share/ZendFramework/library/zend/Controller/Dispatcher/Standard.php(288):Zend_Controller_Action->dispatch('newAction')#11/usr/local/Zend/share/ZendFramework/library/Zend/Controller/Front.php(945):Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http)、Object(Zend_Controller_Response_Http))#12/usr/local/Zend/share/ZendFramework/ZendFramework/library/Zend/Application/Bootstrap/Bootstrap.php(77):Zend_Controller_Front->dispatch()#13/usr/local/Zend/share/ZendFramework/library/Zend/Application.php(328):Zend_Application_Bootstrap_Bootstrap->run()#14/var/www/project/public/index.php(26):Zend_Application->run()#15{main}

异常消息非常清楚:

exception 'Zend_Db_Adapter_Exception' with message 'SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)' in /usr/local/zend/share/ZendFramework/library/Zend/Db/Adapter/Pdo/Abstract.php:138
这意味着您的DB驱动程序试图通过位于服务器上/tmp/mysql.sock中的套接字连接到mysql,但找不到它

您有3种选择:

  • 配置mysql服务器(通过my.cnf)将其套接字放入/tmp。应该谨慎使用此选项,因为它会影响使用相同mysql实例的所有应用程序
  • 找到mysql将其套接字放在哪里,并编辑php.ini以指向该套接字。这个选项也必须小心使用,因为它对服务器上使用的每个php应用程序都有影响
例如: ; 在php.ini的[Pdo_mysql]部分下 pdo_mysql.default_socket=/mysql.sock

  • 将应用程序配置为通过套接字连接。这是一个PDO选项,应该传递给Zend#u Db#u适配器构造函数,如的示例7所述

该选项名为unix_socket,在php.net文档页面中有描述

您在第11行的ErrorController中使用的是什么类?它是不是
Zend\u Controller\u Plugin\u ErrorHandler::EXCEPTION\u NO\u ROUTE
?问题出在ErrorController中。修复该问题,您将看到模型抛出的错误。好的,我这样做了,现在结果是
出现错误应用程序错误
我将
resources.db.params.unix_socket=“/var/run/mysqld/mysqld.sock”
添加到Application.ini。谢谢