想自己写一个框架,便于理解php框架的整体运行体系,一步步来,这个是数据库类。confing在下面。
table('user')->getByAge(18));// $m->limit('0,5')->table('user')->field('age,name')->order('money desc')->where('id>1')->select();//$data = $m->table('user')->field('id,age,name')->limit('0,1')->where('id>0')->order('age desc')->select();/*$data = [ 'name'=>'成龙', 'age'=>'25', 'money'=>'9999'];*/// $insert = $m->table('user')->insert($data);// $delete = $m->table('user')->where('id=4')->delete();//$update = $m->table('user')->where('id=3')->update($data);// $max = $m->table('user')->max('money');// var_dump($m->sql);// var_dump($max);class Model{ //地址 protected $host; //用户名 protected $user; //密码 protected $pwd; //库名 protected $dbname; //字符集 protected $charset; //表前缀 protected $prefix; //链接资源 protected $link; //表名 protected $tableName; //sql语句 protected $sql; //存放查询条件 protected $options; //构造方法,成员变量初始化 function __construct($config) { $this->host = $config['DB_HOST']; $this->user = $config['DB_USER']; $this->pwd = $config['DB_PWD']; $this->dbname = $config['DB_NAME']; $this->charset = $config['DB_CHARSET']; $this->prefix = $config['DB_PREFIX']; //连接数据库 $this->link = $this->connect(); //得到数据表名 $this->tableName = $this->getTableName(); //初始化options数组 $this->initOptions(); } protected function connect() { $link = mysqli_connect($this->host,$this->user,$this->pwd); if (!$link){ die('数据库连接失败'); } mysqli_select_db($link,$this->dbname);//选择数据库 mysqli_set_charset($link,$this->charset);//设置字符集 return $link; } protected function getTableName() { //1,已有成员变量 if (!empty($this->tableName)) { return $this->prefix.$this->tableName; } //2,无成员变量 $className = get_class($this);//获得类名字符串 $table = strtolower(substr($className, 0, -5));//如ArticleModel截取表名截掉后五个字符并转为小写 return $this->prefix.$table; } protected function initOptions() { $arr = ['where','table','field','order','group','having','limit']; foreach ($arr as $value) { //数组内键对应的值清空 $this->options[$value] = ''; //table默认设置为tableName if($value == 'table'){ $this->options[$value] = $this->tableName; }elseif ($value == 'field') { $this->options[$value] = '*'; } } } //field function field($field) { if (!empty($field)) { if (is_string($field)) { $this->options['field'] = $field; }elseif (is_array($field)) { $this->options['field'] = join(',',$field); } } return $this; } //table function table($table) { if (!empty($table)) { $this->options['table'] = $table; } return $this; } //where function where($where) { if (!empty($where)) { $this->options['where'] = 'where '.$where; } return $this; } //group function group($group) { if (!empty($group)) { $this->options['group'] = 'group by '.$group; } return $this; } //having function having($having) { if (!empty($having)) { $this->options['having'] = 'having '.$having; } return $this; } //order function order($order) { if (!empty($order)) { $this->options['order'] = 'order by '.$order; } return $this; } //limit function limit($limit) { if (!empty($limit)) { if (is_string($limit)) { $this->options['limit'] = 'limit '.$limit; }elseif (is_array($limit)) { $this->options['limit'] = 'limit '.join(',',$limit); } } return $this; } //select function select() { //预写一个带占位符的sql $sql = 'select %FIELD% FROM %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%'; //将options中值一次替换占位符。 $sql = str_replace( ['%FIELD%','%TABLE%','%WHERE%','%GROUP%','%HAVING%','%ORDER%','%LIMIT%'], [ $this->options['field'], $this->options['table'], $this->options['where'], $this->options['group'], $this->options['having'], $this->options['order'], $this->options['limit'] ],$sql); //保存sql语句 $this->sql = $sql; //执行sql语句 // echo $sql;die; return $this->query($sql); } //query function query($sql) { //清空options数组 $this->initOptions(); $result = mysqli_query($this->link,$sql); //提取结果集存放到数组中 // var_dump($result); // die; if ($result && mysqli_affected_rows($this->link)) { while ($data = mysqli_fetch_assoc($result)) { $newData[] = $data; } } //返回结果集 return $newData; } //exec function exec($sql,$isInsert = false) { $this->initOptions(); //执行sql $result = mysqli_query($this->link,$sql); if ($result && mysqli_affected_rows($this->link)) { //判断是否插入,返回对应结果 if ($isInsert) { return mysqli_insert_id($this->link); }else{ return mysqli_affected_rows($this->link); } } return false; } function __get($name) { if ($name = 'sql') {//获取sql语句 return $this->sql; } return false; } //insert //$data数组,键为字段名 function insert($data) { $data = $this->parseValue($data); //提取键值 $keys = array_keys($data); $values = array_values($data); $sql = 'insert into %TABLE%(%FIELD%) VALUES(%VALUES%)'; $sql = str_replace( ['%TABLE%','%FIELD%','%VALUES%'], [$this->options['table'], join(',',$keys),join(',',$values)],$sql); $this->sql = $sql; return $this->exec($sql,true); } //给字符串值添加引号 protected function parseValue($data) { foreach ($data as $key => $value) { if (is_string($value)) { $value = "'".$value."'"; } $newData[$key] = $value; } //返回处理后数组 return $newData; } //删除 function delete() { $sql = 'delete from %TABLE% %WHERE%'; $sql = str_replace( ['%TABLE%','%WHERE%'], [$this->options['table'], $this->options['where']],$sql); $this->sql = $sql; return $this->exec($sql); } //更新 function update($data) { $data = $this->parseValue($data); $value = $this->parseUpdate($data); $sql = 'update %TABLE% set %VALUE% %WHERE%'; $sql = str_replace( ['%TABLE%','%VALUE%','%WHERE%'], [$this->options['table'], $value,$this->options['where']],$sql); $this->sql = $sql; return $this->exec($sql); } //拼接语句 protected function parseUpdate($data) { foreach ($data as $key => $value) { $newData[] = $key.'='.$value; } return join(',',$newData); } //聚合 function max($field) { //调用封装方法查询 $result = $this->field('max('.$field.') as max')->select(); //因为查询的是二维数组,所以给出一个下标 return $result[0]['max']; } //析构方法,对象销毁时被调用 function __destruct() { mysqli_close($this->link); } //getByName getByAge//魔术方法,调用不存在方法时激活 function __call($name,$args) { //截取方法名 $str = substr($name,0,5); //截取字段名 $field = substr($name,5); if ($str == 'getBy') {//判断方法名是否正确 return $this->where($field.'="'.$args[0].'"')->select(); } return false; }}?>
'localhost', 'DB_USER' => 'root', 'DB_PWD' => '', 'DB_NAME' => 'tt', 'DB_CHARSET' => 'utf8', 'DB_PREFIX' => '',];?>