开发小结

来源:互联网 发布:方知父母恩上一句 编辑:程序博客网 时间:2024/05/22 01:52

composer安装ThinkPHP5

D:\wamp64\www\17xiu>php think build --config build.php

Successed
***********************************
1.多表联查 users userinfo detail 表
select id,detail,phone,age from users inner join userinfo on users.id = userinfo.user_id inner join detail on userinfo.user_id = detail.detail_id;


select * from T1 left join T2 on T1.userid = T2.userid
$res = $a->join('left join a on a.id = b.id left join b.id = c.id')->select();




原生:分组联合查询
SELECT * from tb_user a LEFT JOIN (select count(app_id),user_id from tb_app GROUP BY user_id) b on a.user_id = b.user_id; 


SELECT * from tb_user u INNER JOIN tb_user_role ur on u.user_id = ur.uid;


删除表中所有数据并清除auto_increment:truncate table items;


普通索引:最基本的索引,不具备唯一性,就是加快查询速度
注:可以使用key,也可以使用index 。index 索引名称(字段)  ,索引名称,可以加也可以不加,不加使用字段名作为索引名。。
mysql> create table demo( id int(4), name varchar(20), pwd varchar(20), index(pwd) );
删除索引
mysql> alter table demo drop key pwd; 注意此处的pwd指的是索引的名称,而不是表中pwd的那个字段
再用alter添加
mysql> alter table demo add key(pwd);


唯一索引


与普通索引基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一,用来约束内容,字段值只能出现一次。应该加唯一索引。唯一性允许有NULL值<允许为空>。


mysql> create table demo3(id int(4) auto_increment primary key, uName varchar(20), uPwd varchar(20), unique  index  (uName));


php think build --config build.php
++++++++++++++++++++++++++++++++++++++++++++++++++++======================================
2.Mysql原生语句拼接 


$where['_string'] = 'find in set';
如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N。


SQL> SELECT FIND_IN_SET('b','a,b,c,d');
+---------------------------------------------------------+
| SELECT FIND_IN_SET('b','a,b,c,d')                       |
+---------------------------------------------------------+
| 2                                                       |
+---------------------------------------------------------+
1 row in set (0.00 sec) ;


$where['_string'] = 'datetime > '.time().;




++++++++++++++++++++++++++++++++++++++++++++++++++++======================================
3.SQL函数


dayofweek(date)    
返回日期date是星期几(1=星期天,2=星期一,……7=星期六,odbc标准)  
mysql> select dayofweek('1998-02-03');    
  -> 3    
weekday(date)    
返回日期date是星期几(0=星期一,1=星期二,……6= 星期天)。 
  
mysql> select weekday('1997-10-04 22:23:00');    
  -> 5    
mysql> select weekday('1997-11-05');    
  -> 2    
 
dayofmonth(date)    
返回date是一月中的第几日(在1到31范围内)    
mysql> select dayofmonth('1998-02-03');    
  -> 3    
 
dayofyear(date)    
返回date是一年中的第几日(在1到366范围内)    
mysql> select dayofyear('1998-02-03');    
  -> 34    
 
month(date)    
返回date中的月份数值    
mysql> select month('1998-02-03');    
  -> 2    
 
dayname(date)    
返回date是星期几(按英文名返回)  
mysql> select dayname("1998-02-05");    
  -> 'thursday'    
 
monthname(date)    
返回date是几月(按英文名返回)  
mysql> select monthname("1998-02-05");    
  -> 'february'    
 
quarter(date)    
返回date是一年的第几个季度    
mysql> select quarter('98-04-01');    
  -> 2    
 
week(date,first)   
返回date是一年的第几周(first默认值0,first取值1表示周一是
周的开始,0从周日开始)  
mysql> select week('1998-02-20');    
  -> 7    
mysql> select week('1998-02-20',0);    
  -> 7    
mysql> select week('1998-02-20',1);    
  -> 8    
 
