thinkphp3.2--数据库操作

插入单条记录,成功返回 主键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);


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论