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.youkuaiyun.com/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;
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