Внутренняя ошибка сервера GraphQL при настройке PHP/MySQL с использованием пользовательских моделей – нужна помощьPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Внутренняя ошибка сервера GraphQL при настройке PHP/MySQL с использованием пользовательских моделей – нужна помощь

Сообщение Anonymous »

Я работаю над серверным проектом, использующим PHP (v7.4) и MySQL для реализации GraphQL. Проект является частью задания, и от меня требуется следовать определенным рекомендациям, таким как использование объектно-ориентированных принципов (ООП) без фреймворков и обеспечение интеграции MySQLi. У меня возникла внутренняя ошибка сервера при запросе конечной точки GraphQL, и я попробовал несколько исправлений, но не смог ее устранить.
Каждый раз, когда я запускаю GraphQL запрос на получение продуктов и категорий, я получаю следующий ответ:
{
"errors": [
{
"message": "Internal server error",
"locations": [
{
"line": 1,
"column": 3
}
],
"path": [
"categories"
]
},
{
"message": "Internal server error",
"locations": [
{
"line": 1,
"column": 26
}
],
"path": [
"products"
]
}
],
"data": {
"categories": null,
"products": null
}
}

Я проверил журналы ошибок, но там не так много полезной информации, кроме общих внутренних ошибок сервера.
Контекст кода:
упрощенная модель продукта:
р>
namespace App\Model;

use App\Database\DBConnection;

abstract class Product {
private $db;
protected $id, $name, $inStock, $description, $category_id, $brand;

public function __construct($id, $name, $inStock, $description, $category_id, $brand) {
$dbConnection = new DBConnection();
$this->db = $dbConnection->getConnection();
}

public function save() {
$stmt = $this->db->prepare("INSERT INTO products (id, name, inStock, description, category_id, brand) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssisss", $this->id, $this->name, $this->inStock, $this->description, $this->category_id, $this->brand);
$stmt->execute();
$stmt->close();
}

public static function getAll() {
$dbConnection = new DBConnection();
$conn = $dbConnection->getConnection();

if (!$conn) {
error_log("Database connection is null in Product::getAll");
return null;
}

$sql = "SELECT * FROM products";
$result = $conn->query($sql);

if ($result === false) {
error_log("Query failed in Product::getAll: " . $conn->error);
return null;
}

return $result->fetch_all(MYSQLI_ASSOC);
}
}

graphql и настройка схемы:
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\Type\Schema;
use App\Model\Category;
use App\Model\Product;

class GraphQL {
static public function handle() {
$categoryType = new ObjectType([
'name' => 'Category',
'fields' => [
'id' => Type::int(),
'name' => Type::string(),
]
]);

$productType = new ObjectType([
'name' => 'Product',
'fields' => [
'id' => Type::string(),
'name' => Type::string(),
'inStock' => Type::int(),
'description' => Type::string(),
'category_id' => Type::int(),
'brand' => Type::string(),
]
]);

$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'categories' => [
'type' => Type::listOf($categoryType),
'resolve' => function () {
$categories = Category::getAll();
if (!$categories) {
return null;
}
return $categories;
}
],
'products' => [
'type' => Type::listOf($productType),
'resolve' => function () {
$products = Product::getAll();
if (!$products) {
return null;
}
return $products;
}
]
]
]);

$schema = new Schema(['query' => $queryType]);

$input = json_decode(file_get_contents('php://input'), true);
$query = $input['query'];
$variableValues = $input['variables'] ?? null;

$result = \GraphQL\GraphQL::executeQuery($schema, $query, null, null, $variableValues);
$output = $result->toArray();

return json_encode($output);
}
}

Класс DBConnection:
namespace App\Database;

use mysqli;

class DBConnection {
private $connection;

public function __construct() {
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "shopbase";

$this->connection = new mysqli($servername, $username, $password, $dbname);

if ($this->connection->connect_error) {
die("Connection failed: " . $this->connection->connect_error);
}
}

public function getConnection() {
return $this->connection;
}

public function close() {
$this->connection->close();
}
}

Ошибки обработки запросов:
'resolve' => function () {
try {
$products = Product::getAll();
if (!$products) {
throw new \Exception("Products query returned null");
}
return $products;
} catch (\Exception $e) {
error_log('Error in products resolve: ' . $e->getMessage());
return null;
}
}

Что я пробовал:
1 — Проверка соединений с базой данных: я подтвердил, что класс DBConnection работает, и я могу без ошибок подключиться к базе данных MySQL.2- Запросы напрямую в MySQL: запросы (SELECT * FROM продукты) отлично работают в терминале MySQL.
3-Добавление регистрации ошибок: я добавил вызовы error_log для регистрации проблем с подключением и запросами, но я все еще вижу «Внутренняя ошибка сервера» без подробного вывода журнала.
4- Скорректированная логика преобразователя GraphQL: убедитесь, что функции разрешения для категорий и продуктов улавливают исключения, но все равно выдает ту же ошибку.
5-пробовано использовать пакет fastroute с изменениями в файле htaccess и файле httpd из apache (я использую xampp), и это было совсем не здорово :)
Вопрос:
Что может быть причиной этих внутренних ошибок сервера GraphQL? Что-то не так в том, как я обрабатываю подключения к базе данных в настройке GraphQL или в том, как я структурирую запросы?
Будем очень признательны за любые идеи и предложения! Заранее спасибо.
Я действительно очень плачу о помощи в этот момент, я так долго решал эту проблему, и крайний срок - 20 дней, я схожу с ума, я не могу закончить ее, поэтому, пожалуйста, помогите//update : thanks to the comments i opened every single error log and the last log i got from the internal server error thing is :[20-Sep-2024 17:21:52 Europe/Berlin] Variables: null
[20-Sep-2024 17:21:52 Europe/Berlin] Before executeQuery
[20-Sep-2024 17:21:52 Europe/Berlin] After executeQuery
[20-Sep-2024 17:21:52 Europe/Berlin] After executeQuery
[20-Sep-2024 17:21:54 Europe/Berlin] Starting handle function
[20-Sep-2024 17:21:54 Europe/Berlin] Query: "query {\r\n products {\r\n id\r\n name\r\n inStock\r\n description\r\n category_id\r\n brand\r\n }\r\n}\r\n"
[20-Sep-2024 17:21:54 Europe/Berlin] Variables: null
[20-Sep-2024 17:21:54 Europe/Berlin] Before executeQuery
[20-Sep-2024 17:21:54 Europe/Berlin] Fetching products from database
[20-Sep-2024 17:21:54 Europe/Berlin] After executeQuery
// that means the excuteQuery is working , i edited the graphql handle() method to log me the errors if the method itself dont work .

//here is updated graphql :


Подробнее здесь: https://stackoverflow.com/questions/790 ... ls-need-as
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»