在PHP中用单行调用多个函数

时间:2018-04-24 13:57:12

标签: php database

我连接到数据库的所有类都需要从各自的表中获取自定义列的值。所以不是为每个类编写一个函数,有没有办法让我实现我的类扩展的基类,我可以使用该基类函数轻松获取和更新我的数据库上的数据(至少对于简单的数据) 。

class Users extend BaseClass
{
    private $table = "users";
    private $columns = ["name", "email", "password"];
}

所以从外部函数,我可以像这样访问电子邮件值

Users->where("name", "John")->getEmail();

或可能

Users->where("name", "John")->get("email");

我也可以使用此方法将数据更新到数据库。函数where应该是通用的,因此它应该存在于BaseClass中。 (我知道我应该使用的数据库查询,我想知道的是如何在调用get之后调用where并且还可能在需求中设置多个。)

Users->where("name", "John")->where("last_name", "Smith")->get("email");

2 个答案:

答案 0 :(得分:1)

我想你想要这样的东西

abstract class BaseClass
{
    private $where_clauses=[];
    private $columns=[];
    private $table='';

    protected function setData($table,$cols){
        $this->columns=$cols;
        $this->table=$table;
    }

    public function where($key, $value){
        $this->where_clauses[$key]=$value;
        return $this;
    }
    public function get($col){
        $sql='SELECT '.$col.' FROM '.$this->table.' WHERE';
        $first=true;
        foreach($this->where_clauses AS $key=>$val){
            if(!$first) sql.=' AND ';
            $first=false;
            $sql.=$key.' = '.$val;
        }

        // RUN QUERY, Return result
    }

}

请注意,where函数返回对$ this的引用,这是让你将函数调用串起来的(不测试代码)。这也需要一些适应性,让你在同一列上放两个条件。

答案 1 :(得分:0)

使用@AntG答案,这是我提出的一个简单类,可以为单列或多列获取多个WHERE值,并相应地生成一个sql查询。

该类假定您在子类(受保护或公共)中设置了$ table和$ columns值。这个类只是为了节省一些时间和简单的查询。          抽象类DB     {         private $ where_clauses = [];

    public function where($key, $value)
    {
        //escape values here to prevent sql injection.
        if(in_array($key, $this->columns))
        {
            if(!array_key_exists($key, $this->where_clauses))
                $this->where_clauses[$key]=$value;
            else 
            {
                if(!is_array($this->where_clauses[$key]))
                    $this->where_clauses[$key] = [$this->where_clauses[$key], $value];
                else
                    array_push($this->where_clauses[$key], $value);
            }
        }
        else
            trigger_error("Column name was not found: " . "$this->table.$key", E_USER_WARNING);

        return $this;
    }

    public function get($col = "*")
    {
        $sql = "SELECT `$col` FROM `$this->table`";

        if(!empty($this->where_clauses))
        {
            $sql .= " WHERE ";
            $first = true;
            foreach($this->where_clauses as $key=>$value)
            {
                if(!$first) $sql .= ' AND ';
                $first=false;

                if(!is_array($value))
                    $sql .= "`$key` = '$value'";
                else
                {
                    $s = true;
                    $sql .= '(';
                    foreach($value as $_value)
                    {
                        if(!$s) $sql .= ' OR ';
                        $s = false;

                        $sql .= "`$key` = '$_value'";
                    }
                    $sql .= ')';
                }
            }
        }

        //Execute SQL

        $this->where_clauses = [];
    }

}
?>

$u->where("first_name", "John")->where("first_name", "Jane")->where("first_name", "Jake")->where("email", "jane@gmail.com")->get();

这将执行以下SQL,

SELECT * FROM {用户{1}}如first_name WHERE (如first_name = 'John' OR如first_name = 'Jane' OR电子邮件= 'Jake') WHERE AND