可以将带有该id的id或数组作为参数的函数

时间:2015-03-09 10:05:36

标签: php

我有一个以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是否适合我正在做的变量名。

1 个答案:

答案 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和设计模式进行了一些阅读。