【问题标题】:PHP - constructor with SQL query [closed]PHP - 带有 SQL 查询的构造函数 [关闭]
【发布时间】:2018-10-08 17:20:35
【问题描述】:

方案一:先查询数据,再将数据传给构造函数

方案二:使用构造函数查询数据,然后填充属性


选项 1 示例

$val1 = 1;
$query = mysql_query("SELECT val2, val3, val4 FROM table WHERE val1 = '".$val1."'");
$row = mysql_fetch_assoc($query);
$o = new Class($row['val1'], $row['val2'], $row['val3'], $row['val4']);

选项 2 示例

$val1 = 1;
$o = new Class($val1);

// in Class constructor
public function __construct($val1) {
    $query = mysql_query("SELECT val2, val3, val4 FROM table WHERE val1 = '".$val1."'");
    $row = mysql_fetch_assoc($query);
    $this->val1 = $row['val1'];
    $this->val2 = $row['val2'];
    // etc ...
}

注意事项

我完全清楚 mysql_query 已被弃用。请克制住那种告诉我的压倒性冲动。这些是项目的要求。

我在问选项 2 是否是不好的做法,或者是否存在任何在面向对象领域众所周知的可预见的困境。对我来说,这似乎是更清洁的选择。

【问题讨论】:

  • 我可能会将查询放在类的函数中,然后在构造函数中调用它,这样构造函数方法本身就不会变得杂乱无章。虽然这是一个非常主观的问题......这并不重要。它基于您自己的风格偏好。我认为制作一个方法是最易读的,但其他人可能不同意。
  • 这取决于您的设计。如果您需要能够创建不总是来自数据库的实例,那么它应该与构造函数分开。如果类必须绑定到数据库,请在构造函数中进行。
  • 你说你知道 mysql_query 已被弃用。我是否应该理解这意味着您不能使用其他任何东西?
  • 在回答这个问题之前,您应该远离mysql_ 函数并准备好您的查询,而不是直接将字符串注入SQL 字符串。我无法抗拒这种冲动:当你手头有这个大问题时,你为什么还要担心建筑选择?
  • 请提供您的 PM 的联系方式。

标签: php mysql oop constructor


【解决方案1】:

嗯...你有比在哪里放置查询更大的问题但是...

我会说选项 1 是最好的,因为您可以使用数据库中的数据在其他地方实例化该类。

换句话说,该类不受数据库的限制。

【讨论】:

  • 该类将始终使用数据库中的数据进行实例化。
  • 这样想最终会迫使其他一些可怜的员工违背他们的意愿使用数据库,就像在 some function 中使用 mysql_query 的决定会迫使你编写不完整的代码代码。
  • 拥有一个作为 curl 包装器的类会强制员工使用 curl 并发出 http 请求。我一直在努力理解构建对象的类和允许依赖注入的类之间的界限。在某些时候,您是否必须完全放弃构造函数以确保完全注入能力?
  • @Anthony 恕我直言,当您编写的代码最终成为其他人的责任的可能性微乎其微时,有责任使该代码清晰 可维护 尽可能。在您的示例中,我不会为 curl 制作包装器,我会制作一个界面,仅公开我们完成工作所需的最基本方法,无论是使用 curl 还是其他任何方法。
  • @Anthony 我可以继续讨论这个话题几个小时。我是 DI 的忠实拥护者,并且总体上将所有事情都解耦了:)。如果您想聊聊(我当然愿意),请告诉我!
【解决方案2】:

把这个给负责的人看。


不过还是回到你的问题。

尽管我讨厌这样回答,但我认为选项 2 肯定会使代码更干净,但您也可以通过在类中创建一个返回您正在查找的内容的方法来使其更干净。

<?php

class SomeName extends DBClass
{
    // No need for the construct in this case

    public function fetchResults($val)
    {
        $notSoDirtyVal = mysql_real_escape_string($val);

        $query = "SELECT val2, val3, val4 FROM table WHERE val1 = '".$notSoDirtyVal."'"// Make sure you escape, sanitize, and clean this!!!!!

        $stmt = mysql_query($query); 

        $results = mysql_fetch_assoc($query);

        return $results;
    }
}
?>

然后您可以在其他文件上执行此操作

<?php
$value1 = 1;

$o = new SomeName;
$results = $o->fetchResults($value1);

【讨论】:

  • 甚至还有一个 whole siteother resources 专门用于该主题,因为我很肯定这个代码库即使是最肤浅的安全审计也不会失败。
  • 逃避也很重要。消毒是一个单独的可选步骤。转义不是。
  • 最好包括对mysql_real_escape_string 的调用,因为您必须实践您所宣讲的内容。当有人使用 1870 年代的代码从时间机器上掉下来时,您需要说他们的语言。
  • @tadman 我不能这样编码.. 很痛..
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2013-07-23
  • 2016-04-08
相关资源
最近更新 更多