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