year(date)    
返回date的年份(范围在1000到9999)    
mysql> select year('98-02-03');    
  -> 1998    
 
hour(time)    
返回time的小时数(范围是0到23)   
mysql> select hour('10:05:03');    
  -> 10    
 
minute(time)    
返回time的分钟数(范围是0到59)    
mysql> select minute('98-02-03 10:05:03');    
  -> 5    
 
second(time)    
返回time的秒数(范围是0到59)   
mysql> select second('10:05:03');    
  -> 3    
 
period_add(p,n)    
增加n个月到时期p并返回(p的格式yymm或yyyymm)    
mysql> select period_add(9801,2);    
  -> 199803    
 
period_diff(p1,p2)    
返回在时期p1和p2之间月数(p1和p2的格式yymm或yyyymm)  
mysql> select period_diff(9802,199703);    
  -> 11    
4.前一天,后一天函数
echo "今天:",date("Y-m-d",strtotime("18 june 2008")),"<br>";
 
echo "昨天:",date("Y-m-d",strtotime("-1 day")), "<br>";
 
echo "明天:",date("Y-m-d",strtotime("+1 day")), "<br>";
 
echo "一周后:",date("Y-m-d",strtotime("+1 week")), "<br>";
 
echo "一周零两天四小时两秒后:",date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")), "<br>";
 
echo "下个星期四:",date("Y-m-d",strtotime("next Thursday")), "<br>";
 
echo "上个周一:".date("Y-m-d",strtotime("last Monday"))."<br>";
 
echo "一个月前:".date("Y-m-d",strtotime("last month"))."<br>";
 
echo "一个月后:".date("Y-m-d",strtotime("+1 month"))."<br>";
 
echo "十年后:".date("Y-m-d",strtotime("+10 year"))."<br>";




++++++++++++++++++++++++++++++++++++++++++++++++++++======================================
4.OOP笔记
面向对象OOP


// 完整类结构
===========================================================================
[修饰词] class A extends B implements C,D
{
public $name;
protected $age;


private function fun()
{}
}


面向对象三大特点:
======================================================================
1.(*)封装
本类 子类外部
public 可以 可以 可以
protected 可以 可以 不可以
private 可以 不可以 不可以


2.(*)继承
class Demo extends parent
{


}
3.(*)多态


抽象类
abstract class demo
{
public abstract function fun();
}
接口
interface A
{
const HOST = 'localhost';


public function fun();
}


class B implements A
{
public function fun(){}
}


常见的关键字
======================================================================
(*)this
(*)parent::fun()
(*)self:类内部调用静态属性,常量
final:修饰类和方法,类不能被继承,方法不能被覆盖
static:
静态属性:
(*)内部:self::属性名
(*)外部:类名::属性名
对象名::属性名
静态方法:
(*)内部:self::方法名
外部:
$obj->方法名
(*)类名::方法名
对象::方法名


// 在静态方法中不可以使用非静态方法和属性
static function fun(){
echo $this->name;
}
clone:普通赋值
$p = $obj; 引用赋值
$p = clone $obj;普通赋值
(*)const:常量
const HOST = 'localhost';
instanceof:(类型约束)


魔术方法
(*)__set($param,$value):设置非公有属性时自动调用
(*)__get($param):获取非公有属性时自动调用
(*)__construct():实例化(new 类)自动调用的方法


__destruct():对象被删除的时候,自动调用的方法
__isset($param):判断非公有属性是否存在(isset或者empty)
__unset($param):删除一个非公有属性时
(*)__call($functionName,$arguments)):调用一个不存在的方法的时候
(*)__toString():输出一个对象的时候
__sleep():串行化的时候
__wakeup():反串行化
__clone():克隆对象的时候
__call():


魔术函数
(*)__autoload():自动加载不存在的类函数
serialize():串行化
unserialize():反串行化


类函数
get_class($obj):获取对象的类名
get_class_methods($className):获取类的方法名
get_object_vars($obj):获取对象的属性
class_exists():判断一个类是否存在
get_parent_class():获取父类名
method_exists()
property_exists()


