THINKPHP兄弟连李文凯老师视频笔记:13thinkphp中的查询语言

13thinkphp中的查询语言

	普通查询
		在查询带入where条件等,最少有三种形式
		在普通查询里面还可以使用查询表达示
		在此处我会跟大家把查询表达示都讲一次。
		EQ  等于(=)
		NEQ: 不等于(!=)
		GT 大于(>)
		EGT 大于等于(>=)
		LT:小于(<)
		ELT:小于等于(<=)
		LIKE 等价于sql  like
		[NOT] BETWEEN 是指SQL里面的BETWEEN  还可以在前加上not
		[not] in  查询集合
		exp  比较特殊,是指使用标准SQL语句,实现更加复杂的情况
		$data['id']=array('exp','in(3,9,11)')
		因为,如果说
		1,字符串形式
			'id>5 and id<9  ' 在SQL语句当中写的基本形式也是字符串形式
		2,数组形式
			$user=M('user');
			$data['id']='5';  //它只找出用户名为liwenkai的吧?没有办法让其找出id大于的吧?
			$list=$user->where(array('username'=>'liwenkai'))->select();
		3,对象形式
			$user=M('user');
			$a=new stdClass();
			$a->username='liwenkai';
			$list=$user->where($a)->select();
	区间查询
		id>3 and id<10
		$data['id']=array(array('gt',3),array('lt',10));
	组合查询
		$data['username']='liwenkai';
		$data['password']=array('eq','wenkai');
		$data['id']=array('lt',10);
		//where username=liwenkai and  password=wenkai  and id<10 默认的逻辑关系为or的关系
	复合查询
		$data['username']=array('eq','liwenkai');
		$data['password']=array('like','w%');
		$data['_logic']='or';
		$where['_complex']=$where;
		$where['id']=array('lt',5);
		(id<5) and  ( (username='liwenkai') or (password like 'w%') )
	统计查询
		//select count() from
		//$user->count();   //总数	
		//$user->max('字段');	//查量大值
		//$user->min('字段');
		//$user->avg('字段') 平均数	
		//$user->sum('字段')   和
	定位查询
			getN(advModel)
			last
			first
	SQL查询
			execute()     主要用于更新和写入
			query()       主要用于查询
	动态查询	
上面的各种查询语言实在是太麻烦,主要的和经常用到的是execute() 、query()
数据库事务:
$user= new advModel('user');
$user->startTrans();
$user->commit();
$user->rollback();
 
查询锁定\更新锁定
$user->lock(true)->where('status=1')->select();
$user->lock(true)->where('status=1')->data($data)->save();
 
memcached:

serial sort(discontinuous serial combined to start_serial end_serial array)

<?php 
printf(' memory usage: %01.2f MB', memory_get_usage()/1024/1024); 
/*
     * sortBreakProcessor
     * example:
     * $serial    =    array('ab001','ab002','ab003','ab004','ab006','ab008','ab009','ab0010');
     * $start        =    4;
     * $length        =    1;
     * return array(
                  array('ab001','ab004'),
                  array('ab006','ab006'),
                  array('ab008','ab0010'),
                 );
    copy right http:://qqmaster.info/
*/
    $serial    	=    array('ab001','ab002','ab003','ab004','ab006','ab008','ab009','ab0010');
    $start      =    4;
    $length     =    1;
	$re			=	sortBreakProcessor($serial,$start,$length);
	var_dump($re);
    function sortBreakProcessor($serial,$start,$length)
    {
 
            if(!is_array($serial))
            {
                return false;
            }
            if(!isset($serial[0]) && empty($serial[0]))
            {
                return false;
            }
 
            $prefix    			=    substr($serial[0], 0,$start);
            $val    			=    '';
            foreach ($serial as $k=>$v)
            {
                $val[$k]     	=    substr($v, $start,$length);
            }
            //print_r($val);
 
            //Bubble sort
            $val    =    paixu($val);
            //print_r($val);
 
            //get 1,4,6,6,8,10
            $resultArr[]    =    $val[0];
            foreach ($val as $k=>$v)
            {
                if($val[$k]+1<$val[$k+1])
                {
                    $resultArr[]    =    $val[$k];
                    $resultArr[]    =    $val[$k+1];
                }
            }
            $resultArr[]    =    end($val);
            //print_r($resultArr);
 
            foreach ($resultArr as $k=>$v)
            {
                if($k%2==0)
                {
                    $return[] =    array($prefix.$resultArr[$k],$prefix.$resultArr[$k+1]);
                }
            }
            return $return;
    }
 
    //Bubble sort
    function paixu($str) 
    {
        $n=count($str);
        for ($i=0;$i<$n;$i++)
        {    
            for ($j=$n-2;$j>=$i;$j--)
            {
                    if($str[$j+1]<$str[$j])
                    {   
                        $tmp = $str[$j+1];
                        $str[$j+1]=$str[$j];
                        $str[$j]=$tmp;
                    }
 
            }
 
        }
        return $str;
    }

transfer serial from A to B(with a special db struct)

<?php
/*
 * use for to transfer card serial from a to b,but the serial a have is like this ab-cde-000000001 to ab-cde-000000009
 * when i want transfer (ab-cde-000000001 to ab-cde-000000003) or (ab-cde-000000003 to ab-cde-000000005) or (ab-cde-000000006 to ab-cde-000000009) to b
 * so there is a algorithm,see the function transCardById
 * db struct:id aid startSerial endSerial time
 * copy right http://qqmaster.info
 */
