ThinkPHP及PHP查询小技巧

4 篇文章 0 订阅
3 篇文章 0 订阅

1:关联查询并有的字段名相同查询全部字段

$goodsNum = $cartlistM->field('*,a.id as cid')->join('Goods as b on a.goods_id = b.id')->where(array('a.id' =>$_POST['cartID'] ))->find();

2:查询按条件去处重复值的语句

M('propertytake')->group('batchnum')->where($w)->select();

3:在循环中去除查询selsect()中不符合条件的数组

foreach ($propertyArr as $key=>$val)
 {
 $w['mid'] = $this->mid;
 $w['property_id'] = $val['id'];
 //xxxxxx
 $hasGetYear = count(M('tablename')->group('batchnum')->where($w)->select());
//查询当前资产在本期已收成的消耗资源数量
 $w['batchnum'] = $setBatch;
 $temp_num = M('tablename')->where($w)->sum('nums');
 if(empty($temp_num))
 {
 $temp_num = 0;
 }
if ($hasGetYear >= $goodsArr['getmaxnum']||$temp_num>=$val['totaltree']||$val['totaltree']<=0) { unset($propertyArr[$key]); }else { $treeNum += $val['totaltree']; } }

4:常用函数
由于内容增加单开一篇

5:thinkPHP的事务处理 例://开启事务处理本地数据&打印SQL语句

M()->startTrans();
 //提交
 M()->commit();
 //不提交
 M()->rollback();
 //获取最后一条SQL语句
M()->getLastSql();
db::getLastSql()//用于tp5以上

6:json解析json_decode();json加密json_encode(value);

7:调用父类(被继承类)

parent::memaddress($list['province'],$list['city'],$list['district']);//parent::是父的意思,memaddress是父类中的函数

8:查询方法之过滤查询

distanct(true)
例:
$data=M('user')->distanct(true)->field('score')->order('score asc')->select();

9:thinkPHP在字段值上自增或自减

$newM->where('id='.$cid)->setInc('browser',1); //browser字段值自增1,setDec是自减

10:各种循环(for forech …) 跳出循环return,break,continue三者区别
break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。 break不仅可以结束其所在的循环,还可结束其外层循环。此时需要在break后紧跟一个标签,这个标签用于标识一个外层循环。Java中的标签就是一个紧跟着英文冒号(:)的标识符。且它必须放在循环语句之前才有作用。

public class BreakTest2
{
  public static void main(String[] args){
    // 外层循环,outer作为标识符
    outer:
    for (int i = 0 ; i < 5 ; i++ ){
      // 内层循环
      for (int j = 0; j < 3 ; j++ ){
        System.out.println("i的值为:" + i + " j的值为:" + j);
        if (j == 1){
          // 跳出outer标签所标识的循环。
           break outer;
        }
      }
    }
  }
}

continue的功能和break有点类似,区别是continue只是中止本次循环,接着开始下一次循环。而break则是完全中止循环。

public class ContinueTest
{
  public static void main(String[] args){
// 一个简单的for循环
    for (int i = 0; i < 3 ; i++ ){
       System.out.println("i的值是" + i);
       if (i == 1){
         // 忽略本次循环的剩下语句
         continue;
       }
       System.out.println("continue后的输出语句");
    }
  }
}

return关键字并不是专门用于跳出循环的,return的功能是结束一个方法。 一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束。与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。

public class ReturnTest
{
  public static void main(String[] args){
    // 一个简单的for循环
    for (int i = 0; i < 3 ; i++ ){
      System.out.println("i的值是" + i);
      if (i == 1){
        return;
      }
      System.out.println("return后的输出语句");
    }
  }
}

11:登录失败后,出现验证码
$_SESSION['err_num'] = $err_num;记录并传出错误次数以进行判断

12:内置if标签condition接收session

<if condition="$Think session.err_num neq null">
</if>

PHP过滤器

验证邮箱是否符合邮箱格式
filter_var($email[$i], FILTER_VALIDATE_EMAIL)

filter_var() - 通过一个指定的过滤器来过滤单一的变量
filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
filter_input - 获取一个输入变量,并对它进行过滤
filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
转载 更多过滤函数

thinkphp设置默认访问模块

// 绑定访问Admin模块
define('BIND_MODULE','Mobile');

清除 X-Powered-By:ThinkPHP
修改文件 xxxxxx\ThinkPHP\Library\Think\View.class.php
修改

header('X-Powered-By:ThinkPHP');

header('X-Powered-By:https://mp.csdn.net/mdeditor/79099716');

时间转为时间戳

$mytime=date("Y-m-d 0:0:0", strtotime("-1 day")); //获取前一天的时间
echo $mytime.'<br/>';
echo strtotime($mytime);//转为时间戳