(*)PDO对象
===============================================
1.query()
2.exec()
3.setAttribute()
4.getAttribute()


5.beginTransaction()
6.commit()
7.rollback()


8.prepare()


注意:query()和prepare()返回的是pdostatements对象


(*)PDOStatement
=================================================
1.fetch()  PDO::FETCH_ASSOC(关联数组) PDO::FETCH_OBJ
2.fetchAll()
3.execute()
4.rowCount()
5.bindValue()
6.bindParam()


异常处理 PDOException
============ =====================================
try
{
throw new Exception('错误消息');
}catch(Exception $e){
echo $e->getMessage();
}


********++++++++++++++++++++++++++++++++++++++++======================================
5.JS处理图片加载失败
a.$('img').error(function(){
            $(this).attr('src', "default.jpg(默认图片的url地址)");
         });
b.<img src='test.jpg' alt='test' onerror="this.src='default.jpg'">


********++++++++++++++++++++++++++++++++++++++++======================================
6.数据表设计三范式的设计与理解
a.1NF是关系型数据库中的最基本要求,就是要求记录的属性是原子性,不可分,就是属性不能分,这是关系型数据库的基本要求,不满足这个就不能叫关系型数据库了(原子不可再分性)


b.2NF是不能有部分依赖,部分依赖的前提条件是有组合主键,就是每条记录是需要一个主键的,这个主键可以是一个单独的属性,但也可以是组合主键,就是由记录的多个属性来唯一确定一条记录,那么只要出现了组合主键就可以产生部分依赖,部分依赖是组合主键出现的前提下,剩余的属性,不完全依赖于组合主键,也是部分依赖组合主键,比如该表的N条记录中由组合主键中的一条或者几条就可以确定剩余属性的属性,那么就可以说产生部分依赖,而在实际开发中,一般不采用组合主键,而是自己增加一个字段id自增长,作为主键,这样的单属性主键是不会产生部分依赖的!


c.3NF的理解:不能出现传递依赖:就是主键,非主键1,非主键2三者之间不能出现传递依赖关系,如果出现由主键可以推出非主键1,然后由非主键1可以推出非主键2,那么主键与非主键2就产生了传递依赖关系,这就不满足三范式,通俗来讲,在一个表的,当然以一条记录为单位,主键和非主键之间可以产生父子关系,但是非主键之间是不能出现父子关系的!


********++++++++++++++++++++++++++++++++++++++++======================================
7.数据库优化
A  对数据表的设计要符合三范式
B  添加适当的索引(index) 四种: 普通索引  index
                               主键索引 primary key
                               唯一索引 unique
                               全文索引  --鸡肋
                               复合索引
C 分表技术(水分分割) (垂直分割)
D 读(select)写(update | delete | create)分离
E 存储过程
F 对mysql的配置优化 配置最大并发数 调整缓存大小
E 定时清除不需要的数据
H 没有什么不是钱解决不了的-----硬件升级
delimiter 修改mysql结束符
********++++++++++++++++++++++++++++++++++++++++======================================


8.拼接whereTP5
Db::table('think_user')
->where([
'name' => ['like','thinkphp%'],
'title' => ['like','%thinkphp'],
'id' => ['>',0],
'status'=> 1
])
->select();


9.页面传id
var id = $(this).data('id'); jQuery data属性
//接收页面js传递过来的值 嵌入html页面
var src="{:url('Model/zmkindex')}"+"?id="+id;
window.loca获取r')->insertGetId($data); 
php think build --module admin --添加admin模块

text-align:justify; 文字左右对齐

10.JS只能输入数字(连小数都不可以)


 onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')"


11.严格区分大小写  PHP虽然是弱语言,但是上传到服务器上面服务器上面不认识 LINUX严格区分大小写


mysql 2MXA7sH3U66VKnd3


