2012-01-01 156 views
2

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

在'pure'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 

PHP代码调用MySQL的函数:

// 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; 
+0

如果需要,您可以使用该框架内的“纯” PHP。我不使用任何框架数据库函数,它只是工作。 – Lobo 2012-01-02 09:47:38

+0

我其实不认为Zend对UDF有很大的支持。我有过UDF通过Zend调用导致奇怪的PHP错误的经验。但是,通过PHP的'mysqli'函数调用同一个UDF的工作。 – 2012-01-03 02:25:23

回答

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"); 
+0

比尔,非常感谢。所以它似乎是一个服务器问题。感谢您在调用存储函数时设置密钥的建议。 – 2012-01-03 10:48:23