【问题标题】:php oop, pdo and ajax instance issuephp oop、pdo 和 ajax 实例问题
【发布时间】:2018-12-03 12:50:03
【问题描述】:

我正在使用带有连接 pdo 的 php oop。 我需要帮助如何通过 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 函数。 我试图在会话中保存 var "$bo" 但出现错误

您不能在

中序列化或反序列化 PDO 实例

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

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

【问题讨论】:

  • getAllBooks 是完全无效的代码
  • 对,我写的是一个例子。我已经更新了函数
  • 您希望如何显示书籍以及如何获取它们?通过 AJAX?
  • 我想在按钮点击时打开一个模式。这是我的 ajax 代码: $.ajax({ url:book_controller.php, type: 'POST', success : function( data ) { $('#DescModal').html(data); $('#DescModal') .modal("show"); } });正如我所说,我不知道如何调用函数 printBook()。我尝试设置 url: book_controller.php?sendprint=1 并通过 $_GET['sendprint'] 调用该函数,但后来我回到起点,需要创建 book_controller 的新实例

标签: php ajax oop pdo


【解决方案1】:

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】:

    首先,对处理 HTTP 请求的(大致)步骤进行概述:

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

    第 1 步:

    现在假设您的网址是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 中的一般步骤,执行book_controller动作 printBooks。但返回的内容并不代表整个网页结构。相反,它只是表示书籍列表的 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方法模式),以便只提取路由处理程序(可以可以是 "controller::action" 之类的字符串,或闭包等)和参数列表(例如占位符名称的映射,如路由的 pattern 中定义的,到它们的值,由用户在 URI 中给出)。

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

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

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

    【讨论】:

    • 感谢您的解释。其实我对fastroute不熟悉,没看懂,fastroute是一种通过http方式和模式调用类函数的开关?我需要在哪里创建 book_controller 实例?我需要将对象传递给 fastroute 吗?
    • @thinkp 欢迎您。我用一个问题和新的澄清解释编辑了我的答案。请参阅“编辑 1”。
    • @thinkp 我正在等待我的问题的答案。既然你没有回答,那你解决问题了吗?
    【解决方案3】:

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

    附加到 html

    【讨论】:

    • 让我说我将 getAllBooks 更改为返回 json。在 index.php 我有变量 $b = new book_controller()。我不明白我从哪里调用 getAllBooks 函数
    • 你的意思是在index.php文件中调用getAllBooks吗? ajax 会调用 index.php 吗?所以每次点击 ajax 都会调用 index.php 为每次调用创建一个新实例
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2016-01-08
    • 2011-05-07
    • 2011-09-11
    • 2013-03-12
    相关资源
    最近更新 更多