Slim + PHP + MySQLi: Исключение: идентификатор «select * from users» не определен - PullRequest
0 голосов
/ 04 сентября 2018

Это мой файл db_david.php:

<?php

    $app->get('/db', function() {
        require_once 'connection.php';

        $query = "select * from users";
        $result = $mysqli->query($query);

        while($row = $this->$query->fetch_aasoc()){
            $data[] = $row;
        }

        echo json_encode($data);
    });
?>

Это содержимое файла connection.php:

  <?php
        $host = "localhost";
        $user = "root";
        $pass = ".....";
        $db_name = "....";

        $mysqli = new mysqli($host, $user, $pass, $db_name);
    ?>

Это содержимое index.php:

<?php

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require '../libs/vendor/autoload.php';

$app = new \Slim\App(['settings' => ['displayErrorDetails' => true]]);

require_once '../include/db_david.php'; 
$app->run();


?>

Я получаю Slim Application Error. Приложение не может быть запущено из-за следующей ошибки:

Type: Slim\Exception\ContainerValueNotFoundException
Message: Identifier "select * from users" is not defined.
File: /opt/lampp/htdocs/task_manager/libs/vendor/slim/slim/Slim/Container.php
Line: 120

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Вы извлекаете данные совершенно неверным образом ...

$query = "select * from users";
$result = $mysqli->query($query);

while($row = $result->fetch_assoc()){   // Fetch the value from the result
    $data[] = $row;
}

Также обратите внимание на опечатку fetch_aasoc()

0 голосов
/ 04 сентября 2018

Я бы предложил другой подход - использовать контейнер зависимостей Slim.

Идея состоит в том, чтобы зарегистрировать в контейнере функцию, которая будет возвращать экземпляр объекта соединения вашему приложению.

Ниже приведен краткий пример

<?php

use Slim\App;
use Slim\Container;
use Slim\Http\Request;
use Slim\Http\Response;

require_once("../vendor/autoload.php");

// create your slim application with a dependency container
$app = new App( new Container );

// get the container
$container = $app->getContainer();

// add a function that returns instance of dependency
$container['database'] = function($container) {

    return new \mysqli('localhost', 'root', '', 'yourdbname');

};

$app->get('/', function(Request $req, Response $res, $args){

    $query = $this->database->query("select * from table");
    // do something with the result

});

Огромным преимуществом этого подхода является то, что вам не нужно больше файлов внутри ваших маршрутов. Представьте, что если вы переместите этот файл connection.php, вам нужно будет обновить много кода, и при таком подходе вам придется только связываться с фабрикой.

Настоятельно рекомендуем вам прочитать следующее https://www.slimframework.com/docs/v3/concepts/di.html

0 голосов
/ 04 сентября 2018

Первый взгляд, в свойстве запроса есть опечатка

$this->$query->fetch_assoc()){ 

Должно быть

$this->query->fetch_assoc()){
...