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

时间:2017-04-08 00:42:14

标签: php oop

我试图激发我的技能并远离程序式编码,但是切换并不容易,我对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&amp; PHP。这是在OOP领域做事的可接受的方式吗?

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

希望这是有道理的。只是在这里寻找一些最佳实践和指导,但请记住我是一个新手。

1 个答案:

答案 0 :(得分:2)

我是否应该创建一个像getCategories()这样的单独方法来循环调用dispCategories()方法返回的结果?

你现在肯定在正确的轨道上。由于您的dispCategories()方法只返回一列,因此它会返回一维数组,这是一个简单的值列表,而不是保留生成它的SQL查询特征的2D结构。我可能会修改该方法以获取所有行,然后将它们减少为单个数组,然后返回。这使得不必创建另一个方法来循环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()值可能包含需要HTML实体编码的字符,则可能需要调用$category

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

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