开发小结
来源:互联网 发布:方知父母恩上一句 编辑:程序博客网 时间: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()
- 开发小结
- 开发小结
- Web开发心得小结
- java开发小结
- 三维开发小结
- NFFS2开发小结
- 开发嵌入式项目小结
- Humaniod开发小结
- php uc开发小结
- vc开发工作小结
- 人事管理系统开发小结
- PDA开发经验小结
- 短信开发小结
- 开发工资系统小结
- WinForm 程序开发小结
- 初学数据库开发小结
- 手机短信开发小结
- 短信开发小结
- 文章标题
- 基于Ubuntu环境下的CM+kylin搭建
- PRVF-4193,PRVF-4195
- 关于Javascript的一些实践
- 【8】git高级技能
- 开发小结
- 数据库的基本操作
- android studio 的单元测试
- java常用设计模式
- Qt常用类QLabel
- 应聘恩智浦时考察正则表达式
- 十分钟学会Charles抓包(iOS的http/https请求)
- ios runtime最常见的应用
- Scala Future OnComplete调用 笔记