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

标签 php mysql zend-framework

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

在“纯”php 应用程序中,以下代码有效 - 使用 mysqli 数据库连接(不是 mysql)。然而在 Zend 框架中,这段代码不会导致应用程序错误,但也不会将结果绑定(bind)到 php 变量。

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

我看过以前的问题,但它们侧重于存储过程(例如 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;

最佳答案

我刚刚使用您的示例存储函数进行了测试。我运行了以下代码并且运行良好。我在 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");

关于php - 在 Zend Framework 中调用 MYSQL 存储函数(不是存储过程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694374/

相关文章:

mysql - 如何检查数据是否插入数据库

php - 具有 zend 框架、操作堆栈的模块化网站

java - 自动从数据库中获取URL

mysql - 为 MySQL 选择数据类型?

php - 无法在 Zend 中的分支文件夹之间执行 JOIN

javascript - 禁用 JavaScript 中的布局

PHP-Mysql 使用 Closure 表以分层结构存储和显示数据

php - 以编程方式将 DOC/DOCX 转换为 PDF

php - eZ Publish 6 (eZPlatform) 连接问题

PHP:调用未定义的函数 mb_strlen() - 在启用了 mbstring 的自定义编译的 PHP 上