12.获取一小时内的数据
select * from 表名 where 时间字段 BETWEEN (select DATE_SUB(NOW(), INTERVAL 1 HOUR)) and NOW()
13. PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
14.登陆之后 阻止浏览器后退回登录页
<script>
// 登陆之后禁止浏览器后退回登录页
$(function() {
  if (window.history && window.history.pushState) {
  $(window).on('popstate', function () {
  window.history.pushState('forward', null, '#');
  window.history.forward(1);
  });
  }
  window.history.pushState('forward', null, '#'); //在IE中必须得有这两行
  window.history.forward(1);
  })
</script>

15.
$_SERVER["QUERY_STRING"]  获取查询 语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"]   获取 http://localhost 后面的值,包括/
$_SERVER["SCRIPT_NAME"]   获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"]      当前正在执行脚本的文件名
16.mysql 表id重新自增
① TRUNCATE TABLE tableName 
② alter table tableName AUTO
③ $sql="delete from $table_vote"; 
   mysql_query($sql, $link); 
   $sql="alter table $table_vote auto_increment=1"; 
   mysql_query($sql, $link);
④ ISAM表


如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开


始,并1为基数递增。


把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。


当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。


当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果


插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的


信息。truncate表后,表的主键就会重新从1开始。


16.传入一个条件查询出所有满足条件的值  CONCAT()函数
SELECT * FROM `tb_behavior_log` WHERE CONCAT


(`behavior_log_action`,`behavior_log_controller`,`behavior_log_id`,`behavior_log_opname`) LIKE '%index%'


17. replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有


此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重


复的数据。
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...


18.ajax 中加参数  traditional:true,


19.生成随机字符串
<?php


function getrandomstring($len,$chars=null){
if(is_null($chars)){
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
}
mt_srand(1000*(double)time());
$str = '';
for($i = 0,$lc = strlen($chars)-1;$i<$len;$i++){
$str.= $chars[mt_rand(0,$lc)];
}
return $str;
}
20.规避关键字
function strFilter($str,$preg='*'){
   $sensitivewords='党|国家';
   if(!$str || !$sensitivewords){
    return false;
   }
   $sensitivewords = explode('|',$sensitivewords);
   $newsensitivewords = array_combine($sensitivewords,array_fill(0,count($sensitivewords),$preg)); 
   $result =strtr($str,$newsensitivewords);
   return $result;
}
echo strFilter($str=调用外部的家,我爱中国共产党,我爱你中国,我爱我的国家');
21.PHP 执行系统外部命令的函数
system(),exec(),passthru()


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 塑钢推拉窗下沉怎么办 网上买东西数量不够怎么办 淘宝买东西数量不够怎么办 康佳遥控器坏了怎么办 电视机频幕脏了怎么办 极米遥控器失灵怎么办 电视遥控坏了怎么办 小米手机触摸屏失灵怎么办 oppo手机触摸屏失灵怎么办 苹果手机屏幕没反应怎么办 苹果6sp换屏卡顿怎么办 苹果4屏幕失灵怎么办 苹果手机老是卡怎么办 苹果手机卡机了怎么办 苹果手机卡屏了怎么办 苹果8手机老卡机怎么办 苹果手机不开机怎么办 手机开机后黑屏怎么办 苹果x手机黑屏怎么办 苹果7手机黑屏怎么办 苹果触控不灵敏怎么办 收银机触屏失灵怎么办 手机屏一半失灵怎么办 苹果六手机屏幕失灵怎么办 苹果5s卡怎么办 苹果5很卡怎么办 笔记本屏幕卡顿怎么办 手机外屏幕失灵怎么办 6p手机屏幕失灵怎么办 home键指纹失灵怎么办 小米触屏不灵敏怎么办 vivo手机音量小怎么办 iphone尾插松动怎么办 充电头接触不良怎么办 苹果充电口松动怎么办 苹果手机速度慢怎么办 苹果6手机屏幕失灵怎么办 手机膜有静电怎么办 手机充电带静电怎么办 苹果6锁屏键坏了怎么办 ipad触摸屏乱点怎么办