2

我正在寻找一种使 MySQL 插入/更新查询更加动态和快速编码的方法,因为有时只需要表单中的另一个字段(例如,在对应用程序进行原型设计时)。这可能是一个愚蠢的问题。

我的想法是在 id 匹配时进行插入或更新,如果表/字段不存在,则使用一个函数动态创建它。

<?php 
// $l is set with some db-login stuff

// creates and inserts
$f[] = nf(1,'this_id_x'); // this_id_* could be a prefix for ids
$f[] = nf('value yep',$fieldname_is_this2)
$tbl_name = "it_didnt_exist";
nyakilian_fiq($l, $tbl_name, $f);
// Done!


//This would do an update on above
$fieldname_is_this2 = "this is now updated";
$f[] = nf(1,'this_id_x'); 
$f[] = nf($fieldname_is_this2); // the function takes the variable name as field name
$tbl_name = "it_didnt_exist";
nyakilian_fiq($l, $tbl_name, $f);

?>
4

2 回答 2

2

我一直在成功使用此功能。它没有添加列,但这违反了我的 MVC 框架的结构。尝试这样的事情:

public function save(DatabaseConnection &$db)
{
    $properties = get_object_vars($this);
    $table = $this->getTableName();
    // $cols = array();
    // $values = array();
    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);

    $stmnt = $db->prepare($sql);
    var_dump($stmnt);
    if ($stmnt->execute($values)) return true;
    return false;
}

我有一个模型抽象类,我为每个数据库表扩展了一个子类。该函数位于模型摘要中。每个子类都包含一个公共属性 [所以我可以使用 PDO::fetchObject()],它对应于表中的列名。如果我需要动态创建表,我会向子类添加一个函数来执行此操作。

于 2013-06-23T17:16:33.543 回答
1

这是非常不可用的方法。

您正在尝试将适合一个体面框架的功能混合到一个函数中(甚至不是一个类(!)。这是不可能的(或对某些部分不可用)。
但它在许多方面类似于主要框架的模型。

所以,我只能给出一些建议

  • 不要动态创建表。数据结构是应用程序的支柱,必须是可靠的。
  • 不要考虑太多(例如“如果通过了 ID”)。对于任何更复杂的情况,它都会束缚你的手
  • 看看一些主要的框架——似乎你的愿望已经通过它们的代码生成功能实现了(在我个人看来,这是 Erath 上曾经存在过的最丑陋的东西)。它们的工作方式与您所说的几乎相同:您只需定义一个模型其余的由框架的方法完成
于 2013-05-21T10:34:02.077 回答