PHP MySQL如何组织这段代码?

时间:2011-01-12 20:56:12

标签: php code-organization

我有这个代码(删除了param,只是为了减少一些代码):

private function _get_tag_id($value)
{
    $sql = "INSERT INTO tags (tag, added) VALUES ('$value', ".time().") "
         . "ON DUPLICATE KEY UPDATE tag_id = tag_id";
    $id = execute($sql);

    if (empty($id))
    {
        $sql = "SELECT tag_id FROM tags WHERE tag = '$value'";
        $id = execute($sql);
    }

    return $id;
}

我非常擅长组织我的代码,而且我一直在阅读保持代码干燥的重要性。这包括您可能有的任何疑问吗?例如,我需要对几个字段执行相同的查询,而我所做的就是将其更改为:

private function _get_field_id($field, $value)
{
    $sql = "INSERT INTO {$field}s ({$field}, added) VALUES ('$value', ".time().") "
         . "ON DUPLICATE KEY UPDATE {$field}_id = {$field}_id";
    $id = execute($sql);

    if (empty($id))
    {
        $sql = "SELECT {$field}_id FROM {$field}s WHERE {$field} = '$value'";
        $id = execute($sql);
    }

    return $id;
}

虽然这减少了一些类似的功能,但它也使得查询起初更难阅读。这样做之后的另一个问题是,如果某个字段的查询有时会略有不同,会发生什么?假设该字段是标记,我不再需要添加的列,也许查询现在可以更改为:

$sql = "INSERT INTO {$field}s ({$field}".($field == 'tag' ? '' : ", added").") "
     . "VALUES ('$value', ".($field == 'tag' ? '' : time()).") "
     . "ON DUPLICATE KEY UPDATE {$field}_id = {$field}_id";

现在它开始变得更加凌乱,但我有一种感觉,人们实际上并没有这样做。

我读过的另一件事是功能应该只做一件事。那么我会这样切断这个功能吗?

private function _get_tag_id($value)
{
    $id = $this->_add_tag_id($value);

    if (empty($id))
    {
        $id = $this->_get_tag_id($value);
    }

    return $id;
}

或者以原样保留它会更好吗?

如果您认为我尝试组织代码的方式不正确,也可以随意建议您的方式,或者换句话说,组织这些简单位的最佳方法是什么代码?

1 个答案:

答案 0 :(得分:0)

我会把它颠倒过来 - 首先选择,如果没有找到则插入。

有两个原因:

1)您将更频繁地选择和查找选择和未命中,因此首先选择平均更快。

2)“在重复键上”是INSERT的非标准扩展,如果你在没有它的情况下移动到SQL数据库,将来会引起问题。 (我认为它只是MySQL)。

至于哪个更好,我宁愿尝试理解第一个或第三个。