在Zend Framework中调用MYSQL存储函数(不是存储过程)

时间:2012-01-01 17:19:40

标签: php mysql zend-framework

有没有办法在Zend Framework中调用MySQL存储函数(不是过程)?或者围绕框架使用未经过滤的PHP代码?

在'纯'php应用程序中,以下代码可以正常工作 - 使用mysqli db连接(不是mysql)。但是在Zend框架中,此代码不会导致应用程序错误,但也不会将结果绑定到php变量。

如果使用Zend_Db适配器,我无法找到将函数的结果绑定到变量(从而得到答案 - 没有Zend_Db方法等效于'bind_result')。

我查看了以前的问题,但他们关注的是存储过程(例如How can I use a stored procedure in a MySql database with Zend Framework?)。

感谢。

更新:自写作以来,我发现在MAMP上MYSQL可以正常工作,但在Mac上的Zend Server CE上没有MYSQL。

MySQL存储功能:

CREATE FUNCTION GetUserAccountType(
inUsername  VARCHAR(50)
) RETURNS INT(3)
BEGIN
    SELECT AccountType_i INTO @retVal FROM UserTable WHERE Username_vc = inUsername;
    RETURN @retVal;
END;
GO

调用MySQL函数的Php代码:

// open mysqli connection with db
$my_db = new mysqli($db_hostname, $db_username, $db_password, $db_database);

//  Prepare MySQL function ($userName is a string)

$stmt=$my_db->prepare("SELECT GetUserAccountType(?)") or die($my_db->error); 
$stmt->bind_param('s', $userName) or die($stmt->error);
$stmt->execute() or die($stmt->error); 
$stmt->bind_result($result);   
$stmt->fetch();

// (in php the $result variable  is now set as the result of the MySQL function, @retVal.
// In Zend framework, the $result variable is set to FALSE)
return $result;

1 个答案:

答案 0 :(得分:1)

我刚刚使用您的示例存储函数进行了测试。我运行以下代码,它工作正常。我在Mac OS X上使用PHP 5.3.6,连接到CentOS 6 Linux上的Percona Server 5.5.18实例。

<?php

set_include_path(get_include_path() . ":ZendFramework-1.11.10/library");

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();

$db = Zend_Db::factory('pdo_mysql', ...); 

// test that I can read the table directly
print_r($db->query("SELECT * FROM UserTable")->fetchAll());

// test that I can fetch from a stored function
$stmt = $db->prepare("SELECT GetUserAccountType(?)");
$stmt->execute(array("default"));
print_r($stmt->fetchAll());

请注意,结果集使用完整表达式作为键返回 所以我的print_r输出以下内容:

Array
(
    [0] => Array
        (
            [GetUserAccountType('default')] => 42
        )

)

如果您想要一个更传统的密钥,您应该为该列添加别名 例如:

$stmt = $db->prepare("SELECT GetUserAccountType(?) AS AccountType_i");