проблема с экземпляром php oop, pdo и ajax - PullRequest
0 голосов
/ 25 июня 2018

Я использую php oop с подключением pdo. Мне нужна помощь, как вызвать функцию из класса через AJAX

Например, допустим, я хочу вызвать printBooks по ajax

  1. класс - сущность книги:

    class Book{
        private $id;
        public function setID();
        public function getID();
        public function setName();
        public function getName();
    }
    
  2. класс - диспетчер книг:

    class book_controller{
        private  $books;
        private  $conn;
        public function __construct()
        {
            $database = new Database();
            $db = $database->dbConnection(); 
            $this->conn = $db;
        }
        public function getAllBooks(){
           $stmt = $conn->query("SELECT * FROM books");
           $stmt->execute();
           while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
              $b = new book();
              $b->setID($row['id']);
              $b->setName($row['name']);
              $this->books[] = $b;
            }
        }
        public function printBooks(){
          for($i=0; $i<sizeof($this->books);$i++){
            echo $this->books[$i]->getName();
        }
        }
    
  3. индексный файл

        <?php
              $bo = new book_controller();
              echo "<button id='callToprintBooks'>";
        ?>
    
  4. ajax call

        $.ajax({ 
                url:book_controller.php, 
                type: 'POST', 
                success : function( data ) { 
                    $('#DescModal').html(data); 
                    $('#DescModal').modal("show"); 
                } 
             });
    

Для простоты я хочу вызвать функцию printBooks при нажатии кнопки ajax из файла index.php после создания нового экземпляра book_controller. Я пытался сохранить переменную "$ bo" в сеансе, но получил ошибку

Вы не можете сериализовать или десериализовать экземпляры PDO в

Я пытался использовать вызов $ _GET, но я не хочу создавать новый экземпляр (потому что тогда мне нужно будет снова создать массив книг)

Надеюсь, мне удалось объяснить себя, чтобы вы могли мне помочь

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Создайте файл , такой как index.php , который вы называете новым классом book_controller ' getAllBooks () . Но в методе getAllBooks () в конце функции возвращает $ this-> books [] как JSON. Затем вы можете вызвать этот php-файл из AJAX и вернуть данные как JSON. Вы можете добавить в html с помощью функции each () jQuery

0 голосов
/ 27 июня 2018

getAllBooks:

public function getAllBooks(){
   $stmt = $conn->query("SELECT * FROM books");
   $stmt->execute();
   while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
      $b = new book();
      $b->setID($row['id']);
      $b->setName($row['name']);
      $this->books[] = $b;
    }
  return json_encode($this->books[]);
}

getBooks.php

$controller = new book_controller();
return $controller->getAllBooks();

frontend:

$.ajax({
  type: 'POST',
  url: 'getBooks.php'
  callback: function(data){
     $($.parseJSON(data.books)).each(function(key, value){
       $('#div').append(v.name);
     });
  }
});

Тогда вам нужно вернуть правильный ответ json в getAllBooksметод как:

{
  "books": [{
    {"id": 1, "name": "A"},
    {"id": 2, "name": "B"}
   }]
}
0 голосов
/ 25 июня 2018

Сначала общий обзор шагов, которые необходимо выполнить (примерно) для обработки HTTP-запросов:

  • Разбор каждого запроса через index.php .Файл index.php является точкой входа вашего приложения MVC.
  • Считайте путь URI из значения REQUEST_URI глобальной переменной $_SERVER и HTTP-метод из REQUEST_METHOD.
  • Сохраните их вместе со значениями других глобальных переменных ($ _POST, $ _GET и т. д.) в объект Request (например, экземпляркласса, названного, например, Request).
  • Получите роутер типа FastRoute и создайте свой список маршрутов - прочтите документацию, пожалуйста.Каждый маршрут определяется как объект с HTTP-методом , шаблоном и обработчиком (например, метод контроллера, например, action ) в качестве свойств.
  • Сравните компоненты запроса ( HTTP-метод и URI-путь из объекта Request) с компонентами каждого объекта маршрута ( HTTP-метод и pattern свойства) в списке маршрутов.
  • Если найдено совпадение, например, если компоненты запроса совпадают с компонентами запросазатем создайте экземпляр контроллера и вызовите его action , например, соответствующий обработчик маршрута .
  • Передайте объект Request в качестве аргумента, чтобы иметь возможностьчтобы прочитать из него значения POST, GET и т. д.
  • Контроллер action загружает соответствующий файл шаблона, отображает его содержимое и возвращает его.
  • Распечатывает возвращенное значениесодержимое (с echo [here the content string];).

