Slim 框架,无法从控制器到达容器内的 pdo sql 服务器连接
Slim framework, cannot reach pdo sql server connection that is inside a container from a controller
在我的 app.php 中,我设置了一个容器,用于配置数据库连接:
$container['db'] = function ($c) {
$db = $c['settings']['db'];
$pdo = new PDO("sqlsrv:Server=" . $db['host'] . ";Database=" . $db['dbname'], $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT));
return $pdo;
};
并指定路由和控制器相关信息:
$container['CourseController'] = function($container)
{
return new \App\Controllers\CourseController($container);
};
require __DIR__ . '/../app/routes.php';
在我的routes.php中,我只有一条路线:
<?php
$app->get('/courses', 'CourseController:getAll');
及以下是我的 Controller.php 和课程Controller.php 类:
<?php
namespace App\Controllers;
class Controller
{
protected $container;
public function __construct($container)
{
$this->container = $container;
}
}
<?php
namespace App\Controllers;
class CourseController extends Controller
{
public function getAll($request, $response)
{
try
{
$statement = $this->container->db->prepare("SELECT * FROM Course");
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
$response->getBody()->write(json_encode($results));
return $response;
}
catch(PDOException $e)
{
print $e->getMessage();
}
}
}
我收到 500 错误并且无法找到问题所在。这是我目前所知道的:
- 我连接到我的数据库没有任何问题;如果我把我的
app.php 中的路由代码我能够检索我的结果
查询。
- 我正在将容器传递给我的控制器。通过在我的控制器上使用 var_dump($this->container) 我发现容器没问题。
- var_dump($this->container->db) 虽然是空的。因此,我假设 pdo 对象未通过或连接丢失。
- 我试过这个建议无济于事:"The sqlsrv extension will fail to connect when using error mode PDO::ERRMODE_EXCEPTION (default). To connect, you will need to explicitly pass array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING) (or PDO::ERRMODE_SILENT) into the constructor, or override the getDefaultOptions() method when using sqlsrv." 来自 https://github.com/FaaPz/Slim-PDO
有没有一种方法可以让我使用容器将我的 pdo 连接正确地传递到我的控制器,而不是获得 500?如果这不可能,我也愿意接受其他解决方案。
500 错误表示发生了 PHP 错误。
首先更改您的 PDO 实例化以启用错误:
$pdo = new PDO(
"sqlsrv:Server=" . $db['host'] . ";Database=" . $db['dbname'],
$db['user'],
$db['pass'],
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);
要直接查看错误,请更新您的 Slim 设置以启用错误显示:
$config = [
'settings' => [
'displayErrorDetails' => true,
],
];
$app = new Slim\App();
您现在应该会看到显示的错误。或者查看 PHP 错误日志,您应该会在那里看到它。
你得到 500 是因为在你的 CourseController.php 文件中,PHP 试图在 App\Controllers 命名空间下找到 PDO class。
您必须使用前导反斜杠来指示 PDO 是全局的 class:
$results = $statement->fetchAll(\PDO::FETCH_ASSOC);
在我的 app.php 中,我设置了一个容器,用于配置数据库连接:
$container['db'] = function ($c) {
$db = $c['settings']['db'];
$pdo = new PDO("sqlsrv:Server=" . $db['host'] . ";Database=" . $db['dbname'], $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT));
return $pdo;
};
并指定路由和控制器相关信息:
$container['CourseController'] = function($container)
{
return new \App\Controllers\CourseController($container);
};
require __DIR__ . '/../app/routes.php';
在我的routes.php中,我只有一条路线:
<?php
$app->get('/courses', 'CourseController:getAll');
及以下是我的 Controller.php 和课程Controller.php 类:
<?php
namespace App\Controllers;
class Controller
{
protected $container;
public function __construct($container)
{
$this->container = $container;
}
}
<?php
namespace App\Controllers;
class CourseController extends Controller
{
public function getAll($request, $response)
{
try
{
$statement = $this->container->db->prepare("SELECT * FROM Course");
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
$response->getBody()->write(json_encode($results));
return $response;
}
catch(PDOException $e)
{
print $e->getMessage();
}
}
}
我收到 500 错误并且无法找到问题所在。这是我目前所知道的:
- 我连接到我的数据库没有任何问题;如果我把我的 app.php 中的路由代码我能够检索我的结果 查询。
- 我正在将容器传递给我的控制器。通过在我的控制器上使用 var_dump($this->container) 我发现容器没问题。
- var_dump($this->container->db) 虽然是空的。因此,我假设 pdo 对象未通过或连接丢失。
- 我试过这个建议无济于事:"The sqlsrv extension will fail to connect when using error mode PDO::ERRMODE_EXCEPTION (default). To connect, you will need to explicitly pass array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING) (or PDO::ERRMODE_SILENT) into the constructor, or override the getDefaultOptions() method when using sqlsrv." 来自 https://github.com/FaaPz/Slim-PDO
有没有一种方法可以让我使用容器将我的 pdo 连接正确地传递到我的控制器,而不是获得 500?如果这不可能,我也愿意接受其他解决方案。
500 错误表示发生了 PHP 错误。
首先更改您的 PDO 实例化以启用错误:
$pdo = new PDO(
"sqlsrv:Server=" . $db['host'] . ";Database=" . $db['dbname'],
$db['user'],
$db['pass'],
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);
要直接查看错误,请更新您的 Slim 设置以启用错误显示:
$config = [
'settings' => [
'displayErrorDetails' => true,
],
];
$app = new Slim\App();
您现在应该会看到显示的错误。或者查看 PHP 错误日志,您应该会在那里看到它。
你得到 500 是因为在你的 CourseController.php 文件中,PHP 试图在 App\Controllers 命名空间下找到 PDO class。
您必须使用前导反斜杠来指示 PDO 是全局的 class:
$results = $statement->fetchAll(\PDO::FETCH_ASSOC);