4

我需要为我的一些 mysql 查询创建导出到 excel 和导出到 pdf 选项并将其提供给用户。

而且,用户也需要在我的网站上查看查询结果。

因此,在这种情况下,会出现代码冗余,因为我必须创建三个 php 代码文件:

一种让用户直接在我的网站上查看查询结果,并且,

另一种是让用户将相同的查询结果导出到 Excel ,并且,

最后一个让用户将相同的查询结果导出为 PDF

所有三个文件都具有相同的代码,只是将数据发送到 excel 或 pdf 的方式不同。

如何消除此代码重复,是否有某种方法可以让我只有一个文件并将其用于所有目的,查看、导出为 pdf 以及导出为 excel。

4

6 回答 6

3

正如另一位评论者指出的那样,您应该拆分您的功能。处理方法如下

1)有一个从数据库中获取数据的函数(这将是你的模型)

2)有另一个函数来格式化这个数据(计算行尾的总数或其他),并选择要使用的视图(这将是你的控制器)

3) 具有另一个专门用于显示数据的功能(因此您将有一个 PDF 视图,一个用于 XLS,另一个用于 Web)

另外,请遵循评论中的此建议

于 2012-01-27T09:06:53.617 回答
3

“有什么方法可以让我只拥有一个文件并将其用于所有目的,查看、导出为 pdf 以及导出为 excel。” 我认为答案是肯定的。

您需要放置一个选择框,让用户可以选择以特定方式查看特定代码。请参阅下面的示例代码。

<select name="viewoption" id="viewoption">
<option value="view">Page view</option>
<option value="xls">Export in Excel</option>
<option value="pdf">Export in PDF</option>
</select>

然后在操作页面上,您只需要检查值$_POST['viewoption']并根据要求放置if 条件

这可能对你有帮助。如有任何疑问,请告诉我。

谢谢。

于 2012-01-27T08:48:05.670 回答
2

这里没有冗余,因为你还没有写任何东西。冗余在于想法。通过适当的抽象,您可以编写DRY代码。例如,您可以选择上面提供的 Chandersh 之类的选项:

<select name="viewoption" id="viewoption">
<option value="view">Page view</option>
<option value="xls">Export in Excel</option>
<option value="pdf">Export in PDF</option>
</select>

然后你必须编写一些代码——如果你愿意的话,一个控制器——它会监听请求。由于您正在写出相同的数据但格式不同,您可以执行以下操作:

  1. 获取数据(如果你愿意,从模型中获取)
  2. 决定使用请求运行哪个函数/代码/视图
  3. 调用您的函数/code/view ,该函数使用您之前的决定生成正确的格式
  4. 完毕

我认为你是否使用 MVC并不重要,重要的是你的组件一起做的实际工作。

请注意:拥有多个文件并不意味着代码重复。文件只是容器。以java为例。在 java 中,通常将每个类放到不同的文件中。

于 2012-01-27T09:00:54.897 回答
2

重复代码始终是软件设计欠佳的标志,并且有很多机会可以防止它。以下是其中一些用于您的特定任务:

1.使用参数

将您的文件统一为一个,并在您的 URL 中使用 GET-Params,例如file.php?output=pfd. 在您的脚本中,您可以从中读取此参数$_GET['output']并决定要生成的导出格式 ( if ... else, switch)。

2. 使用包括

只有一个大文件会很混乱。所以你也可以保留你的三个 php 文件并创建第四个文件get_data.inc.php,在那里你有所有重复的代码来获取数据。现在你可以在你的三个 php 中的每一个中加载和执行这个文件 via include get_data.inc.php

3.使用函数

将代码外包到包含中,可能也会令人困惑,因为您不知道包含将做什么以及依赖项是什么。所以最好把功能封装成一个函数。在这里,您可以清楚地定义,要在函数中粘贴什么(数据库连接?)以及您将得到什么(数据数组?)。创建一个新文件get_data.func.php并定义一个function get_data($db_connection),完成所有工作并返回准备好输出的数据。然后在每个文件中包含文件 viarequire_once get_data.func.php并说$Data = get_data($db_connection);.

4.使用类继承

您可以使用类继承的概念。您可以定义一个抽象类,其中包括从数据库中获取数据的功能,并且您可以定义一个抽象函数abstract public function output();。然后,您可以创建扩展您的类的子类,它们output()以特定方式实现该功能。

5. 使用 MVC 框架

您可以使用已建立的框架来实现“模型视图控制器”(MVC)模式。在这里,您以非常干净的方式划分应用程序的不同层(来自 db 的数据、准备输出数据、呈现数据)。

免责声明:这些只是一些学习提示,以更好地组织您的项目。如果你没有太多经验,我不建议直接从一个大的 MVC 框架开始。只需从上到下走启蒙之路;)

于 2012-01-27T09:04:22.023 回答
2

将所有代码放在一个文件中。用于$_GET['format']决定是否需要格式化为 PDF 或 excel,默认为网页选项,例如

<?php

if($_GET['format'] == "pdf")
{
     // export as PDF
}
elseif($_GET['format'] == "excel")
{
     // export as excel
}

使用指向同一页面的超链接:

http://www.site.com/page.php?format=pdf
http://www.site.com/page.php?format=excel
http://www.site.com/page.php //webpage
于 2012-01-27T08:42:47.720 回答
2

您可以将所有内容放在一个文件中并给出答案,但我会说您为什么要这样做?您可能有大量其他代码在四处飘荡,或者最终会四处飘荡。

您应该使用模型视图控制器 (MVC) 设计。您应该有一个处理所有 sql 的类(纯数据并确保准确创建、保存、返回数据),另一个文件接受/发出数据请求并指示要呈现哪个视图,最后是 2 或 3 个模板类型文件(视图),它们只是格式化和呈现在控制器中创建的数据。

拥有更多的文件/类更好,并使您的代码更加模块化,从而消除了代码冗余。将所有内容打包到一个文件中会增加代码冗余。

于 2012-01-27T08:51:36.163 回答