如何在我的 PHP/SQL/HTML/CSS 代码上实现 MVC 风格? [关闭]

2023-11-26

我一直在开发一个程序来可视化一些数据。我的程序从 MySQL 数据库获取特定输入并绘制一些图表(libchart 库),创建一些表格等。

我的问题是,现在那里是一个代码地狱。我有大约 7 个 php 文件(索引、图表页面、图库等),其中包含 HTML/CSS 和 PHP/SQL 代码(其中一些文件只有 php 扩展名,但内部只有 HTML)。我暂时阅读和理解这个项目没有问题,但我想如果其他人尝试的话,他可能会头疼。另外,继续这样的编程是不切实际的,因为该项目将来可能不容易扩展。

您对如何成功地将 HTML/CSS 与 PHP/SQL 分离有什么建议吗?我不想使用框架,因为我没有做任何需要用户输入、会话处理等的事情。我只是运行一些查询并可视化结果。我在这里主要谈论架构,如果适用的话,也许有一个脚本可以帮助我(我读过有关 Smarty 的内容,但我不确定这是否是我需要的)。


您对如何成功地将 HTML/CSS 与 PHP/SQL 分离有什么建议吗?

恭喜您了解如何改进代码。这是前提,你需要想要改进它,而且这个话题很长。所以你的意志至关重要。

我开始时会比较轻松,然后尝试给出一些提示。当您缺少经验时,请寻找一个起点,最肯定的是下面列表中的最后一个。但首先要做的事情是:

要将某些内容彼此分开,您需要一些代码来区分:

[HTML/CSS/PHP/SQL]

[HTML/CSS] <--> [SEPARATOR] <--> [PHP/SQL]

The 分隔器这里实际上也是 PHP 代码,但我想你已经明白了。

正如你所看到的,只有分隔器与交谈HTML/CSS and PHP/SQL.

So both HTML/CSS and PHP/SQL需要有一个接口分隔器(之间的线)使这项工作有效。

通常在程序中,您传递已处理的数据。数据非常动态,并且可能具有复合复杂性,尤其是当您将数据传递到应正确格式化数据的输出例程时。

有多种方法可以实现这样的分隔器(或其中的多个)可以被写入。你可以layer您的软件或提供成分做他们的事情area or domain。例如。你有一个数据库层 or 数据库组件它负责与数据库的交互。

或者你有一个模板引擎它会小心地将字符串和数组放入一些可读的 HTML 中。

简而言之,这就是软件设计的面食理论:

  • 意大利面条代码- 全部合而为一,代码紧密交织,最好使用 Bolognese 或 Aglio、Olio e Peperoncino。
  • 千层面代码- 分层,一层与另外两层相互作用(除非底部或顶部),始终与白酱。
  • 饺子代码- 只完成其工作的小组件,里面有肉或辣蔬菜。

就像我们在生活中吃不同的面食一样,在编程时我们也需要处理所有这些不同类型的代码,并且随着时间的推移我们会形成自己喜欢的口味。当我们还是个孩子的时候,我们会吃饭,但随着时间的推移,我们开始自己做饭并改变食谱。

所以我认为这是一个很好的观点,你只是现在不想吃东西MVC Framework X 有很多很棒的东西接下来的几周只是因为有人告诉你这是现在的饮食方式。吃东西之前,还有品尝,对吗?更不用说快餐了,你知道像这些带酱的面条——只加水。呃。

