【发布时间】: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 的方法。但是,使用它让我更加困惑。
有人对此有解决方案吗? 谢谢
【问题讨论】: