2016-08-20 54 views
1

我有点迷路,试图学习OOPHP。这不是以任何方式最终确定的代码,但我只是想了解如何使用另一个对象将对象存储到数据库中。PHP使用对象将其他对象存储到数据库PDO

我读,我应该将对象转换被传递到一个数组,所以我只是强制转换,但我不想使用

class ObjectStorage { 
    private $myObject; 

    function __construct($object) { 
     $this->myObject = (array)$object; 
    } 

    function __get($attribute) { 
     return var_dump($this->$attribute); 
    } 

    public function saveVideo($conn) { 
     $sql = "INSERT INTO videos (`src`, `title`, `desc`, `cat_id`) VALUES (?, ?, ?, ?)"; 
     $query = $conn->prepare($sql); 
     $query->execute($this->myObject); 

     echo "Video Saved!"; 
} 

}

当运行能看到什么是myObject我得到这

array(4) { 
    ["Videosrc"]=> 
    string(4) "Test" 
    ["Videotitle"]=> 
    string(5) "Title" 
    ["Videodesc"]=> 
    string(4) "Desc" 
    ["Videocat"]=> 
    string(3) "Cat" 
} 

我想不出如何访问这些。有人能解释我错过了什么吗?

回答

0

下面的东西应该做

只要改变你的构造 如果你的数据库列对象的属性名命名。

function __construct($object) { 
    $bind = array(); 
    foreach($object as $prop => $val) { 
     $bind[":$prop"] = $val; 
    } 
    $this->myObject = $bind; 
} 

在您的例子看来,你的对象道具都具有不同的名称的数据库列,这样以来PDO准备数组键映射数据库列,你可以做这样的事情。

function __construct($object) { 
    $bind = array(); 
    $bind[':src'] = $object->Videosrc; 
    $bind[':title'] = $object->Videotitle; 
    $bind[':desc'] = $object->Videodesc; 
    $bind[':cat_id'] = $object->Videocat; 
    $this->myObject = $bind; 
} 

而且你的INSERT查询应该是这个样子

"INSERT INTO videos (`src`, `title`, `desc`, `cat_id`) VALUES (:src, :title, :desc, :cat_id)" 
+0

哦,我的对象有猫,而不是CAT_ID,如果我改变属性CAT_ID并添加foreach循环它会工作? –

+0

编辑答案,你应该修改也插入查询。而你的评论似乎认为你的对象的属性如:'Videosrc'而不是'src',所以在这种情况下你必须使用第二个选项。 –

+0

那么对象的实际属性是src,title,desc,cat,但是当我将它转换为数组时,它将类名添加到前端,因为它们受到保护。尝试访问$ object-> src不起作用。我是否需要公开这些属性,这会很糟糕,是吗?一般公共道具可能不是第一选择的 –