我不知道你的输出需要哪些数据以及输入是什么。以下是针对输出 HTML/CSS 并与 MySQL 数据库交互的应用程序的一些粗略重构技巧。这不可能是完整的列表,描述只能粗略地概述一些想法:

  • 将 CSS 从 HTML 中移出。在链接的 CSS 定义中有效使用选择器并替换任何style如果你还有一些属性的话。这使得您的 CSS 代码可重用并且更加模块化。它将帮助您找到 HTML 内部的缺陷,并将结构 (HTML) 与表示 (CSS) 分开。有效的 HTML 始于有效使用 CSS,这两者非常强大,通常这已经可以减轻您的程序输出例程。
  • 将业务逻辑移出 HTML。 HTML 和您的代码都可能是庞然大物,因此最好将它们分开。他们倾向于互相争斗,并且由于两者都非常强大,因此在您开发应用程序时,争斗将会继续,这会分散您对需要完成的工作的注意力。
    考虑一下您的应用程序中是否需要已经有复杂的输出,或者您是否可以只传递带有子元素的数组(键是 var,var 可以包含字符串或数字或另一个 var 数组)。通常这足以将复杂的数据传递到view or template。然后,您的 HTML 只需要回显一些数组成员和/或foreach在子数组上。这是创建模板的非常简单的技术。您可以使用 PHP,因此实际上非常灵活(只需绘制属于您的视图层的代码以及属于应用程序的一部分的边框,例如为视图提供值)。
  • 将 SQL 从代码中移出。将数据库交互代码移开。创建一个或多个对象,这些对象具有在实际处理代码中以您需要(使用)数据的方式返回数据的方法,例如$component->getThatData()然后以标准化形式返回数据。制作这些组件然后使用专用的数据库组件与数据库交谈。在您的应用程序代码(业务逻辑)中,仅使用数据库组件,最好使用您创建的对象来获取数据,因此您的主代码中不再有任何 SQL 行。
  • 分而治之您的应用程序代码:将您的代码分为交易脚本。它们通常很容易从现有的意大利面条代码中创建,并且可能会成为所说的分隔器您正在寻找中间术语。然后,他们将负责处理数据并将其传递(到输出/视图中)。
  • 使用清晰的语言:如果您有未标准化的复杂格式字符串数据,请自行编写Parser为您完成工作并且可以轻松重用的类(如果您的应用程序是这种情况)。正如您应该期望最大限度地减少代码中纯 SQL 的使用一样,您也应该期望将复杂的正则表达式移走。封装不同的内容是一个关键点。这同样适用于处理一些数据的长例程(例如,以另一种格式排序、排序和排列),将它们移动到各自的组件中,并考虑如何使它们可访问和可重用。
  • 让你的代码正常运行:了解如何在程序中调用功能的逻辑。您可以尝试将功能与其调用方式分开。例如。调用任何一个的一些例程交易脚本。如果您直接通过浏览器请求 PHP 文件,则这可能不是必需的,因为这些文件就是您的事务脚本,并且 Web 服务器会负责将通过 URL 发送到应用程序的命令解析为事务脚本。但是您应该包装处理所需的任何逻辑传入的命令及其参数转化为可重复使用的组件(例如Request类,包含从 HTTP 请求获取 URL 和/或变量的标准代码)。
  • 创建公共入口点通过在通过浏览器调用的所有文件的最顶部包含相同的文件。然后您可以放置​​通用代码(例如设置应用程序会话状态对象并初始化数据库组件)进入其中,另请参阅应用控制器
  • 删除重复项通过寻找字面上重复的代码。将其包装到函数或类中。为您自己的应用程序创建一个库文件夹,将包含内容放入其中。如果您遵循类名和命名空间的常见模式,则可以轻松使用自动加载器来轻松包含。制作你的图书馆除了第三方代码。将所有第三方代码放入其自己的库文件夹中,每个第三方组件都有一个子目录。
  • Use lightweight, existing components. Lightweight is important because you have your own code already, you don't want to turn and press it all at once onto a framework. Existing is important because you don't want to re-invent the wheel. You will have enough work for your own refactoring your code. After you feel better about your application and you still have power and will, you can always write everything new. But if you're alone or in a small team, Existing is pretty powerful. Simple libraries are for example:
    • 模板引擎:Mustache
    • 数据库层:NotORM
  • 创建应用程序状态,例如作为一个对象,您可以在某些组件需要了解应用程序状态或彼此之间无需直接交互的情况下使用。默认情况下,如果 PHP 中没有全局变量和全局静态变量,则用于创建状态。然而,随着代码的增长,这些变量可能会让你的生活变得困难。当您创建应用程序状态对象时,很清楚哪些组件使用它,可以控制对它的访问(例如,调用方法而不是读取变量,这可以帮助调试)并且组件也可以找出它是否是在申请流程中的正确时机采取行动。它也是随着时间的推移重构代码的好工具。
  • 保留工作应用程序,让你的代码处于运行状态。理想情况下,这将得到自动测试的支持。考虑一下您需要重写很多内容。例如,如果您开始集成数据库组件,那就去做吧。一步将所有现有代码移至其中。那么谁告诉你它仍然在运行?使用 git 可以更好地撤消和测试内容。这比选择正确的库更重要。保留工作应用程序也始终是关键点,因为这就是您更改它的原因,对吧?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在我的 PHP/SQL/HTML/CSS 代码上实现 MVC 风格? [关闭] 的相关文章

  • HTML 文件上传“未选择文件”文本样式

    我正在构建一个需要文件上传的 html 表单 当我让文件上传部分正常工作时 我无法获得表单上传按钮和 未选择文件 文本的样式 我想要的标记是 有办法做到吗 PS 请忽略绿色文本 上传屏幕截图 我有那个工作 当前行为按钮和 未选择文件 位于同
  • 拖放图像上传在服务器上不起作用

    我正在尝试实现拖放图像上传 我在网上找到了一个相当简单的脚本并适合我的使用 在我的本地安装中 文件上传得很好 但在服务器上却不行 从我的调试尝试来看 SERVER HTTP X FILENAME 甚至没有被 php 设置 我尝试了以下方法
  • contenteditable 在 safari 中不起作用,但在 chrome 中起作用

    我有一个奇怪的问题 这在 chrome 中按预期工作 但在 safari 中它只会发光 但不会对按键输入做出反应 这是触发文本版本的方法 var namebloc event currentTarget find column filena
  • Bootstrap 3 - 使用垂直滚动条水平拖动元素,overflow-y:滚动

    在我的失败之后上一篇文章 https stackoverflow com questions 23586926 bootstrap grid with scrollable affixed column noredirect 1 comme
  • 如何防止在达到一定字符数后向文本区域输入内容?

    使用下面的代码 任何超过指定最大值的输入都将被删除 但这会产生一种效果 即键入字符后立即将其删除 我宁愿简单地阻止输入字符
  • 表单提交不起作用

    我有一张桌子 可以打印出所有可用的相机 它使用表单来更改这些设置 问题在于该表单仅更新条目中的最后一个摄像机 换句话说 如果我更改表单并为列表中的最后一个摄像机点击 应用 它将起作用 如果我更改此列表中任何其他摄像机的表单 它会将其更改为与
  • 通过电子邮件发送在 HTML5 画布上创建的图像

    我有一个画布 用户可以通过交互来更改设计 现在 用户完成更改后 可以提交他的设计及其电子邮件 ID 但为了提交设计 我使用以下方法将画布转换为图像http www nihilogic dk labs canvas2image http ww
  • 用于选择 querySelector 中当前元素的 CSS 伪选择器可用于同级 (+) 或一般同级 (~) 选择器? [复制]

    这个问题在这里已经有答案了 如果我有这个 HTML div class elem div class child div div div class sibling div 和JS let elem document querySelect
  • 数据库设计 - “推”模型,或写时扇出

    背景信息 我正在尝试检索我关注的人的图像 按最新时间排序 它就像 Twitter 新闻源 显示您朋友的最新动态 Plans 目前我只需要考虑一项 那就是图像 将来我计划分析用户的行为并将他们可能喜欢的其他图像添加到他们的提要中等 http
  • 检测 JavaScript 中的焦点丢失

    我希望能够检测 JavaScript 中任意元素何时失去焦点 因此我可以构建一个类似于 jEdit 的内联编辑工具 我不能依赖 jQuery 来实现这个库 所以我需要一个本机方法来完成它 我查看了 onblur 这似乎是正确的事情 但 MD
  • IE 中的文件上传按钮和奇怪的文本光标行为

    我构建了一个上传按钮 其格式类似于典型的 html 按钮 而不是浏览器标准文件上传表单 该方法是设置锚元素的样式并在顶部覆盖透明文件输入元素 这种方法在除 IE 之外的所有浏览器中都可以正常工作 在 IE 中 当用户单击上传按钮时 会出现一
  • 在 Slim Framework 3 中访问课堂上的应用程序

    当路由位于与 index php 不同的类中时 我无法理解如何访问 Slim 的实例 当使用 Slim Framework 2 时 我总是使用以下内容 但它在 Slim 3 中不起作用 this gt app Slim Slim getIn
  • Niceedit本地上传图片失败

    我是这样称呼编辑的 new nicEditor buttonList bold italic underline upload iconsPath img nicedit png uploadURI http server com inte
  • Windows 上的锯齿字体 - Chrome 和 Safari

    我使用以下代码在网页上使用自定义字体 font face font family HelveticaNeueBold src url fonts HelveticaNeueBold eot src url fonts HelveticaNe
  • 如何防止显示菱形问号符号,即使使用 mb_substr 和 utf-8

    我读过其他一些问题 尝试了答案 但最终没有结果 我得到的是例如这个 我无法删除那个奇怪的问号 我所做的就是获取 RSS feed 的内容 该内容也被编码为内容使用希腊语 有没有什么办法解决这一问题 div div
  • 重复密码在 Yii2 中不起作用

    我在模型中编写的规则如下 public password repeat inheritdoc public function rules return password required password string min gt 6 p
  • 更改 CSS 样式表的选择器属性

    以下是我们传统上如何更改重复元素的样式 将样式应用到每个元素 function changeStyle selector prop val var elems document querySelectorAll selector Array
  • BigQuery 标准 SQL 中具有不同架构的联合表

    附加具有不同架构的表的最佳方法是什么 表 0 架构 表1 架构 这很好用 SELECT img1 NULL as img2 FROM xxx staging table0 UNION ALL SELECT img1 img2 FROM xx
  • 网页执行回发时如何停止在注册表单上?

    我正在做我的最后一年的项目 其中 我在一页上有登录和注册表单 WebForm 当用户点击锚点时Sign Up下拉菜单ddlType 隐藏 和文本框 txtCustName txtEmail and txtConfirmPassword 显示
  • PHP - While/Else 错误? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有以下

