PHP类共享SQL查询数据的设计模式


Design pattern for PHP classes sharing data from SQL queries

我是一个OOP初学者。以下是我的代码列表,我试图找到一个合适的设计模式:

class data {
public $location = array();
public $restaurant = array();
}
$data = new data;
$query = mysqli_query($mysqli, "SELECT * FROM restaurants"); 
//actually a big long query, simplified for illustrative purposes here
$i = 0;
while ($row = mysqli_fetch_array($query)) {
$data->location[] = $i.')'.$row['location']."<br>";
$data->restaurant[] = $row['restaurant']."<br>";
$i++;
}

我想从另一个PHP页面访问数据类。(为了在HTML中打印信息,因此使用
标签)。我不希望查询运行两次。我知道类是在一个PHP页面加载中创建和销毁的。在这种情况下,我很欣赏管理HTTP应用程序状态和最小化计算机资源的设计模式指导。

如果将数据对象存储在$_SESSION变量中,则可以从其他页面和刷新时访问它。正如在其他帖子和评论中提到的,你想把HTML从数据处理中分离出来。

class data {
  public $location = array();
  public $restaurant = array();
}
// start your session
session_start();
$data = new data;
$query = mysqli_query($mysqli, "SELECT * FROM restaurants"); 
//actually a big long query, simplified for illustrative purposes here
$i = 0;
while ($row = mysqli_fetch_array($query)) {
  $data->location[] = $i.')'.$row['location'];
  $data->restaurant[] = $row['restaurant'];
$i++;
}
// HTML (separate from data processing)
foreach ($data->location as $location) {
  echo $location . '<br />';
}
// save your session
$_SESSION['data'] = $data;

当您希望从另一页引用数据对象时

// start your session
session_start();
// get data object
$data = $_SESSION['data'];
// do something with data
foreach($data->location as $location) {
  echo $location . '<br />';
}
一般来说,

SELECT数据库中的数据是相当便宜的。您不需要担心两次运行查询。MySQL将完成缓存部分。

在你的代码中,你把数据库数据和HTML混在了一起。我建议把它分开。
// fetch data part
while ($row = mysqli_fetch_array($query)) {
  $data->location[] = $row['location'];
  $data->restaurant[] = $row['restaurant'];
}
// print HTML part
$i = 0;
foreach($data->location as $loc) {
  echo $i . ')' . $loc . '<br />';
}

你先说:

我是一个OOP初学者。

然后你说:

我不喜欢运行查询两次。我知道课堂是

你想太多了。PHP是一种基于用户对该脚本请求的脚本语言。也就是说,它总是在每次加载PHP页面时重新加载并重新运行代码。这是没有办法的

当我说你想太多的时候,PHP基本上是L.A.M.P.堆栈的一部分(Linux, Apache, MySQL &因此,查询速度的负担取决于MySQL服务器,无论如何都会缓存请求。

意味着当您考虑PHP的效率时,PHP的固有架构坚持在每次负载上运行查询。考虑到这一点,管理查询的负担落在MySQL和服务器的效率上。数据库中数据结构的设计。

所以,如果你担心你的代码占用资源,考虑以某种方式提高MySQL的效率。但是L.A.M.P.堆栈的每一层都有其用途。PHP层的目的是重载&在每个请求中重新运行脚本

您可能正在寻找Repository模式。

一般的想法是有一个类可以为您检索数据对象。

的例子:

$db = new Db(); // your db instance; you can use PDO for this.
$repo = new RestaurantRepository($db); // create a repo instance
$restaurants = $repo->getRestaurants(); // retrieve and array of restaurants instances

Implentation:

class RestaurantRepository {
    public function  __construct($db) {
        $this->db = $db;
    }
    public function getRestaurants() {
        // do query and return an array of instances
    }
}

代码是未经测试的,可能有拼写错误,但这是一个开始。

将查询结果以数组的形式保存到$_SESSION变量中,这样就不必在另一个页面上重新运行查询。此外,如果使用不同的参数重新运行查询,它可以像unset($_SESSION['name'])一样正确地管理状态。

我还可以将类数据的输出保存到会话变量。在我看来,这种设计模式比为页面刷新运行一个新的查询更有意义。