php oop,pdo和ajax实例问题

时间:2018-06-25 00:52:14

标签: php ajax oop pdo

我正在将php oop与pdo连接使用。 我需要帮助,如何通过Ajax从类中调用函数

例如,假设我要通过ajax调用printBooks

  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通话

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

为简单起见,在创建新的book_controller实例后,我想通过index.php文件中的ajax单击按钮来调用printBooks函数。 我试图在会话中保存变量“ $ bo”,但出现错误

  

您不能在其中序列化或反序列化PDO实例

我尝试使用$ _GET调用,但是我不想创建一个新实例(因为那样,我将需要再次构建book数组)

我希望我能够自我解释,以便您可以帮助我

3 个答案:

答案 0 :(得分:0)

创建文件如index.php ,您将其称为新的book_controller类的 getAllBooks()方法。但是在函数末尾的 getAllBooks()方法中,将$ this-> books []作为JSON返回。然后,您可以从AJAX调用此php文件,并以JSON形式返回数据。您可以使用jQuery的 each()函数

附加到html

答案 1 :(得分:0)

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();

前端:

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

然后您要做的就是在getAllBooks方法中返回正确的json响应,例如:

{
  "books": [{
    {"id": 1, "name": "A"},
    {"id": 2, "name": "B"}
   }]
}

答案 2 :(得分:-1)

首先,概述(大致)用于处理HTTP请求的步骤:

  • 通过 index.php 解析每个请求。文件 index.php 是您的MVC应用程序的入口点。
  • REQUEST_URI全局变量的$_SERVER值读取 URI路径,从REQUEST_METHOD读取 HTTP方法。 / li>
  • 将它们与其他全局变量($ _POST,$ _ GET等)的值一起保存到Request对象(例如,名为Request的类的实例)中。
  • 获取一个像FastRoute这样的路由器并建立您的路由列表-请阅读文档。每个路由都定义为具有 HTTP方法模式 handler 的对象(例如,控制器方法,例如操作)作为属性。
  • 将请求组件(来自Request对象的 HTTP方法 URI路径)与每个路由对象( HTTP方法 pattern 属性)。
  • 如果找到匹配项,例如如果请求组件与路由组件相同,则创建一个控制器实例并调用其 action ,例如相应的路线 handler
  • 传递Request对象作为参数,以便能够从中读取POST,GET等值。
  • 控制器 action 加载相应的模板文件,呈现其内容,然后将其返回。
  • 打印返回的内容(带有echo [here the content string];)。

步骤1:

现在让我们说您的URL为http://localhost/get-books,而HTTP方法为GET。而且,在路由器的路由列表中,您添加了具有以下属性的路由对象:

  • HTTP方法:GET
  • 模式:/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
  • 模式:/print-books
  • 路由处理程序:book_controller::printBooks

并处理了index.php中的常规步骤,则执行printBooks中的 action book_controller。但是返回的内容不会代表整个网页结构。相反,它将仅是表示图书清单的html代码。该html代码被ajax请求的success回调作为response参数“接收”。因此,最后,它以id books填充到div中。

<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库具有所谓的 路由器 的作用。它本质上做两件事:

  1. 拥有由用户定义的一组路由
  2. 它提供了 路由机制 。例如。它 发送URI 。例如。它 与每个请求的组成部分(例如, HTTP方法 URI路径)进行匹配路由(例如,路由的 HTTP方法 pattern ),以便 仅提取路由处理程序 (可以可以是“ controller :: action” 之类的字符串,也可以是闭包等)<​​strong> 和参数列表 (例如,占位符名称的映射, (按照路由的模式中的定义)为其值(由用户在 URI 中给出)。

因此,路由器不会(也不应该)调用任何控制器动作,而只是从匹配的路由对象的 handler 属性中提取它。基于这个控制器动作定义,您(开发人员)必须实例化控制器,调用动作(还将参数列表中的值作为动作参数传递),并将此调用的结果打印给用户。

所有这些事情都在一个文件中发生,可能是index.php。因此,您的控制器类在index.php中实例化,之后,路由器将分派URI并返回控制器名称,操作名称和参数列表。

index.php中还会发生数据库连接(例如您的情况下的PDO实例)的创建,该连接应作为参数传递给控制器​​构造函数。