随机推荐

  • 有 com.l2fprod.common.propertysheet.PropertySheetPanel 来显示组合类

    为了拥有 Netbeans 喜欢的属性检查器窗口 我使用以下类来帮助我实现这一目标 com l2fprod common propertysheet PropertySheetPanel 到目前为止 它对于具有简单属性 例如 String
  • 在 NextJS 项目中使用 Tailwind 和 MUI 时出现意外行为(白色按钮错误)

    我目前正在使用 NextJS TailwindCSS 和 MUI React UI 库构建一个项目 每当我尝试向我的项目添加 MUI 按钮时 它工作正常 但按钮的颜色保持白色 悬停时颜色恢复正常 单击按钮时仍然具有波纹效果 但当不悬停时 它
  • 应用程序内更新不适用于应用程序包 apk

    我在我的 Android 应用程序中实现了最近推出的应用内更新 API 当我构建 apk 并测试此功能时 它工作正常 我已经上传了带有测试版的更高版本的apk 但是 当我构建应用程序包并将应用程序包上传到内部内部应用程序共享时 永远不会提示
  • 为什么 MSVC 2010 32 位项目链接到 64 位 kernel32.dll?

    我有一个 Win32 32 位 DLL 项目 它的构建和链接没有错误 DLL 无法加载到 32 位进程中 使用 DependencyWalker 我看到 DLL 是 32 位的 但已与 kernel32 msvcr100d ws2 32 和
  • C中的无符号整数[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 当我运行下面的程序时 它输出类似 109876543210 1 2 3 4 5 6 78
  • 无法在 selenium webdriver 中启动 IE 浏览器

    我已经编写了示例代码来启动IE browser并加载谷歌页面 public class Sample public static void main String args TODO Auto generated method stub S
  • IOS 中获取错误的运营商名称

    我正在开发一个 IOS 应用程序 我的要求是获取移动运营商名称 我使用了以下代码 In h import
  • 正则表达式跳过模式

    Problem 我需要用百分号 替换所有星号 方括号中的星号应被忽略 Example Test public void Replace all asterisks outside the square brackets var input
  • 使用 PDFBox 进行图像旋转

    我对使用 PDFBox 很陌生 我需要的是将带有旋转的图像添加到现有的 PDF 中 我知道如何添加图像 但我的问题是如何旋转图像 我见过一些关于 AffineTransform 和 Matrix 的东西 但我不知道那是什么以及它是如何工作的
  • jQuery 更改(使用淡入淡出动画)悬停时 div 的背景图像

    我正在尝试使用 jQuery 更改悬停时 div 的背景图像 这是我到目前为止所想到的 但是它不起作用 html div class logo div css logo width 300px height 100px background
  • Scipy插值如何将3x3矩阵调整大小/重新采样为5x5?

    EDIT 保罗在下面解决了这个问题 谢谢 我正在尝试将 3x3 矩阵重新采样 升级 为 5x5 用 interpolate interp2d 或 interpolate RectBivariateSpline 或其他有效的方法 填充中间点
  • 在 Android 上录制视频时拍照

    我编写了如下所示的 Android 服务 用于在后台录制前置摄像头 这非常有效 但现在我想在录制时每 5 秒拍一张照片 这有可能吗 当我尝试打开第二个摄像头 在另一个服务中 时 出现错误 public class RecorderServi
  • 关于 volatile 关键字的问题

    我知道通过volatile关键词 volatile int k 7 我们寻找编译器该变量可以随时更改 但是一个简单的呢 int k 7 因为它不是恒定的 我们可以随时更改它吗 有什么不同吗 volatile防止编译器优化并告诉编译器声明为
  • 如何在 Windows 7 上安装 Imagick/imagemagick PHP 扩展

    如何在 Windows 7 中安装 imagemagick 我按照这些说明进行操作 在 Windows XP php 5 2 x 上安装 IMagick 下载并安装 ImageMagick 6 5 8 7 Q16 windows dll e
  • 如何在 C++ 中将字节数组发送到另一个进程

    我一直在网站上检查一种在 C 中将数据从一个进程传输到另一个进程的方法 我找到了 SendMessage 方法 但它似乎无法获取字节数组 为了解释一下这里的上下文 我有一个将数据发送到另一个应用程序的应用程序 我们有几个具有不同 ID 的对
  • Numpy 字符串上的“where”

    我想在字符串数组上使用 numpy where 函数 然而 我这样做并不成功 有人可以帮我解决这个问题吗 例如 当我使用numpy where在下面的示例中我收到错误 import numpy as np A apple orange ap
  • 在 tvOS 模拟器上卸载应用程序

    如何从 tvOS 模拟器卸载应用程序 我已经尝试长按该图标 但没有出现 关闭按钮 我知道 这是一个 Beta 版本 也许将来他们会实现类似 iOS 的功能 谢谢 Method 1 从主屏幕 Settings gt General gt Ma
  • 有条件地向 ui-select 添加“multiple”属性

    我正在尝试添加multiple归因于ui select指令基于某个属性的值 使用ng attr 指示 不幸的是 这对我不起作用 我设置了一个 plunker 示例来展示正在发生的事情 笨蛋的例子 Edit 读完上述内容后我终于明白了GitH
  • 我们可以在 Firebase Cloud Messaging 中创建多少个主题?

    我正在构建一个使用 Firebase Cloud Messaging 的应用程序 但我有一些疑问 我想知道我们可以在一个应用程序实例中制作多少个主题 In 官方文档它写道 当单个应用实例订阅过多主题时 它检索错误TOO MANY 主题 我想
  • 如何在我的 PHP/SQL/HTML/CSS 代码上实现 MVC 风格? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我一直在开发一个程序来可视化一些数据 我的程序从 MySQL 数据库获取特定输入并绘制一些图表 libchart 库 创建一些表格等 我的问题是 现在那里是一个代码地狱 我有大约