我正在将php oop与pdo连接使用。 我需要帮助,如何通过Ajax从类中调用函数
例如,假设我要通过ajax调用printBooks
类-实体书:
class Book{
private $id;
public function setID();
public function getID();
public function setName();
public function getName();
}
类-控制器书籍:
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();
}
}
索引文件
<?php
$bo = new book_controller();
echo "<button id='callToprintBooks'>";
?>
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数组)
我希望我能够自我解释,以便您可以帮助我
答案 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请求的步骤:
REQUEST_URI
全局变量的$_SERVER
值读取 URI路径,从REQUEST_METHOD
读取 HTTP方法。 / li>
Request
对象(例如,名为Request
的类的实例)中。 Request
对象的 HTTP方法和 URI路径)与每个路由对象( HTTP方法和 pattern 属性)。Request
对象作为参数,以便能够从中读取POST,GET等值。echo [here the content string];
)。现在让我们说您的URL为http://localhost/get-books
,而HTTP方法为GET
。而且,在路由器的路由列表中,您添加了具有以下属性的路由对象:
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>
在单击按钮printBooksButton
时,将执行ajax请求并将其解析为抛出index.php
。但是这次,请求具有HTTP方法POST
,URL为http://localhost/print-books
。从您已经使用以下属性在路线列表中定义了另一条路线开始:
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>
注意:在我的回答中,我先前认为您正在实现MVC应用程序。稍后,在您的问题进行编辑后,我意识到情况可能并非100%。但是我改变任何东西都为时已晚(相对于延迟时间)。因此,请回答我一个问题:是否将对您应用程序的所有HTTP请求都重定向到仅一页,例如到index.php
?我将等待答案,现在,我将维持我的MVC假设以进行进一步的解释。
FastRoute库具有所谓的 路由器 的作用。它本质上做两件事:
因此,路由器不会不(也不应该)调用任何控制器动作,而只是从匹配的路由对象的 handler 属性中提取它。基于这个控制器动作定义,您(开发人员)必须实例化控制器,调用动作(还将参数列表中的值作为动作参数传递),并将此调用的结果打印给用户。
所有这些事情都在一个文件中发生,可能是index.php
。因此,您的控制器类在index.php
中实例化,之后,路由器将分派URI并返回控制器名称,操作名称和参数列表。
在index.php
中还会发生数据库连接(例如您的情况下的PDO实例)的创建,该连接应作为参数传递给控制器构造函数。