0

我正在编写一个使用 PDO 的应用程序。我有一个定义 id 属性的模型抽象类。我创建了一个类,它使用每个数据模式独有的属性和方法来扩展每个对象模型的抽象,并使用 PDO fetchObject 从数据库中获取对象。如果 id 为 NULL,我知道它没有被保存。我有一个函数一直有效,直到我尝试将序列化对象作为属性传递。当序列化对象的属性包含单引号时,就会出现问题。(例如 Mike's Hard Lemonade)这是位于模态抽象类中的函数:

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);
} 
4

2 回答 2

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));
}
于 2013-07-27T06:42:16.957 回答
0
foreach ($properties as $key => $value) {
    $value = $db->quote($value);

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

于 2013-07-26T20:12:22.170 回答