使用PDO动态地将模态对象存储到数据库的函数,PDO将序列化对象作为值访问

时间:2013-07-26 19:05:46

标签: php mysql serialization pdo

我正在编写一个使用PDO的应用程序。我有一个模型抽象类,它定义了id的属性。我创建了一个类,使用每个数据模型独有的属性和方法扩展每个对象模型的抽象,并使用PDO fetchObject从数据库中获取对象。如果id为NULL,我知道它还没有保存。我有一个功能,直到我尝试将序列化对象作为属性传递。当序列化对象的属性包含单引号时,会发生此问题。 (例如迈克的硬柠檬水)这是函数,它位于模态抽象类中:

public function save(DatabaseConnection &$db)
{
    $properties = get_object_vars($this);
    $table = $this->getTableName();
    foreach ($properties as $key => $value) {
        $cols[] = "`$key`";
        $values[] = "'".$value."'";
        if ($value != NULL) {
            $updateCols[] = "`$key`".' = "'.$value.'"';
        }
    }

    $sql = 'INSERT INTO '.$table.' ('.implode(", ", $cols).') VALUES ('.implode(", ", $values).') ON DUPLICATE KEY UPDATE '.implode(", ", $updateCols);
    var_dump($sql);
    $stmnt = $db->prepare($sql);
    return $stmnt->execute($values);
} 

2 个答案:

答案 0 :(得分:0)

foreach ($properties as $key => $value) {
    $value = $db->quote($value);

以这种方式存储对象仍然不是一个好主意。特别是如果对象本身映射到数据库。但它会摆脱你的嵌入式引用问题。

答案 1 :(得分:0)

我明白了!我第一次加入时这个网站很棒。今天似乎只有消极的人只想找到缺陷而不是回答问题,或者煽动那些提供可能解决方案的人。我认为这不是本网站的内容。感谢Cerad提供可能的解决方案。非常感谢您的努力。

public function save(DatabaseConnection &$db)
{
    $properties = get_object_vars($this);
    $table = $this->getTableName();
    $values = array_filter($properties, 'strlen');

    if (array_key_exists('id', $values)) {
        unset($values['id']);
        foreach (array_keys($values) as $col_name) if ($col_name !== 'id') $a[] = "$col_name = ?";
        $valuesString = implode(', ', $a);
        $stmnt = $db->prepare("UPDATE $table SET {$valuesString} WHERE id = {$this->id}");
    } else {
        $columnString = implode(',', array_keys($values));
        $valueString = implode(',', array_fill(0, count($values), '?'));
        $stmnt = $db->prepare("INSERT INTO $table ({$columnString}) VALUES ({$valueString})");
    }
    return $stmnt->execute(array_values($values));
}