一个具有可变表/字段/值的函数,还是具有可变值的 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:更改键的值?

同一表中具有不同值的重复字段

使用具有多个值的键创建 NSDictionary

如何从两个表中选择同一字段中具有相同值的行?

以编程方式创建具有新属性值的 WooCommerce 产品变体

向 auth_user 表添加只能具有选择性值的字段