2012-01-01 128 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