【问题标题】:Using the tables id in supper class in PHP OOP在 PHP OOP 中使用晚餐类中的表 id
【发布时间】:2020-09-26 17:59:32
【问题描述】:

首先,我需要告诉你,我是 PHP OOP 的新手,所以请多多包涵。

当我创建 MySQL 表时,我更喜欢在列中指定表的名称。例如,我使用 user_id 代替 users 表中的 id,或者使用 photo_id 代替照片表中的 id。这有助于我稍后检查 MySQL 语句时更容易理解它们。 (我明白不同的人有不同的喜好)

现在,问题是,当我在使用表的 id 的类中有一个方法但我想使用每个针对不同表的子类时。这是一个例子:

我有两张桌子。一个用于用户,一个用于照片。用户表的 PK 为 user_id,照片表和 PK 为 photo_id。对于每个表,我都有一个同名的类。另外,这两个类在comman中有很多方法,所以我创建了一个类并将这些类和子类放在一起,大部分都很好。当我想根据它的 ID 定位一个表时,问题就来了,就像下面的 Save 方法:

  // updates a row if it exists, creates it if it doesn't
    public function Save(){

        return isset($this->user_id) ? $this->Update() : $this->Create();

    }

//Creates a user in Database
    public function Create(){
        global $Database;

        $Properties = $this->CleanProperties();


        $Sql = "INSERT INTO " . self::$DBTable . "(" . implode(",", array_keys($Properties)) . ")";
        $Sql .= "VALUE ('";


        $Sql .= implode("', '", (array_values($Properties)));
        $Sql .= "')";

        if ($Database->Query($Sql)){
            $this->user_id= $Database->InsertID();
             return true;

        } else {

            return false;
        }

    }

    /// Updates a user in Database
    /// returns "true" if the row is affected
    /// returns "false" if not
    Public function Update(){
        global $Database;
        $Properties = $this->CleanProperties();

        $PropertyPairs = array ();

        foreach ($Properties as $Key => $Value){

            $PropertyPairs[] = "{$Key}='{$Value}'";
        }

        $Sql =  "UPDATE " . self::$DBTable . " SET ";
        $Sql .= implode(", ", $PropertyPairs);
        $Sql .= " WHERE user_id     =  " . $Database->EscapeString($this->user_id) ;

        $Database->Query($Sql);

        return (mysqli_affected_rows($Database->DBConnection) == 1) ? true : false;
    }

    /// Deletes a user row from MySQL base on the user ID
    /// returns "true" if the row is affected
    /// returns "false" if not
    public function Delete(){
        global $Database;

        $Sql = "DELETE FROM " . self::$DBTable;
        $Sql .= " WHERE user_id = ";
        $Sql .= $Database->EscapeString($this->user_id);
        $Sql .= " LIMIT 1";
        $Database->Query($Sql);

        return (mysqli_affected_rows($Database->DBConnection) == 1) ? true : false;
    }

我搜索了不同的解决方案,发现了一个名为 fetch_field_direct 的方法。但是,使用它让我更加困惑。

有人对此有解决方案吗? 谢谢

【问题讨论】:

    标签: php mysql class oop


    【解决方案1】:

    不确定我是否正确理解了您的问题,但我认为所有这些问题的发生是因为您决定通过指定带有 id 的表名来为您的数据表使用不同的标准。最简单的解决方案可能是遵守标准并使用不带前缀的id。如果您想获得更好的可读性,您可以随时尝试使用像photos.id 这样的点符号来指定您的表名,从而为您提供与photo_id 相同的可读性并且没有问题。另一种方法(我不推荐)是将 id 作为参数传递,如下所示:

    <?php
    Class Foo {
        public $bar;
        public function __construct() {
            $this->bar = 'test';
        }
        public function test($param) {
            return $this->{$param};
        }
    }
    
    $obj = new Foo();
    
    echo $obj->test('bar');
    

    打印“测试”。

    【讨论】:

    • 您好,感谢您的评论。我非常喜欢遵循标准和最佳实践。但是,我没有得出这样的结论,即为每个表使用 id(没有前缀)是标准的,而更像是一种偏好。例如在这个讨论中:stackoverflow.com/questions/208580/…
    • @siamakehsani 好吧,它可能不是一个标准,但在这种情况下它仍然可以让你的生活更轻松一些。您如何看待使用点表示法,在可读性方面不会给您带来相同的效果吗?你总是可以尝试实现我写的第二种方法,并有一个参数$prefix 或其他东西并将其添加到 id,即使我不推荐它......
    • 是的,我想是的。我一定会试一试,看看效果如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2012-07-15
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多