我的数据库类问题

时间:2013-08-09 20:31:38

标签: php oop mysqli

我是OO PHP的新手,我创建了一个数据库类,当我使用JOIN方法构建我的SELECT查询时遇到了问题。

如果我在函数中执行查询。

<?php
    require_once("class.Database.php");

    function test1($db) {
        $test1 = $db->Select("*")
            ->From("Table1")
            ->Join("Table2","table_2_id = table_1_id")
            ->Join("Table3","table_3_id = table_2_id")
            ->BuildSelect();

        return $test1;
    }

    function test2($db) {
        $test2 = $db->Select("*")
            ->From("Table4")
            ->Join("Table5","table_5_id = table_4_id")
            ->Join("Table6","table_6_id = table_5_id")
            ->BuildSelect();

        return $test2;
    }

    echo test1($db);
    echo "<br>";
    echo test2($db);
?>

问题是First函数 - test1将打印出来 - SELECT * FROM Table1 LEFT JOIN Table2 ON table_2_id = table_1_id LEFT JOIN Table3 ON table_3_id = table_2_id - 这很好

但是第二个函数test2将打印出来 - SELECT * FROM Table4 LEFT JOIN Table2 ON table_2_id = table_1_id LEFT JOIN Table3 ON table_3_id = table_2_id LEFT JOIN Table5 ON table_5_id = table_4_id LEFT JOIN Table6 ON table_6_id = table_5_id

test2函数似乎打印出test1函数的JOIN方法中的值以及JOIN方法中自己的值。

有人可以帮忙。

1 个答案:

答案 0 :(得分:1)

您需要添加Reset()方法。

每个调用都会重置除join数组之外的所有成员变量。例如:

$this->where = trim($where);

每次调用where方法时,都会替换Where()成员。相反,您使用Join()方法执行此操作:

 $this->join[] = ...

这会在成员数组的末尾添加一个值,而不是重写数组中已有的值。它与使用array_push() (see here)

具有相同的效果

我要提出的最后一个建议是在Reset()结束时致电BuildSelect(),这样您就不必记得在查询中这样做,但看起来你做了那。不过,我的建议是改变这个:

self::Reset();

对此:

$this->Reset();

实际上,要么会工作,PHP会使它们在功能上与你想要完成的事情相同,但其他语言并不宽容。 ::旨在用于调用静态成员,但早期版本的PHP执行“自动”操作,即实现从实例化类调用self::并将$this->视为self:: }

我的理解是,PHP(5.3+)的更高版本引用了定义时范围中包含的内容,而不是使用self::时的执行点。在大多数情况下,您将要在执行时引用类的范围。我的两个注意事项是:

  1. $this->时我从未允许使用Reset() 适当的,所以我在这里说的是only hearsay(我有 从未测试过它是真的)

  2. 鉴于您的{{1}}方法没有做任何形式的事实 对实例化变量的逻辑,它不会产生任何不利影响 您正在使用的特定代码。但最好从良好开始 编码习惯。有一段时间,如果你这样做,这种做法会咬你 继续用PHP编码。

  3. 当你第一次学习PHP时,PHP会非常棒,但是如果你不是coding deliberately,那么当你做任何具有长期影响的项目时,那些使它成为学习的东西经常会回来困扰你。