原生查询,尽量不使用,使用构造器。
class Demo { //1. 原生查询是直接调用Connection类中的query()和execute()来实现。 //2. query()实现读操作,主要用于select语句和存储过程的查询。 //3. execute()实现写操作,例如新增,更新与删除等。 public function select() { echo "select 方法"; //用命名占位符: 用关联数组(顺序可以随意) $sql="SELECT namecn,id FROM about WHERE id> :id LIMIT :num"; //$res=Db::query($sql,['id'=>3,'num'=>3]); //[ SQL ] SELECT namecn,id FROM about WHERE id> '3' LIMIT '3' [ RunTime:0.000270s ] //参数默认传入的是字符串,所以还需要转换 $res=Db::query($sql,['id'=>[3,\PDO::PARAM_INT],'num'=>[3,\PDO::PARAM_INT]]); //[ SQL ] SELECT namecn,id FROM about WHERE id> 3 LIMIT 3 [ RunTime:0.000403s ] dump($res); } public function update() { //更新操作 $sql="UPDATE about SET introctioncn = :introction WHERE id= :num "; //注意,:后面不能有空格 Db::execute($sql,['introction'=>'更新字段值','num'=>[19,\PDO::PARAM_INT]]); //如果操作失败,会自动终止运行,并输出异常 return '更新成功'; } }
一、新增单条记录 INSERT()
public function insert() { //新增单条记录 $data=[ 'namecn'=>'荣誉', 'introctioncn'=>'荣誉描述', 'orderid'=>'2' //注意是以英文逗号分开,不是以分号,经常容易犯错。最后一个不要分号,可以练成一行去写,这样就可以知道后面不需要分号了 ]; $num=Db::table('about') ->data($data) ->insert(); //行与行之间没有分隔符号,理解为$num=Db::table('about')->data($data)->insert();即可 $id=Db::getLastInsID(); return $num ? 'data方式新增单条记录,一般最常用的就是这个。添加记录,id='.$id : 'No记录'; //inserrGetId()==insert()+getLaseInseID() 直接二合一操作 //$num=Db::table('about')->insertGetId($data); //return $num ? 'insertGetId方式新增单条记录,添加记录,id='.$num : 'No记录'; //一般不会在find 和select后面加参数,这方法叫终结方法,不是链式调用 //一般不会在find 和select后面加参数,这方法叫终结方法,不是链式调用 }
二、新增多条记录 INSERTALL()
public function insertall() { $data=[ ['namecn'=>'技术','introctioncn'=>'程序员','orderid'=>'1'], ['namecn'=>'UI','introctioncn'=>'美女','orderid'=>'2'], ['namecn'=>'架构师','introctioncn'=>'男的多','orderid'=>'3'] ]; $num=Db::table('about')->data($data)->insertAll(); // INSERT INTO `about` (`namecn` , `introctioncn` , `orderid`) VALUES ( '技术','程序员',1 ) , ( 'UI','美女',2 ) , ( '架构师','男的多',3 ) [ RunTime:0.002119s ] return $num ? 'insertAll方式新增多条记录,添加记录为'.$num : 'No记录'; }
三、查询
备注:->field(['id'=>'主键','namecn'=>'名称','introctioncn'=>'简介'])
查询中使用别名的方法都不成功(find和select都一样),提示(不支持的数据表达式);使用环境是iis7.5,php5.6或7
if ($strict && !preg_match('/^[\w\.\*]+$/', $key)) { throw new Exception('not support data:' . $key); }
3.1 find()方法
public function find() //find只能支持主键,不能放条件 { //查询单条记录 //$res=Db::table('about')->find(19);//查询主健为19的记录 //table 获取完整的表名,find获取满足条件的第一一条 //另外一种写法 $res=Db::table('about') //->field('id,namecn,introctioncn') //查询指定的列,如果全部查询,可以省略此条件 //->where('id','>',19) //where(字段 表达式 值) ->field(['id','namecn','introctioncn']) //放在数组中,可以直接使用 //->field(['id'=>'主键','namecn'=>'名称','introctioncn'=>'简介']) //别名 ->where('id','>',19) //where(字段 表达式 值) ->find();//查询主健为19的记录 dump($res); }
3.2 select()
public function select() { $res=Db::table('about') //链式调用 ->field(['id','namecn','introctioncn']) //->field(['id'=>'序号','namecn'=>'标题','introctioncn'=>'描述']) //不支持 // //->where('id'>15) //字符串形式 ->where('id','>',15) //表达式 //->order('orderid asc') ->order('orderid', 'asc')//表达式 ->limit(3) ->select(); dump($res); }
四、更新 UPDATE()
public function update() { //更新操作必须是基于前置查询,不允许无条件更新,否则不能执行 //update()也是一个终极方法 //将排序小于等于2的记录,增加3 /*$num= Db::table('about') ->where('orderid','<=',2) ->data(['orderid'=>Db::raw('orderid+3')])//raw获取原始数据,不转译(否则orderid是字符串,表达式会出错,不能相加);data是数组,所以用[] ->update();*/ //更新多条记录 $num=Db::table('about') ->update(['orderid'=>20,'id'=>25]);//根据条件更新单条记录 return $num ? '更新成功,更新'.$num.'记录' : 'No记录'; }
注意:raw获取原始数据,不转译
五、删除 DELETE()
public function delete() { //删除必须基于前置查询,不允许无条件删除 //delete() 终极方法 $num=Db::table('about')->delete(24); return $num ? '单条记录删除,删除'.$num.'记录' : 'No记录'; /*$num=Db::table('about')->delete([25,26,27]); //多条记录以数组的方式记录 return $num ? '多条记录删除,删除'.$num.'记录' : 'No记录';*/ //$num=Db::table('about')->where('id',28)->delete(); /* $num=Db::table('about') ->where('id','>',29) //链式方法,方便阅读及写注释 ->delete(); return $num ? '多条记录删除,删除'.$num.'记录' : 'No记录';*/ /*$num=Db::table('about') ->where(ture) //这样也可以删除,一般不这么写 ->delete();*/ /* $num=Db::table('about')->delete(ture);//清空about表的所有数据,建议使用软删来实现,用更新来模式删除 return $num ? '多条记录删除,删除'.$num.'记录' : 'No记录';*/ //在实际的开发过程中,尽可能不要在控制器中直接操作数据库,而是采用模式来实现 //模型都是基于数据库操作, }