从 Slim 框架调用 Mysql 函数

Posted

技术标签:

【中文标题】从 Slim 框架调用 Mysql 函数【英文标题】:Call Mysql function from Slim Framework 【发布时间】:2015-12-14 21:50:36 【问题描述】:

我正在尝试使用 Slim 框架调用我在 mysql 中创建的函数。 这是我在 DBHandler.php 中的函数:

public function validarSincronismo($pCnpj, $pLogin, $pImei)
    $stmt = $this->conn->prepare("SELECT sincronizar(?,?,?)");
    $stmt->bind_param("sss", $pCnpj, $pLogin, $pImei);
    $result = $stmt->execute();
    $stmt->close();
    return $result;

这是我的 index.php 中的函数:

$app->post('/validar', function() use ($app) 
    $db = new DbHandler();
    $cnpj =    $app->request->post('cnpj');    
    $login = $app->request->post('login');
    $imei = $app->request->post('imei');
    $msg = $db->validarSincronismo($cnpj, $login, $imei);                 
    $response["error"] = false;
    $response["message"] = $msg;
    echoRespnse(201, $response);
);

我在phperror.log 中收到以下错误:

[17-Sep-2015 21:12:37 UTC] PHP Fatal error:  Call to a member function execute() on boolean in C:\MAMP\htdocs\test\include\DbHandler.php on line 69

我尝试使用CALL sincronizar(?,?,?);,但它不执行SQL函数。

【问题讨论】:

嘿@Tiago,欢迎来到 S.O.当您直接在数据库中执行该查询时,该查询是否正确运行?您是否尝试过调试$stmt var 的内容?您可以在声明行之后添加var_dump($stmt) 来执行此操作。顺便说一句,我假设您使用的是 MySQLi,对吗? sincronizar 是函数、表还是过程? @NorbertvanNobelen sincronizar() 是一个返回 char(50) 的函数。 嗨@GustavoStraube,是的,我正在使用MySQLi。我尝试按照您的建议调试 $stmt var 的内容,它返回一个 bool(false)。如果我在调用我的 SQL 函数时将 SQL 语句更改为 CALL sincronizar() 而不是 SELECT sincronizar(),它将返回以下内容:object(mysqli_stmt)#40 (10) ["affected_rows"]=> int(0) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(3) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) "error":false,"message":false @TiagoPires,我认为您必须在查询中将SELECT 替换为CALL。之后,你如何检查函数是否正在执行?你的功能是做什么的?它是否会更改您表中的某些数据? 【参考方案1】:

感谢@GustavoStraube 和@NorbertvanNobelen 花时间调查我的问题!我能够使用SELECT sincronizar() 调用我的SQL 函数。问题是我在错误的数据库中创建了函数。我的错! :/

所以我的最终和工作代码如下所示:

DBHandler.php 中的函数

public function validarSincronismo($pCnpj, $pLogin, $pImei)
    $stmt = $this->conn->prepare("SELECT sincronizar(?,?,?)");
    $stmt->bind_param("sss", $pCnpj, $pLogin, $pImei);
    $stmt->execute();
    $stmt->bind_result($result);
    $stmt->fetch();
    $stmt->close();
    // Returns a message
    return $result;
   

index.php 中的函数

$app->post('/validar', function() use ($app) 
            $db = new DbHandler();
            $cnpj = $app->request->post('cnpj');    
            $login = $app->request->post('login');
            $imei = $app->request->post('imei');
            $msg = $db->validarSincronismo($cnpj, $login, $imei);                 
            $response["error"] = false;
            $response["message"] = $msg;
            echoResponse(201, $response);
        );

【讨论】:

以上是关于从 Slim 框架调用 Mysql 函数的主要内容,如果未能解决你的问题,请参考以下文章

搭建迁移训练Slim框架环境

搭建迁移训练Slim框架环境

Slim 框架总是返回 404 错误

如何在 tensorFlow 中重用 slim.arg_scope?

angular2 与 Slim 框架 jwt 身份验证

在 Slim 框架上发布请求