Шаг 1:

Давайте теперь скажем, что ваш URL равен http://localhost/get-books, а метод HTTP - GET.И что в список маршрутов роутера вы добавили объект маршрута со следующими свойствами:

  • HTTP-метод: GET,
  • pattern: /get-books,
  • обработчик маршрута: book_controller::getAllBooks.

После обработки всех вышеперечисленных шагов напечатанный контент будет выглядеть примерно так:

index.php:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
        <meta charset="UTF-8" />
        <!-- The above 3 meta tags must come first in the head -->

        <title>Demo</title>

        <script src="https://code.jquery.com/jquery-3.2.1.min.js" type="text/javascript"></script>

        <script type="text/javascript">
            $(document).ready(function () {
                $('#printBooksButton').on('click', function () {
                    $.ajax({
                        /*
                         * This value ('/print-books') corresponds to a
                         * route definition in the predefined routes list.
                         */
                        url: '/print-books',
                        /*
                         * This value ('POST') corresponds to the HTTP method
                         * of a route definition in the predefined routes list.
                         */
                        method: 'POST',
                        dataType: 'html',
                        data: {},
                        success: function (response, textStatus, jqXHR) {
                            $('#books').html(response);
                        },
                        error: function (jqXHR, textStatus, errorThrown) {
                            alert('Error. Sorry!');
                            //...
                        },
                        complete: function (jqXHR, textStatus) {
                            //...
                        }
                    });
                });
            });
        </script>
    </head>
    <body>

        <form action="" method="post">
            <button type="button" id="printBooksButton" name="printBooksButton" value="printBooks">
                Print all books
            </button>
        </form>

        <div id="books">
            Here comes the books list.
        </div>

    </body>
</html>

Шаг 2:

В момент нажатия кнопки printBooksButton, выполняется запрос ajax и анализируется с броском index.php.Но на этот раз запрос имеет метод HTTP POST, а URL-адрес http://localhost/print-books.Исходя из того, что вы уже определили другой маршрут в списке маршрутов со следующими свойствами:

  • HTTP-метод: POST,
  • pattern: /print-books,
  • обработчик маршрута: book_controller::printBooks,

и что общие шаги в index.php обработаны, действие printBooks из book_controllerвыполнен.Но возвращенный контент не будет представлять всю структуру веб-страницы.Вместо этого это будет только HTML-код для представления списка книг.Этот HTML-код «принимается» обратным вызовом success запроса ajax в качестве аргумента response.Поэтому, наконец, он заполняется в div с идентификатором books.

<ul class="books-list">
    <li>Book 1</li>
    <li>Book 2</li>
    <li>Book 3</li>
    <li>Book 4</li>
</ul>

РЕДАКТИРОВАТЬ 1:

Примечание: В своем ответе я ранее предполагал, что вы реализуете приложение MVC.Позже, после того, как ваш вопрос отредактирован, я понял, что это может быть не на 100%.Но было слишком поздно (относительно позднего часа), чтобы я что-то изменил.Итак, ответьте мне на вопрос: все ли HTTP-запросы к вашему приложению перенаправлены только на одну страницу, например, на index.php?Я буду ждать ответа, и пока буду поддерживать предположение MVC для дальнейших объяснений.

Библиотека FastRoute играет роль так называемого router ,По сути, он делает две вещи:

  1. Он содержит коллекцию маршрутов - определенную пользователем.
  2. Предоставляет механизм маршрутизации .Например, отправляет URI .Например, сопоставляет компоненты запроса (например, HTTP-метод и URI-путь ) с компонентами каждого маршрута (например, HTTP-метод маршрута и шаблон ), чтобы ПРОСТО извлекать обработчик маршрута (который может быть строкой типа "controller :: action" , или замыкание и т. д.) и список параметров (например, карта имен заполнителей, как определено в шаблоне маршрута , к их значениям, заданным пользователем в URI ).

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

Все это происходит в одном файле, будь то index.php.Итак, ваш класс контроллера создается в index.php, ПОСЛЕ , маршрутизатор отправляет URI и возвращает имя контроллера, имя действия и список параметров.

В index.php также происходитсоздание соединения с базой данных (например, экземпляра PDO в вашем случае), которое должно быть передано в качестве аргумента конструктору контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...