我是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方法中自己的值。
有人可以帮忙。
答案 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::
时的执行点。在大多数情况下,您将要在执行时引用类的范围。我的两个注意事项是:
$this->
时我从未允许使用Reset()
适当的,所以我在这里说的是only hearsay(我有
从未测试过它是真的)
鉴于您的{{1}}方法没有做任何形式的事实 对实例化变量的逻辑,它不会产生任何不利影响 您正在使用的特定代码。但最好从良好开始 编码习惯。有一段时间,如果你这样做,这种做法会咬你 继续用PHP编码。
当你第一次学习PHP时,PHP会非常棒,但是如果你不是coding deliberately,那么当你做任何具有长期影响的项目时,那些使它成为学习的东西经常会回来困扰你。