一个具有可变表/字段/值的函数,还是具有可变值的 60 个函数更好?
Posted
技术标签:
【中文标题】一个具有可变表/字段/值的函数,还是具有可变值的 60 个函数更好?【英文标题】:Is better one function with variable table/field/value, or 60 functions with variable value? 【发布时间】:2021-08-28 19:44:18 【问题描述】:在一个php/mysql项目设计中,这样写一个函数是不是比较好
function getFromTableOneInt($l, $t, $f, $v)
$stmt = mysqli_prepare($l, "select * from $t where $f = ?");
mysqli_stmt_bind_param($stmt, "i", $v);
mysqli_stmt_execute($stmt);
$res = mysqli_stmt_get_result($stmt);
$out = array();
while ($r=mysqli_fetch_assoc($res))
$out[] = $r;
return $out;
其中表名、字段名、值是变量,还是写N个函数,每个函数都有定义的表名和字段名?
考虑到表名和字段名来自直接调用,不是用户定义的。用户输入只定义了最后一个值,$v。
表/字段名是否有一些我看不到的漏洞? 加载保存在每个包含的 php 文件中的 1200 行函数是否内存更重?或者在 php 中,函数声明加载到内存中只是指针? 根据您的经验,哪一个更快或更易读?
感谢您的任何意见/建议。
【问题讨论】:
恕我直言,更好的方法是使用 OOP(您可以在其中扩展和重用类),甚至更好的是,使用一些现成的数据库库。 在任何语言中,为了简单起见,我都会编写 1 个带参数的函数,便于维护,并让其他人更容易阅读您的代码并理解它并支持它。无论哪种方式都应该没有性能优势,并且所需的额外 RAM 对于 n 个函数设计来说可以忽略不计。 您的代码易受 SQL 注入攻击。考虑编写硬编码 SQL 查询或使用 ORM 为您安全地构建它。附言您创建的方法毫无用处。坚持使用更易读、更安全的普通 SQL “60”?每“秒”一个? “分钟”? 【参考方案1】:将您的数据库处理(如打开、查询等)概括为一个类(而不是语句)。
但提供多个使用上述通用类的方法,例如:
registerUser($name, $password);
findUserByName($name);
findUserByEmail($email);
这样想:我的单一方法可以处理上述所有问题吗? 不,你最终还是会编写多个方法。
一旦您编写了病毒,重复使用相同的语句并节省几个字节的内存是一个问题(不是在网站的情况下)。
【讨论】:
【参考方案2】:TL;DR - 对我而言,它与可扩展性和可伸缩性有关。恕我直言,为此类事情使用受支持的框架或坚持使用内联 SQL。
框架
有这方面的框架。 Codeigniter、Laravel、Symfony、CakePHP 和其他人抽象出数据库函数以使它们不可知(PDO、MSSQL、MySQL 用户都使用相同的语法来运行他们的查询)。因此,在任何给定时刻,您都可以将您的 MySQL 数据库转移到 MSSQL,而不必更新您的代码。这可以使大多数简单查询的语法更具可读性,并有助于查询绑定和值转义等问题。我发现对于更大、更复杂的查询,这些框架会妨碍我,我只想查看一个块结构的查询来进行故障排除。
DIY
我曾经从另一个开发人员那里被带进来修复这样的代码 - 他已经将应用程序中的所有 mysql 查询(以及其他任务)抽象为辅助函数。随着时间的推移,特殊条件和特殊需求加起来,这些辅助函数变得相当大。更糟糕的是对其他开发人员(比如我)来说,它降低了代码的可读性。我必须回去把所有这些乱七八糟的东西都解决掉。
这并不是说你没有很好的功能,只有我的 2 美分。
【讨论】:
感谢您的回答。我对框架的概念问题是这样的:cvedetails.com/vulnerability-list/vendor_id-6918/… 你编写了一个云软件,并且你直接容易受到你正在使用的代码的漏洞利用、发布或零日漏洞的攻击。我知道对于大公司或多开发项目是必要的。但对于单身项目,我觉得我不需要它。 公平点。不确定 CI 如何在安全方面与其他框架叠加,但我认为任何框架在某些方面都更容易受到攻击。好处是他们通常会快速修补它,但您仍然必须准备好在补丁发布时进行更新。 @DanieleRugginenti 另一种选择是,您认为自己的代码比开源项目的代码更安全,成千上万的程序员已经在框架中寻找并报告了漏洞 框架的另一个插件是大量的基准测试。使用 CI,我可以轻松找到我的 php/mysql 组合中的瓶颈,以及关于运行的每个查询的即时报告,以及每个查询所用的时间。这根本不涉及安全性,只是一种福利。 (从“MySQL”迁移到“PDO”本身不需要不可知论)以上是关于一个具有可变表/字段/值的函数,还是具有可变值的 60 个函数更好?的主要内容,如果未能解决你的问题,请参考以下文章
具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?