pdo,将php对象插入数据库

时间:2014-01-15 11:07:43

标签: php mysql object pdo

我无法找到这个问题的答案。

我想将一个php对象保存到mysql数据库中。例如:

class user{
  private $id, $email, $pw, $first, $last, $group,.....;
 // getters and setters    
}

class someclass{

public function someFunction(){
  $pdo = new PDO(...);
  $objUser = new user();
  $objUser->setEmail(....);
  $objUser->setFirst(....);
  //bla bla bla

 // and i want to save this user object to DB with something like:
  $pdo->insert($objUser); //in this case db table equals to class name
  //instead of building/writing query manually. 
  //for mysql_query i have made a class for building query for insert update delete 
  //but mysq_query is old and deprecated
}

}

我要求的主要原因是因为我不想写一些默认存在的东西。

谢谢。

2 个答案:

答案 0 :(得分:5)

我可能会在user类中实现insert,update和delete方法,而不是使它成为数据库类的一个特性来解释给它的对象。

在PHP或mysql PDO类中没有内置的方法,但是有些框架实现了ORM(对象关系映射),允许您在对象类中轻松指定它们与数据库的交互方式。 (Laravel framework ORM docs

这是一种可以实现它的基本方法。

class ORM {
    public function insert($pdo) {
        // Get object name
        // Get object properties
        // Check if database table exists with object name
        // Generate and run a query to insert a record into that table
        // using the property names and values
    }
    public function update($pdo) {
        // Like insert, but update
    }
    public function delete($pdo) {
        // Etc...
    }
}

class user extends ORM {
    private $id, $email, $pw, $first, $last, $group,.....;
    // getters and setters    
}

class someclass{
    public function someFunction(){
      $pdo = new PDO(...);
      $objUser = new user();
      $objUser->setEmail(....);
      $objUser->setFirst(....);
      //bla bla bla

      $objUser->insert($pdo);
    }
}

答案 1 :(得分:0)

您可以使用Model类扩展模型类。

使用与MySQL表名称相同的属性名称。

在此类中,您可以创建一个 saveToDb($ tableName)方法(如果您将tableName定义为类属性,则可以省略它):

  1. 使用查询从MySQL表获取列

    "DESCRIBE tablename"
    
  2. 从Class实例获取属性:

    get_object_vars($this)
    
  3. 计算1和2之间的交集。(根据设置和数据库模型,从1中删除id列)。

现在为匹配列,您可以插入(或更新)MySQL表。您可以从中动态创建查询(如果您的值包含用户生成的内容,请使用PDO)。

如果您使用扩展模型,则由于某些原因出于某种原因在保存之前需要进行一些额外的处理,您仍然不得不自由重写。