插入单条记录,成功返回 主键id, 失败返回 false;
插入多条数据,成功返回 插入第一条数据的id , 失败返回 false;
1、原生sql语句
$Model = new Model(); // 实例化一个空模型 $Model = M();
$sql = "select * from mk_user";
$res = $Model->query($sql); //读取 select
$sql = "insert into onethink_action (name,title) values ('12121212','111'),('1212121222','222')";
$res = $Model->execute($sql); //写入 update insert delete
获取最新插入的id(两种方法):
var_dump(mysql_insert_id()); // 第一种
$res2= $Model->query("select last_insert_id()");
var_dump($res2); // 第二种
echo $Model->getLastSql(); //返回最后一条执行语句
echo $Model->getLastInsID(); //返回最新插入数据的id
2、框架sql语句
$person = M("Person");
$res = $person->select(); //返回一个多结果标准查询(数组形式)
$res2 = $person->find(); //返回一个单结果标准查询(数组形式)
$res3 = $person->query('select * from person'); //原生查询 返回一个多结果标准查询(数组形式)
$res4 = $person->query('select * from person limit 1'); //原生查询 返回一个单结果的二位维数组
$info = $goods ->where("goods_price > 1000 and goods_name like '索%' ") ->select();//价格大于1000元的商品
$info = $goods ->field("goods_id,goods_name") ->select(); //查询指定字段
$info = $goods ->limit(5,5) ->select();//限制条数
//分页page
$data = M('User')->field('id,user_name')->order('id asc')->page(1,5)->select();
//group分组操作:
$data = M('User')->field('score,count(*) as total')->having('score >= 20')->group('score')->select();
//多表查询 table方法 table(array('表名'=>'别名')) 表名需要加前缀
$data = M()->table(array('mk_user'=>'user','mk_userinfo'=>'info'))->where('user.id=info.user_id')->select();
//多表查询 join方法 join()支持字符串和数组(数组只能有一个join)
$data = M('user')->join(array('mk_userinfo On mk_userinfo.user_id = mk_user.id'))->slect();
$data = M('user')->join('mk_userinfo On mk_userinfo.user_id = mk_user.id')->slect();
$data = M('user')->join('Right join mk_userinfo On mk_userinfo.user_id = mk_user.id')->slect();
//多表查询 union查询 union('string array',true/false) 默认false
$data = M('user')->field('user_name')->union('select user_name from mk_user2')->select();
$data = M('user')->field('user_name')->union(array('field'=>'user_name','table'=>'mk_user2'))->select();
//过滤查询 distinct
$data = M('user')->distinct(true)->field('score')->union('score asc')->select();
//查询同一字段不同值共多少个
SELECT count(DISTINCT name) as sum FROM `onethink`
3、防止sql注入
1、查询条件尽量使用数组方式,这是更为安全的方式;
2、如果不得已必须使用字符串查询条件,使用预处理机制;
3、使用自动验证和自动完成机制进行针对应用的自定义过滤;
4、如果环境允许,尽量使用PDO方式,并使用参数绑定。
【查询条件预处,理针对字符串条件】:
where方法使用字符串条件的时候,支持预处理(安全过滤),并支持两种方式传入预处理参数,例如:
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
模型的query和execute方法 同样支持预处理机制
$model->query('select * from user where id=%d and status=%d',$id,$status);
$model->query('select * from user where id=%d and status=%d',array($id,$status));
execute方法用法同query方法。
【普通查询,数组条件】:
$User = M("User");// 实例化User对象
$map['name'] = 'thinkphp';
$map['status'] = 1;
// 把查询条件传入查询方法
$User->where($map)->select();
【表达式查询,数组条件】:
$username = I('post.username');
$Auth_admin = M('Auth_admin');
$data['username'] =array('eq',$username);
info = $Auth_admin ->where($data)->select();
4、切换数据库
config 添加 数据库配置
'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp#utf8'; //数据库配置2
1、如果采用的是M方法实例化模型的话,也可以支持传入不同的数据库连接信息
$User = M('User','other_','mysql://root:1234@localhost/demo#utf8'); //实例化定义
表示实例化User模型,连接的是demo数据库的other_user表,采用的连接信息是第三个参数配置的。如果我们在项目配置文件中已经配置了DB_CONFIG2的话,也可以采用:
$User = M('User','other_','DB_CONFIG2');
2、
'ot' => 'mysql://root:123456@localhost/onthink#utf8', config配置文件添加
$kf_model = M('','','ot');
$re = $kf_model->query("select * from agent_enterprise");
var_dump($re);exit;
3、
$model = M("onethink_user",null,"ot");
$info = $model->field('name,age')->where($map)->find();
注意:跨库操作打印最后执行的sql方法:
$onethink_model = M('','','onethink');
$rs = $onethink_model->execute("update onethink_action set name = '123' where id= '1'");
var_dump($rs); //返回 1
var_dump($onethink_model->getLastSql()); //返回 update onethink_action set linkman = '123' where Uid = 'XXXX'
$m1 = M("onethink.Action","onethink_"); //onthink库 onethink_action表
$rs1 = $m1->where("uid = 'XXXX'")->save(array("linkman"=>'1111'));
var_dump($rs1); // 返回 1
var_dump($m1->getLastSql()); // 返回 UPDATE onthink.onethink_action SET `linkman`='1111' WHERE ( uid = 'XXXX' )
$m1 = M("onethink_action",null,"onethink");
$rs1 = $m1->where("Uid = 'XXXX'")->save(array("linkman"=>'222'));
var_dump($rs1); // 返回 1
var_dump($m1->getLastSql());exit; // 返回 null,执行成功,但是不能打印最后执行的sql语句
5、跨库操作数据时,在当前控制器下调用新建model(model名为不存在的表名)
model: class PhonesetModel extends Model{ protected $connection = 'onethink'; protected $tablePrefix = 'onethink_'; public function getEnterPriseInfo($siteid, $fileds = '*'){ $onethink_model = M('','','onethink'); $name_tmp = $onethink_model->query(sprintf("SELECT %s FROM onethink_action WHERE id='%s'", $fileds, $siteid)); return $name_tmp; } } 控制器: namespace Admin\Controller; class ArticleController extends AdminController { public function phonebill(){ $id = '1'; $onethink_model = M('','','onethink'); $res = D("Phoneset")->getEnterPriseInfo($id, $fileds = 'createtime'); var_dump($res);exit; } }
6、数据库 多个表前缀
单个表前缀
$m = M('Action'); $res = $m->select(); var_dump($res);die;
在维护的时候,不可避免的会遇到以前没有设置表前缀,或者开发不规范导致多个表前缀的问题,怎么多个表前缀同时存在的情况下,正确实例化M呢?
1、使用table方法 (完整的书写表明) table方法也属于模型类的连贯操作方法之一,主要用于指定操作的数据表 一般情况下,操作模型的时候系统能够自动识别当前对应的数据表,所以,使用table方法的情况通常是为了: 1)、切换操作的数据表; 2)、对多表进行操作; $Model = M(); $Model->table('think_user')->where('status>1')->select(); 也可以在table方法中指定数据库,例如: $Model->table('db_name.think_user')->where('status>1')->select(); 2、M(),方法第二个参数设置表前缀 function M($name='', $tablePrefix='',$connection='') M 方法,第2个参数就可设置不同前缀,第3个参数还可连接其他数据库 比如:有两个表 ob_students、tb_students $res = M('article_category')->select(); 或者: $res = M('students','tb_')->select(); var_dump($m->getLastSql()); var_dump($res); 3、动态配置表前缀 var_dump(C('DB_PREFIX'));//获取当前表前缀,默认表前缀为 ks_ C('DB_PREFIX','tb_');//动态设置 var_dump(C('DB_PREFIX'));//打印当前表前缀 $res = M('students')->select(); var_dump(M('students')->getLastSql()); var_dump($res); C('DB_PREFIX','ks_');//操作完毕后,修改为原来的表前缀 ks_ var_dump(C('DB_PREFIX'));//查看标签是否修改回来 $res = M('article_category')->select(); var_dump(M('article_category')->getLastSql()); var_dump($res);
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn