我正在编写一个使用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);
}
答案 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));
}