function transCardById($db, $startSerial,$endSerial,$serialId,$accountId, $newAccountId)
{
    $result        =    false;
    $serialInfo    =    test::getSerialById2($db,$serialId);
    if(!empty($serialInfo))
    {
        //echo '1';echo '<br />';
        $num                            =    '%1$09d';
        $prefixe                        =    test::getSerialPrefix($startSerial);
        $startSerialSuffix              =    test::getSerialSuffix($startSerial);
        $endSerialSuffix                =    test::getSerialSuffix($endSerial);
        $serialInfoStartSerialSuffix    =    test::getSerialSuffix($serialInfo['serialNumStart']);
        $serialInfoEndSerialSuffix      =    test::getSerialSuffix($serialInfo['serialNumEnd']);
        //echo $startSerialSuffix.'--'.$endSerialSuffix.'--'.$serialInfoStartSerialSuffix.'--'.$serialInfoEndSerialSuffix.'--';
        // 1,5
        if($serialInfoStartSerialSuffix==$startSerialSuffix)
        {
            //echo '2';echo '<br />';
            if($serialInfoEndSerialSuffix==$endSerialSuffix)
            {
                //echo '3';echo '<br />';
                // 1,5
                // update accountId To newAccountId
                $result    =    test::updateSerialById($db,$serialId,$newAccountId);
            }
            elseif($serialInfoEndSerialSuffix>$endSerialSuffix)
            {
                //echo '4';echo '<br />';
                // 1,3
                // update start serial to 4
                // add a record with newAccountId,serial from 1 to 3
                $result    =    test::updateSerialById($db,$serialId,'',$prefixe.sprintf($num,($endSerialSuffix+1)));
                if($result==true)
                {
                    //echo '5';echo '<br />';
                    $result    =    test::addCard($db, $startSerial, $endSerial, $newAccountId);
                }
            }
        }
        elseif($serialInfoStartSerialSuffix<$startSerialSuffix)
        {
            //echo '6';echo '<br />';
            if($serialInfoEndSerialSuffix==$endSerialSuffix)
            {
                //echo '7';echo '<br />';
                // 3,5
                // update end serial to 2
                // add a record with newAccountId,serial from 3 to 5
                $result    =    test::updateSerialById($db,$serialId,'','',$prefixe.sprintf($num,($startSerialSuffix-1)));
                if($result==true)
                {
                    //echo '8';echo '<br />';
                    $result    =    test::addCard($db, $startSerial, $endSerial, $newAccountId);
                }               
            }
            elseif($serialInfoEndSerialSuffix>$endSerialSuffix)
            {
                //echo '9';echo '<br />';
                // 3,4
                // update end serial to 2
                // add a record with accountId ,serial from 5 to 5
                // add a record with newAccountId ,serial from 3 to 4
                $result    =    test::updateSerialById($db,$serialId,'','',$prefixe.sprintf($num,($startSerialSuffix-1)));
                if($result==true)
                {
                    //echo '10';echo '<br />';
                    $result    =    test::addCard($db, $prefixe.sprintf($num,($endSerialSuffix+1)), $serialInfo['serialNumEnd'], $accountId);
                    if($result==true)
                    {
                        //echo '11';echo '<br />';
                        $result    =    test::addCard($db, $startSerial, $endSerial, $newAccountId);   
                    }
                }                   
            }
        }
    }
    return $result;
}
class test
{
    static public function checkSerialMatch($startSerial,$endSerial)
    {
        $result                    =    false;
        $checkStartSerialRight    =    self::checkSerialFormat($startSerial);
        $checkendSerialRight    =    self::checkSerialFormat($endSerial);
        if($checkStartSerialRight==true&&$checkendSerialRight==true)
        {
            //echo  '30';
            $startSerialPrefix    =    self::getSerialPrefix($startSerial);
            $endSerialPrefix    =    self::getSerialPrefix($endSerial);
            if($startSerialPrefix==$endSerialPrefix)
            {
                $startSerial    =    preg_replace('/^'.$startSerialPrefix.'/','',$startSerial);
                $endSerial    =    preg_replace('/^'.$endSerialPrefix.'/','',$endSerial);
                $startSerialNum    =    preg_replace('/^0*/','',$startSerial);
                $endSerialNum    =    preg_replace('/^0*/','',$endSerial);
                if($startSerialNum<=$endSerialNum)
                {
                    $result    =    true;
                }
            }
        }
        return $result;
    }
    static public function checkSerialFormat($serial)
    {
        if(strlen($serial)!=16)
        {
            //echo  '310';
            return false;
        }
//        $serialPrefix    =    substr($serial,0,7);
//        $serialPrefixArr=    explode('|', SERIAL_PREFIX);
//        if(!in_array($serialPrefix, $serialPrefixArr))
//        {
//            //echo  '311';
//            return false;
//        }
        $serialNum        =    substr($serial,-9);
        if(!is_numeric($serialNum))
        {
            //echo  '312';
            return false;
        }
        return true;
    }
    static public function getSerialPrefix($serial)
    {
        if(strlen($serial)!=16)
        {
            return false;
        }
        $serialPrefix    =    substr($serial,0,7);
        return $serialPrefix;       
    }
    static public function getSerialSuffix($serial,$removeZeroFlag=true)
    {
        $return    =    false;
        if(strlen($serial)==16)
        {
            $serialSuffix    =    substr($serial,-9);
            if($removeZeroFlag=true)
            {
                $serialSuffix    =    preg_replace('/^0*/', '', $serialSuffix);
            }
            $return            =    $serialSuffix;
        }
        return $return;       
    }
}