代码之家  ›  专栏  ›  技术社区  ›  emeraldjava

改进zend存储过程调用代码

  •  3
  • emeraldjava  · 技术社区  · 16 年前

    我想知道如何改进调用存储过程的zend代码。目前我使用的是mysql数据库,下面控制器中的action函数可以工作,但看起来很糟糕。

    public function callSPAction()
    {
        $param = $this->_request->getParam('param', 0);
    
        $bootstrap = $this->getInvokeArg('bootstrap');
        $config = $bootstrap->getOptions();
    
        $mysqli = new mysqli(
            $config['resources']['db']['params']['host'],
            $config['resources']['db']['params']['root']['username'],
            $config['resources']['db']['params']['root']['password'],
            $config['resources']['db']['params']['dbname']);
    
        $rs = $mysqli->query(sprintf('CALL mystoredprocedure(%d)',$param));
        if(mysqli_error($mysqli))
        { 
            throw new exception(mysqli_error($mysqli), mysqli_errno($mysqli)); 
        } 
        $this->_helper->redirector('index', 'index');
    }
    

    我更喜欢使用zend_db类来调用存储过程,但我不确定如何才能做到这一点?

    因为我调用了许多存储过程,所以我认为最好创建一个helper类来包装连接到数据库的逻辑。它将公开包装底层存储过程的方法。我的控制器代码可以直接调用

    StoredProcedureHelper::callMyStoredProdecure($this->_request->getParam('param', 0);
    

    这是可能的,甚至是推荐的?

    1 回复  |  直到 11 年前
        1
  •  3
  •   The Doge Prince falomir    11 年前

    我希望您使用模型来访问数据。另外,我建议您在应用程序的配置文件中定义db适配器,使其对应用程序代码透明,并使用pdo使应用程序不与特定的db管理器绑定,以防将来需要指向不同的数据库。

    例如,与其在控制器的操作中包含所有的数据访问逻辑,还可以简化为:

    //within some controller action
    $model = MyUbberCoolSuperModel();
    $model->myUbberCoolMethod($params);
    
    //And in your model, which can extend Zend_Db_Table_Abstract
    public function myUbberCoolMethod($params)
    {
       $pdo = $this->getAdapter()->prepare("CALL myProcedure(:param)");
       $pdo->bindParam(':param', $param, PDO::PARAM_STR); 
       $pdo->execute();
       // Any additional logic you might want to do
    }
    

    我认为这样更清楚,您的控制器只负责调用模型上的方法,但是模型处理数据访问。因此,如果与数据访问相关的任何内容需要重构、更改或其他内容,那么您就知道必须转到哪个模型,而不是更改可能影响任何其他内容的任何控制器操作。

    希望有帮助;)

    干杯。

    推荐文章