thinkphp I()方法过滤

I('post.email','',FILTER_VALIDATE_EMAIL);//表示 会对$_POST['email'] 进行 格式验证,如果不符合要求的话,返回空字符串。

参考链接

sql 排序一个字段值的后4位

SQL中还有一个SUBSTRING
SUBSTRING( ) 从字符串中提取一个或多个字符 
//示例一显示电话号码的前三个字符(区号)
SELECT SUBSTRING(phone,1,3) FROM employee                            

//示例二:SQL中一个字段的值由汉字+4位数字组成的,查询结果不想包含后面的4位数字
select  left(a, (len(a)-4) ) from 表名

//示例三:假如传进SQL需要查询的是 ‘ABC1234’
select * from Table where 列名 = Substring(‘ABC1234’,1,len(Substring)-4)

//示例1,2显示所需字符 示例3查询所需字符

SQL不规则排序,ORDER BY 不规则排序,case的使用

ORDER BY
case DisplaySize
when 'S' then 1
when 'M' then 2
when 'L' then 3
when 'XL' then 4
when 'XXL' then 5
when '3XL' then 6
end

//示例:
select * from 表名 where 字段名 in (1,12,10,13,11,31) order by case 字段名 when 1 then 1 when 12 then 2 when 10 then 3 when 13 then 4 when 11 then 5 when 31 then 6 end
//tp6中
->where($where)
->orderRaw('field(status,5,2,6,0)')
 ->order('id desc')

tp6随机排序

            ->where("headimgurl","<>","")
            ->where("password","=",0)
            ->orderRaw("rand() , id DESC")
            ->limit(25)
            ->select()
            ->toArray();

model模型内表单验证


前端HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<form action="__URL__/add" method="post">
	<input type="text" name="username"/>
	<input type="text" name="password"/>
	<input type="text" name="repassword"/>
	<input type="submit" value="提交"/>
	<!--{__NOTOKEN__}-->
</form>
 
</body>
</html>

调用的model模型进行验证

<?php
	class UserModel extends Model{
		//参数:
		//1.验证字段(表单中的名称或者辅助字段例如验证码)
		//2.验证规则(结合附加规则一起使用)
		//3.错误提醒
		//4.验证条件(0:1:2:)最好是选择手册中的常量来填写
		//5.附加规则;验证方式:regex;function名;callback;confirm(验证两个字段是否相同);equal;in;unique;
//				常用规则:require:必须存在;email邮箱;url;currency货币;number;
		//6.验证时间
//				是指数据库进行数据库操作时的验证时机(增加数据时,编辑时,全部清空下验证)
//				Model::MODEL_INSERT
//				Model::MODEL_UPDATE
//				Model::MODEL_BOTH
		protected $patchValidate = true; // 系统支持数据的批量验证功能, 	
		//自动验证开始
		protected $_validate=array(
			array('username','require','用户名必填',0,0,1),
			array('username','checklen','用户名长度不合法',0,'callback',3),
			array('username','unique','用户名已存在',0,'callback',3),
			array('password','require','用户名必填',0,0,1),
			array('repassword','require','用户名必填',0,0,1),
			array('password','repassword','密码不一致',0,'confirm',1),
//			array('createip','email','邮箱格式不对',0,'regex',1),
		);
		public function checklen($data){
			if (strlen($data)>15||strlen($data)<5)
				return FALSE;
			return true;
		}
		function modelTest(){
			echo '测试的跨模型操作,调用模型中的方法';
		}
	}
?>

控制器调用模型完成主体

<?php
/**
 * ThinkPHP中的
 * 自动验证(Action中create方法时生效)
 * 		主要写在自定义模型中,完成输入信息的时候对表单或者数据库中的字段进行验证
 * 自动完成
 * 		用户输入的字段并不是用户手动填写的
 * 字段映射
 * 		防止用户从前台看到的字段名称而猜出数据库表中的字段名称
 *
 */
class AutoAction extends Action{
	public function index(){
		$this->display();
	}
	function add(){
		//经过自定义模型
		$user=D('user');
		if ($user->create()) {
			if ($user->add()){
				$this->success("注册成功");
			}else{
				$this->error($user->getError());
			}
		}else{
			$this->error($user->getError());
		}
	}
}
?>

按天进行分组查询

//TIME为int格式时间戳的字段名,所以用FROM_UNIXTIME进行转换
// $num = -intval($_POST['num']);
// $time = strtotime(date("Y-m-d 0:0:0",strtotime("$num day")));
//TIME>=".$time." 为前n天内按每天进行数据统计
$sql="select count(id) as ids,FROM_UNIXTIME( regtime, '%Y-%m-%d' ) AS time from 表名 where TIME>=".$time." GROUP BY FROM_UNIXTIME( TIME, '%Y-%m-%d' ) order by id desc";

