PHP OOP如何处理数据库查询返回的数据

问题描述:

我试图发挥自己的技能,摆脱程序风格编码,但切换并不容易,我对OOP概念非常陌生,请记住这一点阅读/回答时。PHP OOP如何处理数据库查询返回的数据

我有一个类里面下面的方法称为Jobs{}

方法的任务是非常简单的查询所有在表中不同的工作类别,并返回它的数据库。

下面是从代码我的类中提取

function dispCategories(){ 
    $sql = "SELECT DISTINCT category FROM jobs"; 
    $stmnt = $db->prepare($sql); 
    $stmnt->execute(); 
    return $stmnt->fetchAll(); 
} 

现在,在我的观点或HTML页面我下面

$obj = new Jobs(); 
$categories = $obj->dispCategories() 
?> 
    <!--DISPLAY CATEGORIES --> 
    <form id="getJobByCategory" method="post" action=""> 
     <select name="selectedCategory"> 
      <?php 
      foreach ($categories as $category){ 
       ?> 
       <option value="<?php echo $category['category'] ?>"> 
        <?php echo $category['category'] ?> 
       </option> 
      <?php 
      } 
      ?> 

我的问题

当你看我的代码,我发起对象Jobs{},并调用方法类别$categories = $obj->dispCategories()

我使用一个foreach循环结合一些html & php。这是在OOP领域做事情的可接受方式吗?

  • 我是否应该创建一个独立的方法,如getCategories(),其中我循环了dispCategories()方法返回的结果?
  • 或者我应该只是处理由dispCategories()方法的实际dispCategories()方法中返回的数据...

希望这是有意义的。只是在这里寻找一些最佳做法和指导,但请记住我是一个菜鸟。

我是否应该创建一个像getCategories()这样的分离方法,让我遍历dispCategories()方法返回的结果?

你绝对是在正确的轨道上与你现在拥有的。由于您的dispCategories()方法仅返回一列,因此它将返回一维数组,这是一个简单的值列表,而不是保留生成它的SQL查询的特征的二维结构。我可能会修改该方法来获取所有行,然后将它们还原为单个数组,然后返回。这使得不需要创建另一个方法来循环由dispCategories()返回的类别。

假设PHP 5.5+,你可以很容易地array_column()做到这一点:

function dispCategories(){ 
    $sql = "SELECT DISTINCT category FROM jobs"; 
    $stmnt = $db->prepare($sql); 
    $stmnt->execute(); 
    // Return a simple 1D array of the category only 
    return array_column('category', $stmnt->fetchAll()); 
} 

它是那么简单的foreach来一一列举出来,而无需访问数组的键。

foreach ($categories as $category){ 
?> 
     <option value="<?php echo $category; ?>"> 
      <?php echo $category; ?> 
     </option> 
<?php 
} 

请记住,您可能需要调用htmlspecialchars()$category值,如果它可能包含要求HTML实体编码字符。

或者我应该只是处理由dispCategories()方法返回的实际dispCategories里面的数据()方法...

不,我不认为你应该这样做。在您学习OOP时,请阅读关注点的概念和MVC(模型 - 视图 - 控制器)模式。如果您要在创建此HTML块的Jobs类中创建方法,那么它将执行更适合您的视图代码的工作。应该是Jobs类的职责,从数据库中检索项目,提供关于它们的信息,并准备将它们传递给视图或模板,但视图或模板HTML应该保留负责组织来自Jobs类进入标记适合但是你碰巧显示它。

+0

非常感谢你这个详细的答案,真的很感激。 –

+0

@TimothyCoetzee不客气,祝您学习愉快。 –