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

Run MySQL query from external script with Slim Framework

我正在使用 Slim Framework 创建 REST API。 在我的 mysql 数据库中也有 table,我在其中存储有关对服务器的每个请求的信息。

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

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

如果我 运行 这个脚本 - 新记录被添加到我的 table。但是当我 运行 它使用 Slim

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

    log_request();
});

我收到这个错误

Call to a member function query() on null

所以 log_request() 中的 $mysqli 为 null - 为什么会这样?

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

通过将 dbconnect 文件包含在另一个函数中,您可以有效地将其变量限定在该块范围内。您可以简单地删除 global 关键字,代码应该可以工作。

如 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->运行();

之前添加这段代码
// 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`");
    .......
});