//如果是create_time时间格式用DATE_FORMAT

如果每组只取最新一条记录
select * from (
    select * from table_name order by create_time desc limit 100000
) as t
group by t.id;


保留数字的小数点后4位

//更新
update 表名 set 字段名 = ROUND(字段名,4)
//查询
select cast(293209.5 as decimal(18,4)) from 表

Mysql查询按指定字段的指定值进行排序

select * from tablename order by (case when Age = 18 then 0 else 1 end)
//如果Age等于18就排在最前面,其他的排在最后面

MySQL中concat函数拼接

select concat (id,,,name) as info from t1;

MySQL中concat函数

sql教程
sql函数用法教程

php今天24点时间戳

strtotime(date('Y-m-d 23:59:59', time()));//今天24点

sql统计某个字段出现次数,如name

select name,count(0) as 重复次数 from grade group by name having count(name) > 0 order by 重复次数

如何判断页面是通过返回按钮进入

window.addEventListener('pageshow', function (event) {
        if(event.persisted || window.performance && window.performance.navigation.type == 2){
            console.log('window.performance.navigation.type: '+ window.performance.navigation.type);
            // alert("监听到是点击返回按钮进入本页的了")
            location.reload();
        }
    },false);

在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。(有关group by的知识请戳:浅析SQL中Group By的使用)
distinct用来查询不重复记录的条数,即用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段。DISTINCT 根据group的字段分组去重。

"group_concat(distinct sys_role.name SEPARATOR ' / ') AS role_name",

$summarySql  = Db::table('xxxx')
            ->field('aaaa,count(DISTINCT(id) )  as num')
            ->where('ddd', 0)
            ->group('aaaa')
            ->buildSql();

sql 统计查询某一字段的某一个值的总条数

SELECT
	sum( CASE WHEN meeting_live = 1 THEN 1 ELSE 0 END ) AS a1 ,
	sum( CASE WHEN meeting_live = 2 THEN 1 ELSE 0 END ) AS a2 ,
	sum( CASE WHEN meeting_live = 3 THEN 1 ELSE 0 END ) AS a3 
FROM
	met_meeting 

在这里插入图片描述
MYSQL中 find_in_set() 函数用法详解
FIND_IN_SET(str,strlist) : str 要查询的字符串,strlist 需查询的字段,参数以”,”分隔,形式如 (1,2,6,8,10,22);该函数的作用是查询字段(strlist)中是否包含(str)的结果,返回结果为null或记录。
假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号( , )时将无法正常运行。

SELECT FIND_IN_SET('b', 'a,b,c,d');
// 结果:2
// 因为 b 在strlist集合中2的位置, a是位置1
 
select FIND_IN_SET('1', '1');
// 结果:1 
// 这时候的strlist集合有点特殊,只有一个字符串
 
select FIND_IN_SET('2', '1,2'); 
// 结果:2
 
select FIND_IN_SET('6', '1'); 
// 结果:0 strlist中不存在str,所以返回0。

tp6按简单条件统计数据

$where[] = ['table.delete_time', '=', 0];
        $field   = [
            'count( table.id ) AS total',
            'SUM( CASE WHEN field_name = 3 THEN 1 ELSE 0 END ) AS num1',
            'SUM( CASE WHEN field_name < 3 THEN 1 ELSE 0 END ) AS num2',
            'SUM( CASE WHEN field_name1 = 1 THEN 1 ELSE 0 END ) AS f1num1',
            'SUM( CASE WHEN field_name1 = 2 THEN 1 ELSE 0 END ) AS f1num2',
            'SUM( CASE WHEN field_name1 = 3 THEN 1 ELSE 0 END ) AS f1num3',
            'SUM( CASE WHEN field_name1 = 4 THEN 1 ELSE 0 END ) AS f1num4',
        ];
        return Db::table('table')
            ->field($field)->where($where)->find();

SQL中的替换函数replace总结
这里我要替换字段name里面的字符t,替换为p,sql:

SELECT *,REPLACE(name,'t','p') as new_name FROM visit LIMIT 1

在这里插入图片描述
复杂分组统计查询

SELECT u.name, SUM(s.score) AS total_score
FROM user_info u
JOIN user_score s ON COALESCE(FIND_IN_SET(s.id, u.sub_id), u.id = s.id)
GROUP BY u.name

在这里插入图片描述
一个表里有有15条数据 num_id是从1到15,想将其更新为30到45

UPDATE your_table  
SET num_id = 30 + (num_id - 1)  
WHERE num_id BETWEEN 1 AND 15;

// 经测试使用
UPDATE bzxx  
SET num_id = num_id + 3396  
WHERE num_id BETWEEN 1 AND 3320
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值