使用Slim Framework从外部脚本运行MySQL查询

时间:2017-10-18 11:45:48

标签: php rest slim

我正在使用Slim Framework来创建REST API。 我的mysql数据库中还有一个表,我将每个请求的信息存储到服务器。

我有一个名为functions.php的单独文件,其中我有log_request()函数

require_once('dbconnect.php');
function log_request() {
    global $mysqli;
    $query = "INSERT INTO log_table (....) VALUES (...) ";
    $mysqli->query($query); 
}

如果我运行此脚本 - 我的表中会添加新记录。但是当我使用Slim

运行它时
$app->get('/api/something', function($request, $response) {
    require_once('dbconnect.php');
    include_once('functions.php');

    log_request();
});

我收到此错误

  

在null

上调用成员函数query()

因此log_request()中的$ mysqli为空 - 为什么会发生?

2 个答案:

答案 0 :(得分:1)

因为$mysqli;不在全局范围内。你正在采用各种不良做法。重构您的代码以利用先进的Slim PHP功能,例如Dependency Container或依赖注入。

通过将dbconnect文件包含在另一个函数中,您已将其变量有效地限定为该块作用域。您只需删除global关键字,代码即可运行。

答案 1 :(得分:0)

正如Scriptonomy所提到的 - 为了使用MySQL或准备,管理和注入应用程序依赖项,我们应该使用依赖容器。

https://www.slimframework.com/docs/v3/concepts/di.html

第1步

创建dependencies.php文件

// DIC configuration
$container = $app->getContainer();

$container['db'] = function ($c) {
    $host    = "localhost";
    $user    = "user";
    $pass    = "password";
    $db_name = "database_name";
    $mysqli  = new mysqli($host, $user, $pass, $db_name);
    return $mysqli;
};

第2步

在$ app-> run();

之前添加此代码
// Set up dependencies
require __DIR__ . '/../app/dependencies.php';

第3步

现在你可以使用mysql(或任何其他注入)

$app->post('foo', function ($request, $response, $args) {
    $res = $this->db->query("SELECT * FROM `app_jobs`");
    .......
});