我有一个以user id
为参数的函数,并返回user data
数组:
function user_get_data( $user_id ) {
$query = "SELECT * FROM users WHERE id = '$user_id'";
...
return $user_data; // associative array
}
用法:
$user_data = user_get_data( 123 );
var_dump( $user_data );
// Outputs:
// array (size=2)
// 'id' => int 123
// 'name' => string 'Juan Vitelli' (length=12)
我有一个带user id
的函数,并返回该用户的帖子数:
function user_get_post_count( $user_id ) {
$query = "SELECT COUNT(*) FROM posts WHERE user_id = '$user_id'";
...
return $post_count;
}
现在我想重写user_get_post_count()
函数,因此它可以直接作为user id
参数,或user data
函数返回的user_get_data()
数组,其中包含该id。像这样......
function user_get_post_count( $user_data_or_id ) {
// get user id
if( is_array( $user_data_or_id ) ) {
$user_id = $user_data_or_id[ "id" ];
} else {
$user_id = $user_data_or_id;
}
// get post count
$query = "SELECT COUNT(*) FROM posts WHERE user_id = '$user_id'";
...
return $post_count;
}
我只是想知道这样的事情是否被视为良好做法或是否有更好的方法。如果这是一个好习惯,我的下一个问题是$user_data_or_id
是否适合我正在做的变量名。
答案 0 :(得分:1)
有不同的方法。您可能想要阅读有关ORM,Active Record,Data Mapper,Query Object的信息。
在你的上下文中,我没有看到传递数组只是为了从中提取“user_id”。如果你传递一个数组,我会说这表明你正在寻找多个“user_id”的“帖子”,或者根据一个特定的标准。也就是说,在另一个更一般的上下文中,您将基于输入参数构建查询。在这种情况下,传递过滤器数组确实会更好。
例如,您的数组可能如下所示:
array('user_id' => 7, 'title'=>'abc','ts_created'=>1234567, 'published'=>1, ...)
使用一些SQL语法构建器,最终会得到如下查询:
SELECT
*
FROM
`posts`
WHERE
`user_id` = 7 AND
`title` LIKE '%abc%' AND
`ts_created` >= 1234567 AND
`published` = 1
.
.
.
如您所见,这将返回与您的搜索条件匹配的结果集。如果您的条件指定了“userID”,那么您只能在结果中返回此用户的“帖子”。
要在OOP中执行此操作,还有几种方法。如果您想将上述内容映射到一个简单的“用户”类,您可以执行以下操作:
class User{
public function getByID($userID){
//sql query
$query = "SELECT FROM users where user_id = $userID"
//execute query and return results
}
}
但是正如您所看到的,如果要为SQL查询指定更多过滤条件,则这不是很灵活。为了使其更灵活,以“帖子”为例,您可以创建一个“帖子”类:
class Post{
/*
* This is not a working code, just an example to give you an idea.
*/
protected $mSQLBuilder;
protected $mTable = 'posts';
public function __construct(){
$this->mSQLBuilder = new SQLBuilder($this->mTable);
}
public function search($filter = array()){
//
$criteria = array('fields'=>array('*'),'filters'=>$filter);
//
$query = $sqlBuilder->build($criteria);
//
return $query->execute()->fetchAll();
}
public function count($filter){
//
$criteria = array('fields'=>array('count(*)'),'filters'=>$filter);
//
$query = $sqlBuilder->build($criteria);
//
return $query->execute()->fetch();
}
public function setSQLBuilder($builder){
$this->sqlBuilder = $builder;
}
}
确保您对ORM和设计模式进行了一些阅读。