我正在使用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为空 - 为什么会发生?
答案 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`");
.......
});