php 入门篇

html 01, 3月27
一.  可以写在head头部的标签
    1.title
        用于定义网页的标题
    2.meta
        用于定义页面描述的相关信息
        常用属性:
            1.charset  用于设置网页字符集 <meta charset="utf-8"/>
  
                值: utf-8  gbk  gb2312
            2.content 定义与 http-equiv 或 name 属性相关的元信息
            3.name  将content的值关联到一个名称
                值:
                    author  定义网页的作者
                    keywords 定义网站关键字
                    description 定义网站描述
            4.http-equiv 将content的值关联到http的头部
                常用的值:
                    content-type 定义文档的字符集
                    refresh     刷新或者跳转页面
    3.link标签
        用于定义两个文档的关系,通常用于导入一个css文件
        常用属性
            rel 定义两个文档之间的关系
                css文件:stylesheet
                icon小图标: icon
            href 定义文件的地址
        实例:
            <link href="style.css" rel="stylesheet" />
            <link href="f.gif" rel="icon" /> 
    4.script标签
        用于执行js文件
        常用属性
            src 外部js文件的地址
        实例:
            <script> js代码 </script>
            <script src=""></script>
    5.style标签
二.HTML中的文本标签
    h族 标题标签
        h1~h6 数字越大,字体越小
    p     段落标签
    b     定义粗体文本
    strong 表示重要,用粗体显示
    i     定义斜体文本
    em  表示强调,用斜体显示
    sub 下标
    sup 上标
    button 按钮标签

三 超链接标签 a
    属性
        href 指定跳转地址
        注意:
            1.值为空默认为刷新当前页
            2.要跳转网络地址,一定要加上http://协议
        target 指定跳转方式
            值:
                _self  在本页面打开(默认)
                _blank 在新窗口打开
                _top和其他分帧的name值,以后再讲
        name 用于锚点跳转
        锚点跳转:a标签href的值一定要与另一个a标签的name值或者其他标签的id值一毛一样

四.路径
1.相对路径
    从当前访问的文件出发
    ./         当前目录
    ../     上一级目录
    ../../  上上级目录
    ../../../../../  点到盘符为止

2.绝对路径
    指的是完整的路径
    http://www.baidu.com
    file:///D:/wamp/www/1.html


html 02, 3月28
五.图片和图像映射
    img 标记一张图片
    属性:
        src     图片路径(相对或者绝对)
        alt     图片加载失败的时候显示的文字

        title     给图片加描述
        width/height 设置图片的宽高
        align     设置图片在本行中的位置
            值:top/bottom/left/right
        usemap     定义图片映射,和map标签的name值相对应

                   map 用于图像映射
                属性:
             name name的值用于配合img标签中的usemap属性
area 定义图像映射的区域
    属性
        shape     映射的形状
            default    规定全部区域。
            rect    定义矩形区域。
            circ    定义圆形。
            poly    定义多边形区域。
        coords  配合shape使用,确定可点击区域的坐标
        href     点击区域要去的地址
        target     打开方式


六.音频标签

<!--
audio  加载一段音频,h5新增标签
    属性:
        src     音频的路径
        controls 显示播放控件
        autoplay 自动播放
        loop      循环播放
        muted      是否静音

    提示:双标签,标签里面的内容是在浏览器不支持该标签的时候显示
-->.视频标签
<!--
video  加载一段视频,h5新增标签
    属性:
        src     音频的路径
        controls 显示播放控件
        autoplay 自动播放
        loop      循环播放
        muted      是否静音

        width/height 设置视频的宽高
        poster     设置视频封面图,值是图片路径

    提示:双标签,标签里面的内容是在浏览器不支持该标签的时候显示
-->
八,音频标签
source
    定义音频或者视频的媒介资源
    属性:
        src     定义媒介资源的路径

    会从资源列表中找出一个可解析的资源

九.表格标签
 
table 定义个表格
    属性:
        border 定义表格的边框,值是边框的宽度
        width  定义表格的宽度
        cellspacing  定义每个单元格之间的空白距离
        cellpadding  定义每个单元格内容与边框之间的距离
        
        bgcolor 设置表格的背景颜色
        align     设置表格的水平位置
            值:left(默认)/right/center

caption 定义表格的标题
tr 定义表格的行(有多少行就有多少对tr)


    属性:
        height 设置行的高度
        align 设置本行的文本的水平对齐方式
            值:left(默认)/right/center
        valign 设置本行文本的垂直对齐方式
            值:top/bottom/middle(默认)
        bgcolor 设置本行的背景颜色

th 定义表格的表头(有多少列就有多少对th)
    默认为加粗并居中
td 定义表格的单元格
    属性:
        width/height 定义单元格的宽高
        align 设置本行的文本的水平对齐方式
            值:left(默认)/right/center
        valign 设置本行文本的垂直对齐方式
            值:top/bottom/middle(默认)

        *colspan  规定单元格可以横跨的列数
        *rowspan  规定单元格可以横跨的行数

thead 定义表格的头部部分
tfoot 定义表格的页脚部分
tbody 定义表格的主体部分





表单标签
    form  定义一个表单
        属性:
            action 要提交的地址(通常为服务器上的某个php文件)
            method 提交的方式
                get(默认) 会将表单的数据显示在url地址栏
                post 不会将表单的数据显示在地址栏
    input 定义一个输入框
        属性:
            type 规定输入框的类型
                值:
                text (默认)  文本输入框
                password     密码输入框
                radio     单选框(name值一定要一样)
                checkbox 多选框

            name 定义输入框的名字
    button 按钮标签
 

html 04,3月29
十,补充两个标签
  font 定义字体
    属性:
        color    设置文字颜色
        size     1~7 设置文字大小,默认为3
  center 对包裹的元素进行居中



十一. 表单标签
    input


    属性:
        type 
            text      value设置默认值
            passwor   value设置默认值 

            radio      单选框            真正的值
            checkbox  复选框    真正的值
            file      文件上传    
            hidden   隐藏域(用于悄悄传输数据)
            submit 表单提交按钮
            image  表单提交按钮,样式来自于图片,配合src使用
            reset    重置表单
            button   普通按钮
            size 设置type为text或者password的最大 输入框宽度
            maxlength  设置type为text或者password的最大输入长度(1个汉子也只是一个字符)
            readonly    设置type为text或者password的输入框为只读
            mutiple     设置typ为file的文件上传域为多选(多文件上传)



        value     定义input框的值 
        name     定义input
            注意:input 如果没有name属性,后台拿不到数据

        checked 设置单选框或者多选框的默认选中

        button  按钮标签
                属性
                    submit默认值
                    reset 重置表单
                    button普通按钮
                        form 将按钮绑定到某个表单
                            注意:值一定要与表单的id一样
        
        label   将某个元素绑定到某个表单控件上
            属性:
                for    一定要和表单控件上的id值相对应
        textarea  定义一个大文本域
            属性:    
                name 定义大文本域的名字
                rows 规定大文本域最大的行数
                cols 规定大文本与最大的列数
        select    定义一个下拉框
            属性:
                name    定义下拉框的名字
                multipe  将下拉框定义为多选
        option  下拉框中的选项
            属性:
                value    定义下来框真正的值
                selected 默认选中
        fieldset    将表单项进行分组
        legend  给分组的表单加个标题
        disabled: 禁用表单的属性
            *: 可以加载input|select|option|textarea|button上,通用属性  可以加在表单 控件里面 用于禁用某个控件
        




十二,表单input属性
    url       必须输入一个网址(必须是一http://或者https://开头)
    email     必须输入一个邮箱    
    number   必须输入一个数字 :maxmin,step



  input的属性
        required     必须输入的选项
        sutofocus     自动获取焦点
        placeholder    设置提示信息
        autocomplete    on/off 是否使用自动功能


十三,分帧标签
    frameset          设置框架集 不能与body同在 (html5 淘汰)
     属性:
        rows          把页面分为几行
        cols        把页面分为几列
        frameborder    是否显示边框  0/1
        border        边框的大小

    frame             配合frameset使用,定义基本的框架    单标签
     属性:
        src         本框架链接的页面
        name        本框架的名字
        noresize     不能调整大小(单属性)
        scrolling no/auto  是否显示滚动条
        
a

      a标签的target属性的值
        _self
        _blank
        _top



十四, iframe 框架级
    在body中加载一个行内框架
    属性:
            src        要加载的页面地址
        width/height    设置宽/高
        scroling    是否显示滚动条 on/auto
        frameborder    是否显示边框  值: 0/1
        
    
       



css 01,3月30
十五,css的使用方式
    1.内联式(行内式)
        在标签里面添加style属性。属性值为css代码
    2.内部样式(通常在head)
        把css代码写在style标签对中
        注意:style标签对可以放在文档的任意位置,但是建议写在head里面
    3.外部样式 使用用 link标签引入外部样式的文件  。例如:link  herf=“” rel=“strlesheet”
        注意:文件后缀不影响,推荐使用css后缀。
    4.用@import导入外部文件
        例如:
        注意:一定要写在style标签对或者外部文件的第一行
十六,css的基本语法
        1.css语法
       由选择器和声明两部分组成
       选择器:你需要改变样式的html元素
       声明:都被包含在{}中
         每条声明都是由属性和值组成,中间用“:" 冒号隔开
              最后一条声明可以省略掉“;” 分号
    2.css的注释
        /* 注释内容 */
    3.单位
      3.1  长度单位
        px  像素 屏幕显示的最小单位
        em  倍数 字体大小相对与对于自己当前的字体大小的倍数
        %   百分比

        in  英寸
        pt 磅
        cm/mm  厘米/毫米
     3.2    颜色单位
        1.英语单词
        2.16进制
        3.rgb()
            rgeb(红,绿,蓝);
            数字:rgb(0~255,0~255,0~255)
            百分比:rgb()

十七,css选择器
    1.通配符选择器  *{margin:0;padding:0;}
    2.标签选择器     不区分大小写
        li{声明}
    3.class类选择器   区分大小写
        同时用两个或者多个类,请用空格隔开
        .class名{声明}
    4.id选择器       区分大小写
        页面id唯一性,一次只能用一个id,一个id只能用一次

  以上的这几种都是最基本,最常用的选择器。标签名不区分大小写,类和id都区分大小写

    后代选择器
        
    爹 后代  (中间用空格隔开)
    组合选择器
    li,p,b{}
        中间用,隔开
    伪元素选择器
      a    :link      设置访问前的样式
      a :visited    设置访问后的样式
      a:hover      鼠标放在链接上没有点击的状态(最常用的)
      a:avtive     设置鼠标按下去还没有放开的样式

十八,选择器的优先级
    标签<后代选择器<类<id   选择范围越小,优先级越高


十九,字体属性
    font-size    设置字体大小
    tont-family    设置字体文件
    font-weight    设置粗细
        取值范围:100/200/300/400/500/600/700/800/900  ,临界值为600
    font-style    设置是否斜体
        值:italit 斜体
    
  font
    统一设置:font:[斜体] [粗细]    [大小][字体] 字体和大小必须要有,同时至少有两个才生效

二十,背景属性
    background
        background-color      背景颜色,值颜色单位
        background-image    背景图片。值url(‘图片路径’)
        background-repeat       背景图片平铺方式
                :
                repeat        默认,都平铺
                repeat-x    x轴平铺
                repeat-y    y轴平铺
                no-repeat    不平铺
                round        根据款到自己拉伸图片进行平铺(css3)
        
    
    backfround-pasition        背景图片的位置
        left/center/right    容器内左/居中/右对齐
        top/bottom            上/下
        background-position:x轴  y轴
        background-position:100px  -100px   可以给负数

统一设置背景:
        background:red url('1.jpg') 图片的位置,平铺方式等等。         参数不要求个数,不要求位置


css 02,3月31
二十一,文本的属性
1.text-indent  首行缩进
   text-indent:2em 首行缩进两个字符
2.text-transform :转换大小写
   (1)capitlize  首字母大写 
   (2)uppercass 全大写 
   (3)lowercase 全小写
3.word-spacing 设置词间距
 值:长度单位(靠空格分一个词语)

4.text-decoration  设置下划线,上划线,贯穿线
    none       没有线
    underline  下划线
    overline  上划线
    line-through 删除线
5.text-align     文本的水平对齐方式
    left/center/right
6.vertical-align  文本的垂直对齐方式
    top    当前行的最顶部  
    bottom    当前行的最底部
    100px  直接用数值
    
7.line-height:   一行文本的垂直居中。  值一定要和容器的高一样
8.border       边框   边框默认为px,黑色,
    border-width     边框的宽度
    border-color     边框颜色
    border-style     边框样式
      值:  solid   实现  (常用)
        dotted    点线
        dashed  虚线
        
  可以单独设置某一条边
    border-top    上
        border-top-color   上颜色
        border-top-width   上宽
        border-top-style   上边样式       
    border-letf     左
        border-left-width  左宽
        border-left-color  左颜色
        border-left-style  左样式
    border-right    右
        border-right-width  右宽    
        border-right-color   右颜色
        border-right-style   右样式
    border-bottom    下
        border-bottom-width  下宽
        border-bottom-style   下样式
        border-bottom-color   下颜色
    

9.cursor   设置鼠标样式
    值:poiter    变成小手

10列表属性
    统一设置: list-style:
        list-stype:none; 没有
    list-style-type:
    list-style-image:url()
    list-style-position: 
            outside;在list框外
            inside; 在list框内

二十二,布局。
    网页布局(DI+CSS)
html额网页:标准的文档流,从从往右,从上往下

1.盒子模型
    定义:任何一个元素都可以抽象成一个盒子,每个盒子可以嵌套其它盒子。
  组成:元素的内容(宽高),内边距(内部白,内填充),边框,外边距(外部白,外填充)
  自合模型的宽高:
   盒子的宽=内容的宽+左右内边距+左右边框;
   相关属性:
    width/height   设置宽高
    padding        内边距
    border        边框
    margin        外边距

2 padding  和margin  内/外边距
 padding:10px 20px 30px 40px; 内边距  上 右  下 左
padding:10px 10px;上下 左右
 padding:10px 20px 30px  上 左右 下

    padding-top    上内边距
    padding-left    左内边距
    padding-right    右内边距
    padding-bottom    下内边距

margin   外边距 参数用法 和内边距一样
    margin-top    上外边距
    margin-left    左外边距
    margin-right    右外边距
    margin-bottom    下外边距
    
3.块级元素 与行级元素
 标签分为块级元素或者行级元素
  1,块级元素
    特点:
         1.从左到右,独占一行 .
         2.如果没有设置宽度,默认继承爹的宽度
         3.通常块级原色可以包含其它的块级元素或者行级元素,部分标签除外。
        部分标签:p,p标签千万不能套其它块级元素    h1~h6,dt. 
               ul,ol,table他们的子原色需要指定元素
  2,行级元素
    特点:
         1.多个行级元素从左到右在同一行显示
             2.设置宽高无效(部分标签无效),margin/padding值左右有效,上下无效。
        部分标签:img/buttom/select/input/teztarea/lable   就是那么多个设置了宽/高有效的标签 
         3.行级元素不能嵌套其它的块级元素,只能嵌套其它的行级元素或者文本内容
       
3,块级与行级元素互转
     display
    
    display:block;将元素转换成块级元素
    display:inline;将元素转换成行级元素
    display:inline-block  将元素转换成 行级的块状元素

display:none,彻底隐藏,不保留任何物理空间



CSS 03 ,4月1


二十三, float 浮动
    值:
        left   左浮动
        right  右浮动
        none     不浮动
clear 清除浮动
    值:
        left
        right
        both     清除两边的浮动

css中的布局方式
    1.标准文档流
        从左往右、从上往下
    2.浮动
        浮动的盒子会脱离文档流;脱离文档流之后,其他的元素会无视它的存在;(注意:元素中的文本,依然会为它让出位置)
    3.定位
二十四.定位
    相对定位
        relative
        相对于自己原来的位置进行定位,不会脱离文档流,不会影响其他元素的布局
    绝对定位
        absolute
    固定定位

以下4个属性,一定要设置定位后才有效
    top|bottom|left|right

二十五.position 定位
    相对定位 relative
        相对于自己原来的位置进行定位,不会脱离文档流,不会影响其他元素的布局
    绝对定位 absolute
        相对于离自己最近的已经定位过的父元素进行定位,如果没找到,就相对于浏览器的左上角进行定位
        会脱离文档流
    固定定位 fixed

以下4个属性,一定要设置定位后才有效
    top|bottom|left|right

二十六.固定定位
    会脱离文档流,固定在浏览器的某个为止,不会随着滚动条的滚动而滚动

z-index 设置元素的堆叠层级
    值必须为一个整数,值越大,层级越高,可以有负值
    注意:必须设置position定位属性后,才可以使用

position属性
    值:
        relative     相对定位
        absolute     绝对定位
        fixed         固定定位

二十七,坑
1.元素的垂直外边距,会重叠,取最大的值显示
2.父元素的第一个子元素的上外边距margin-top如果碰不到父元素有效的边框或者padding,就会不断一层一层的找自己‘领导’的麻烦,将自己的margin-top作用在‘领导’身上;
    解决:
        1.给父元素加有效的边框或者padding(不能为0px)
        2.给父元素设置 overflow:hidden

溢出隐藏               溢出隐藏
            /*overflow:hidden;*/

            /*溢出显示滚动条*/
            /*overflow:scroll;*/
            
            /*自动决定是否显示滚动条*/
            /*overflow:auto;*/
。反例:不要将display设置为hidden 

.子元素浮动时候,父元素的高度就不会被撑开了
            解决:
                1.让父元素也浮起来
                2.给父元素加overflow:hidden;(常用)



二十八.水平居中
    1.让文本或者行级元素水平居中 text-align
    2.让块级元素水平居中 margin:0 auto 

二十九.垂直居中
    /*经典的垂直居中做法*/
            position:absolute;
            top:50%;
            left:50%;

            margin-left:-100px;容器的宽度的一半,用负值
            margin-top:-100px;容器的高度的一半,用负值





三十,什么是PHP?
    拍黄片。
    HTML:HyperText Mark-up Language 超文本标记语言
    PHP(PHP:Hypertext Preprocessor )超文本预处理器,是一种运行在服务器端的脚本语言,尤其适合web开发。

PHP能干什么?
    收集表单数据
    生成动态网页
    收发cookies
    跨平台运行
    输出图像
    文件处理
    处理XML格式的数据
    处理JSON格式的数据
    会话跟踪
    。。。。。


    服务端脚本,用于写web网页(主攻)CGI
    命令行脚本,CLI
    编写桌面应用程序

PHP的特点
    跨平台运行
    开源免费
        http://www.github.com
    支持大多数的web服务器
    支持很大范围的数据库

PHP的发展史
    1995年由Lerdorf(PHP之父)发明
    1998年PHP3发布
    2000年PHP4发布,开始引入面向对象的思想(半成品)
    2004年PHP5发布,完全的支持面向对象思想
        5.4或者5.6最稳定
    2015年12月3号直接发布了PHP7,速度翻了一倍

第一个PHP文件
    1.环境装好之后,进入到网站根目录(www,如果不是wampserver,有可能是htdoc)
    2.新建的文件后缀名一定是.php,文件名不能是中文的
    3.写php代码:phpinfo();
    4.在浏览器中访问文件:http://localhost:80/demo.php

HTML中嵌套PHP代码:
    1.文件后缀必须是php
    2.可以嵌套到任何地方:body中、html之外、属性中、css中
    3.PHP代码必须被<?php ?>所包裹

PHP的标记
    1.标准风格(常用)
        <?php php代码 ?>
    5.<?= 是echo的简写(常用)
        <?='123';?> 相当于 <?php echo '123'; ?>


    2.长风格(废物!!!!)
        <script language="php">php代码</script>
    3.短风格(废物!!!!)
        <? php代码 ?>
        需要在php.ini中开启short_open_tag(将它设置为on,默认为off)
    4.asp风格(废物!!!!)
        <% php代码 %>
        需要在php.ini中开启asp_tag(将它设置为on,默认为off)

    注意:
        PSR规范中,只允许使用<?php ?>和<?= ?>这两种
        如果是纯php文件,标准风格的结束标记可以不写

指令分隔符
    PHP中语句分为两种
        1.结构定义语句
            流程控制、分支、循环、函数。。。用大括号标识,可以不加分号
        2.功能执行语句
            输出、变量定义、函数调用。。。后面必须加上分号
    提示:php的结束标记中隐含了一个分号,最后一条语句可以不加分号

PHP中的注释
    注释掉的代码,PHP都会忽略解析
    1.//单行注释
        //注释内容。。。
    2.多行注释
        /*
            注释内容
         */
    3.#单行注释
        # 注释内容。。。

PHP中对空白符的处理
    PHP会忽略空格、换行、tab制表符的解析,所以可以利用这个特点写出可读性比较高的代码
    要求:php代码必须要按照严格的缩进;PSR规范规定,缩进只能4个空格(因为tab制表符的宽度,编辑器解释不一样,不利于代码的移植)

三十一.变量
    什么是变量?
        变量是用于临时存储值的容器
        值可以是数字、文本或者其他一些比较复杂数据(数组、对象)

    变量的特性
        PHP是弱类型的语言,不必告知变量的类型是什么,它会根据存储的值来决定这个变量是什么类型的

    *变量的命名规范:
        1.必须以$开始,后面跟变量名
        2.变量名由字母、数字或者下划线_组合而成
        3.不能以数字开头
        4.严格区分大小写
        5.可以是中文,但是别让我看到这种代码,不然罚抄10000遍

三十二.八种数据类型
    4种标量类型
        boolean     布尔型
            只有两个值,要么是true,要么是false
            通常用于if判断,其他类型转换为布尔型得到false的情况:
                布尔型:false
                字符串:''  '0'
                整型:0 -0
                浮点型:0.0
                数组:array() 空数组
                null:null(包括未定义的变量)
            其他所有值都被认为是true

        integer     整型
            1.整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。 
                八进制表达,数字前必须加上0(零)
                十六进制表达,数字前必须加上 0x
                二进制表达,数字前必须加上 0b
            2.PHP中整型的字长用PHP_INT_SIZE表示,一般占4个字节
            3.整型的取值范围:PHP_INT_MAX 正负二十多个亿!超出取值范围自动转换为浮点型
                -2147483647~2147483647

        float       浮点型
            1.浮点数,就是有小数点的数,通常用来表示整数无法表达的数值,比如金钱值、距离值、速度值
            2.可以用科学计数法来表示
            3.在PHP中float也有最大数,1.8e308
            4.浮点数的精度有问题
            5.将浮点数取整的函数
                round()     四舍五入
                floor()     舍去取整
                ceil()      进一取整

        string      字符串类型
            定义方式:
                1. 单引号
                2. 双引号
                3. heredoc 定界符方式
                4. nowdoc(5.3以上)
            单双引号的区别:
                1、双引号可以解析变量;单引号不能解析变量,会原样输出;
                2、双引号可以解析转义字符;单引号只能转义\\和\'本身;
                3、单双引号都不能自己嵌套自己,可以互相嵌套

            转义字符:
                \r  回车
                \n  换行
                \t  制表符
                \\  斜线本身

            heredoc和nowdoc
                heredoc定界符可以嵌套单双引号,可以解析变量和转义字符
                nowdoc可以嵌套单双引号,不能解析变量和转义字符

            建议:尽量使用单引号,效率略高
    2种复合类型
        array       数组类型
        object      对象类型
    2种特殊类型
        resource    资源类型
        null        空
            只有一个值,就是null本身
            得到null的情况:
                1、直接赋值为null
                2、未被赋值的变量,默认值也是null
                3、被unset()删除掉的变量也是null

    PHP中的伪类型(看手册,var_dump()),并不是PHP的原始数据类型
        mixed:代表这个参数可以是多种不同的类型
        number:代表这个参数可以是int或者float
            pow()
        callback:还有个别名叫callable,代表这个参数必须是一个函数(回调函数)
            call_user_func()、session_set_save_handler()
        void:代表这个函数不接收任何参数;如果作为返回值,表示这个返回值是无用的
            time( void )
            var_dump()
            unset()

    PHP中的类型转换
        强制转换
            (int)/(integer)     强制转换为整型
            (bool)/(boolean)    强制转换为布尔型
            (float)             强制转换为浮点型
            (string)            强制转换为字符串
            (array)             强制转换为数组
            (object)            强制转换为对象
            (unset)             强制转换为null
        自动转换
            布尔环境
            数值环境
            字符串环境

三十三.数据类型的判断:
        is_bool()       检测变量是否是布尔型
        is_string()     检测变量是否是字符串类型
        is_int()        检测变量是否是整型
        is_float()      检测变量是否是浮点型
        is_array()      检测变量是否是数组类型
        is_object()     检测变量是否是对象类型
        is_resource()   检测变量是否是资源类型
        is_null()       检测变量是否是null空类型

        is_scalar()     检测变量是否是标量类型(int、float、string、boolean)
        is_numeric()    检测变量是否是数字或数字字符串

        gettype($a)   获取变量的类型
        settype($a, 'bool')   设置变量的类型(类似于强制转换)

三十四.常量
    常量
        汉语字典中第1条解释:长久,经久不变,常量也就是恒量
        一经定义,不能删除和改变。

    常量的定义:
        define
            define('常量名', 常量值);
        const
            const 常量名 = '常量值';

        常量名:
            和变量名一样,只能是数字、字母或下划线;
            不能以数字开头 (定义的时候可以,但用不了)
            严格区分大小写(define可以通过第3个参数指定是否区分大小写,true不区分)
        常量值:
            define定义的常量,除了object之外,都可以;(数组是PHP7新加的)
            const定义的常量值,不能是资源和对象;

    define和const的区别:
        const可在类中使用,define不能
        const不能在条件语句中定义常量
        const采用一个普通的常量名称,define可以采用表达式作为名称
        const只能接受静态的标量,而define可以采用任何表达式
        const定义的常量时大小写敏感的,而define可通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。

    提示:echo一个未定义的常量时,会报一个notice并将常量名自动转换为字符串输出;

    defined(常量名)
        用于检测常量是否定义

    预定义常量:get_defined_constants()获取当前已经定义好的常量!
        PHP_INT_MAX
        PHP_INT_SIZE
        PHP_VERSION
        ...

    魔术常量:
        值会随着环境的变化而改变
        __LINE__    当前行号
        __FILE__    当前文件
        __DIR__     当前文件的目录
        __CLASS__
        __METHOD__
        __NAMESPACE__
        。。。

三十五.运算符
    运算符是可以通过给出的一个或多个值来产生另一个值的东西;
    有3种类型的运算符
        一元运算符
            只能够接收1个值参与运算的叫一元运算符
            1   -1  负值运算符 ++  --  !
        二元运算符
            2 + 2  算术运算符 + - * /
        三元运算符
            3   可以接收3个值的就是三元运算符
            ?:
            表达式1 ?  表达式2 : 表达式3;
    
    算数运算符
        +  -  *  /
        %   取余(取模)运算
            39 % 3 == 0     求两个数相除的余数;39除以3余数为0

    递增递减运算
        ++
            $i++;  //后递增: 先返回$i,再将$i的值加1,下次用的时候值就是加1后的
            ++$i;  //前递增:先将$i的值加1,然后返回加过1后的$i
        --
            $i--;   //同上
            --$i;
        提示:
            递增/递减运算符不影响布尔值
            null的递减无效,递增结果为1
            字符串的递减无效;++是按照Perl的语法,比如z++ 会变成aa

    字符串运算符
        .   将其左右参数进行拼接运算
        .=  将右边参数,附加到左边参数之后

    赋值运算符
        =
            将右边的表达式的值,赋值给左边的变量
        +=
            $a += 3;    //将$a加上3之后再赋值给$a,可以拆为$a = $a + 3;
        -=  *=  /=  %=

    比较运算符
        >       大于
        <       小于
        >=      大于等于
        <=      小于等于
        ==      等于
        ===     全等于
        != | <> 不等于
        !==     不全等于

    逻辑运算符:
        逻辑与:&&  and
            想娶你们小红姐,你要有房,并且还要有车!
            洗脸:左脸和右脸
            只有两边都为true,才返回true,否则返回false
        逻辑或:||  or
            想娶凤姐,要么你财大,要么你器粗!
            丢钱包:你找到了,或者我找到了
            只要有任何一边为true,结果就为true;
            注意:前面为true,后边就不再执行,俗称短路
        逻辑非  !
            小星星本来是纯爷们(true),去了趟泰国,被砍了一刀(false),就不纯了
            就是取反的意思
                $bool = true;
                !$bool == false
        逻辑异或 xor
            男(true)男(true)不能结婚;
            女(false)女(false)也不能结婚
            两边不一样才返回true,否则返回false

    位运算符(了解)
        按位与     &
        按位或     |
        按位异或   ^
        左移       <<
        右移       >>
        按位非     ~

    其他运算符
        ?: 三元运算符
            表达式1 ? 表达式2 : 表达式3;
            1为真就执行2,为假就执行3;
        @  错误控制符,可以屏蔽错误
        `` 执行运算符,可以执行一些操作系统的命令

        //别急,讲到相应知识点的时候会补充讲解
        =>  数组下标指定符号
        ->  对象成员访问符
        instanceof 类型运算符

三十六.流程控制
    1.概述
        任何PHP脚本都是由语句组成的。 此外,还可以用花括号将一组语句封装成一个语句组,语句组本身可以当作是一行语句
    2.在PHP中有三种基本的程序结构:
        顺序结构
        分支结构
        循环结构

顺序结构
    在程序结构中,最基本的就是顺序结构,表示程序会自上而下的顺序执行。

流程控制之分支结构:
    1. 单向分支
        if (表达式为true) {
            执行真区间
        }

    2. 双向分支
        if (true) {
            表达式为true执行真区间
        } else {
            表达式为false执行假区间
        }






三十七.数组
    概述
        简单说,就是一组数据的集合,是PHP8大类型中的一种;
        (比如标量在内存中是单个存储的,数组呢,就像一列火车或者地铁)
    相关概念
        下标:也叫做键(key)或者索引,相当于数据在该数组中的名称。
        值:就是数据本身
    数组的分类:
        1.按照下标形式分
            索引数组:下标全是数字
            关联数组:下标全是字符串
            混合数组:下标既有数字又有字符串
        2.按照维度划分
            一维数组
            二维数组
            三维数组
            N维数组
            ...
    数组的定义:
        方式一:array() 语言结构
            array([ [key => ]val, $...]);
            $arr = array('name'=>'老杨', '18', '卡哇伊~~');
        方式二:array()的替代语法[]; PHP版本需要5.4+
            $arr = ['name'=>'老杨', '18', '好可爱'];
        方式三:直接给数组下标赋值
            $arr[键] = 值;

    查看数组的方式
        1.var_dump()打印变量的相关信息
            但是,比较复杂的数组,无法显示完整;比如:get_defined_constants()
        2.print_r(),配合pre可以完整的显示所有数据

    数组定义时的细节:
        1.未指定下标的值,会从0开始比较,找出当前数组中最大的数字下标加1,作为自己的下标
        2.如果key是浮点数,会被舍去取整!如果是一个纯洁的数字字符串,也会被转换为相应的int值!

三十八.数组的遍历:
        遍历:
            一栋楼 ,3层,每层10间房,分别为101-110,201-210,301-310,每个房间里住着一个美女。有人要求你进入这栋楼去找一个叫‘刘亦菲’的美女,你将怎么找?

            遍历,遍,就是寻遍,找遍。遍历原意是从头到尾,或从尾到头,每个元素查验一次,不重复查验,也绝不遗漏一个。但是实际上我们做遍历,往往是,查找到目标(刘亦菲),遍不会继续浪费时间精力、资源去查验剩下的房间。

        1.for循环遍历数组
            只能遍历索引数组,并且数组下标还必须是连续的

        2.foreach遍历数组:
            foreach ($数组 as $键 => $值) {
                
            }
            每次开始循环,会从数组的第一个元素开始,将值拿出来赋值给$v,将键拿出来赋值给$k;直到数组被遍历完毕,结束循环
            
        3.联合使用list()、each()、while遍历数组
            list():把数组中的值赋给一些变量
                注意:list只能用于下标从0开始的索引数组
            each():返回数组中当前的键/值对并将数组指针向前移动一步,超出数组长度返回false!

三十九.预定义变量之超全局变量:
    超全局变量:超全局变量是在全部作用域中始终可用的内置变量(语言参考->预定义变量)

    $_SERVER 包含了头信息、路径、脚本位置等信息的数组
    $_GET    包含了通过URL的参数传过来的数据
    $_POST   包含了通过POST方法传过来的数据(需要用表单发起POST请求)
    $_REQUEST 默认包含了GET、POST和COOKIE的数据(COOKIE后面再讲)

    GET和POST的区别:
        1、get通过URL传输数据,随时可以查看和修改,安全性相对较低;而post不会显示在URL,相对安全
        2、get传输的数据量大小会被URL的长度所限制(循环10万个1);而post传输的数据量是根据php.ini的配置文件(post_max_size),默认为8M!
            (友情提示:要上传大文件还需要设置upload_max_filesize,默认为2M)
        建议:登录、注册等涉及到密码或者文件上传等操作的时候用POST;做搜索或者传输一些简单数据的时候一般用get

    $GLOBALS 包含所有全局范围的变量(包括其他的超全局变量)

    $_ENV 包含服务器端环境变量的数组(不常用)
        默认为空,需要修改php.ini中的:
            variables_order = "GPCS"
            variables_order = "EGPCS"   //加个E

    $_FILES$_COOKIE和$_SESSION后面再讲






四十.系统函数
    数组相关的函数:
    数组的键/值操作:
        1.array_values($arr)
            返回数组中所有的值并给其建立数字索引
        2.array_keys($arr[, '值'[, true]])
            返回数组中所有的键名
            给'值'表示拿出该值的键
            给'true'表示值用===判断
        3.in_array('值', $arr[, true])
            判断数组中是否有某个值
            给true表示用===判断
        4.array_key_exists('键', $arr)
            判断数组中是否有某个键
        5.array_flip($arr)
            键值交换
        6.array_reverse($arr[, true])
            反转数组
            给true表示保留原来的数字下标
    统计与唯一性:
        count($arr[, 1]) 统计数组元素的个数
            给1表示递归统计数组个数(不常用)
        array_count_values($arr) 统计数组中值出现的次数
            注意:只能统计string或者int,否则报错
        array_unique($arr) 去除数组中重复的元素,保留前面的值
    使用回调函数过滤数组:
        array_filter($arr, callback);
        会将数组中的每个值都传给回调函数,在回调函数中返回true就保留该值,返回false就不保留
    数组排序函数:
        1.sort()   从小到大,不保留键    (升序)
        2.rsort()  从大到小,不保留键(降序)
        3.asort()   从小到大,保留键    (升序)
        4.arsort() 从大到小,保留键(降序)
        5.ksort()  按照键,从小到大(升序)
        5.krsort()  按照键,从大到小(降序)

    注意:在对混合类型值排序时可能会产生不可预知的结果

    拆分、合并、交差集:
    1.array_slice(切谁, 开始位置[, 切几个[, 是否保留键]])
        切谁:要切的数组
        开始位置:从0开始数,会保留开始位置的元素
        [切几个]:没给的时候,默认切到最后
        [是否保留键]:默认false,不保留;true保留原来的键

    2.array_splice(&切谁, 开始位置[, 切几个[, 替代品]])
        切谁:要切的数组,是引用传递
        开始位置:从0开始数,会保留开始位置的元素
        [切几个]:没给的时候,默认切到最后
        [替代品]:将替代品插入到原来的数组中,不会保留键

    3.array_combine(键数组, 值数组)
        用键数组的值作为键,值数组的值作为值;
        要求两个数组的长度必须一致,否则报错并返回false

    4.array_merge($arr1[, $arr2, $...])
        合并N个数组;
        注意:同名的键,后面会覆盖前面的

        扩充:加号也可以合并数组;同名的键会保留前面的值

    5.array_intersect($arr1, $arr2[, $...])
        返回N个数组中都有的值,下标保留前面

    6.array_diff($arr1, $arr2[, $...])
        返回$arr1中有,其他数组里面没有的元素,下标保持不变

    数组与数据结构:
        array_pop()     弹出数组中最后一个元素
        array_shift()   弹出数组中第一个元素
        array_push()    往数组最后追加1个或多个元素
        array_unshift() 往数组最前面追加1个或多个元素

        数据结构:用于存放数据的容器
            队列:相当于管子,先进先出(吃多了拉)
            栈:相当于杯子,后进先出(吃多了吐)
  随机打乱数组
    range() 生成指定范围的数组
    shuffle() 随机打乱数组

四十一.系统函数 指针相关
    current() 返回数组当前指针的值
    next()  将数组的指针移到下一个,并返回其值
    prev()  将数组的指针移到上一个,并返回其值
    end()   将数组的指针移到最后,并返回最后一个值
    reset() 将数组的指针重置

  


四十二.系统函数 字符串相关
    字符串常用输出:
        echo 输出一个或多个字符串
        print 输出一个字符串
            echo和print是一种语言结构,不是一个函数;
            用于输出字符串等简单的数据

        print_r 打印变量易于理解的信息
            就是查看各种类型变量的值
        var_dump 打印变量的相关信息
            可以看到任意类型的值和类型
        printf() 格式化输出字符串
            %s  表示字符串
            %b  表示二进制数
            %o  表示八进制数
            %d  表示十进制数
            %x  表示十六进制数
            %c  表示是个ascii码值
            %%  表示一个单纯的%
        sprintf() 同上,只是将结果返回,而不是输出

    笔试题之echo和print_r的区别:
        1.echo是一种语言结构,不是函数,所以效率略高;
        2.echo可以同时输出多个字符串,而print_r不可以
        3.echo只能输出简单的数据类型,而print_r可以打印复合类型的数据,比如数组、对象等

    去除和填充:
        ltrim($str[, '要去除的字符列表'])
            默认去除左边的空格
        rtrim($str[, '要去除的字符列表'])
            默认去除右边的空格
        trim($str[, '要去除的字符列表'])
            默认去除两边的空格
        str_pad($str, 长度,填充品) 
            用一个字符串将另一个字符串填充为指定长度

四十三. 系统函数  字符串大小写的转换:
        strtolower() 转换为小写
        strtoupper() 转换为大写
        ucfirst()   首字母大写
        ucwords()   单词的首字母大写(空格区分单词)

四十四.和HTML标签处理相关的函数:
        htmlspecialchars()
            将特殊字符转换为实体
        htmlentities() 同上,基本不用
            老版本里面会将中文一起转了
        strip_tags()
            去除html标签
        nl2br
            将\n换行转换为<br>换行

    字符串反转、长度与加密:
        strrev()
            将字符串颠倒显示
        str_shuffle()
            将字符串随机打乱
        strlen()
            统计字符串的长度,utf-8的中文占3个字节
        md5()
            将字符串进行加密,得到一个32位的加密后的字符串
        number_format()
            格式化一个数字
            只能是1个、2个或者4个参数

    字符串比较函数:cmp:compare的简写,比较的意思
        strcmp()
            比较两个字符串(区分大小写)
        strncmp()
            比较字符串开头的若干个字符(区分大小写)
        strcasecmp()
            比较两个字符串(不区分大小写)
        strncasecmp()
            比较字符串开头的若干个字符(不区分大小写)

    字符串的切割与连接:
        explode('切割符', $str)
            使用一个字符串分割另一个字符串,返回一个数组
        implode('连接符', $arr)
            将一维数组用指定字符串连接,返回一个字符串
        join()
            implode的别名

    字符串截取:
        substr($str, 开始位置, 截多长);
        开始位置从0开始数;为负数时表示倒着数!

    字符串也有下标:
        可以像数组一样通过下标取出字符串的值
        但是,最好不要用来取中文

    字符串的查找:
    提示:用法统一都是($str, '要找的子字符串');
        1.strstr($str, '要找的字符串');
            返回从子字符串第一次出现的位置开始,到结尾的字符串;
            还有个别名:strchr
        2.strrchr 返回从子字符串最后一次出现的位置开始,到结尾的字符串
        3.strpos($str, '要找的字符串')
            返回子字符串第一次出现的索引位置,从0开始;
            注意:1个汉字占3个字节
        4.strrpos($str, '要找的字符串')
            返回子字符串最后一次出现的索引位置
        5.stripos()不区分大小写的strpos

    字符串的替换
        str_replace('找什么', '换成什么', '在哪儿换');

四十五.系统函数 数学函数
        ceil()      向上取整
        floor()     向下取整
        round()     四舍五入

        max()       最大 
        min()       最小
        mt_rand()   随机数


四十六.分支
 多向分支
        if (表达式1) {
            表达式1为true执行真区间,这个分支就执行完了,否则继续往后
        } elseif (表达式2) {
            表达式2为true执行这里,这个分支就执行完了,否则继续往后
        } elseif (表达式3) {
            表达式3为true执行这里,这个分支就执行完了,否则继续往后
        } else {
            表达式为false执行假区间
        }

    if分支的特点:
        1. 所有的条件表达式最终都会被转换为布尔值,要么为true,要么为false
            if ('123') { true }
        2. 当if后面没有花括号{}包裹的时候,只会执行1条PHP语句(了解)
        3. else if中间可以加上一个或多个空格隔开(了解)
        4. 流程控制有一些替代写法(了解)

    4. 巢状分支(就是if嵌套)

    5. switch语句的多向分支
        switch (表达式) {
            case 值1:
                语句体;
            case 值2:
                语句体;
            ...
            default:
                语句体;
        }
        switch会取出括号里的值,然后与语句体中的case所列出的值逐一比较(用==比较),如果结果为false,则将结果往下一个case传递;如果为true,则执行该case中的语句体;然后再碰到break语句即跳出switch条件判断,如果所有的值比对都不符合,则会执行default中的语句体

四十七.流程控制之循环结构:
    1、while循环
        while (表达式) {
            循环体;
        }

        当‘表达式’的结果为真时,程序将反复执行‘循环体’,直到表达式的结果为假时才停止执行该段程序,循环结束

    2、do...while循环
        do {
            循环体
        } while (表达式);

        程序会先执行 do 里面的循环体,然后再检查表达式是否为真;
        真,就再进行 do 语句体中的语句;
        假,循环立马结束,不再执行循环体;继续运行后续代码

    3、for循环
        for (初始化语句; 条件判断语句; 每次循环后执行的语句) {
            循环体;
        } 
        初始化语句:在整个循环开始前,无条件的执行一次,并且只有一次;
        条件判断语句:在每次循环前都会判断,为true执行循环体,为false就终止循环
        每次循环后执行的语句:每单次循环后都会执行这个语句

特殊的流程控制语句:
    break       跳出整个循环
    continue    跳出本次循环,继续下一次循环
    exit 或者 die     结束脚本执行;
        die;
        exit;
        die();
        exit();
        die('结束时输出的字符串');
        exit('结束时输出的字符串');

流程控制的替代语法:
    替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor; 以及 endswitch;。
    
    do-while 只有一种语法,没有替代语法

四十八.函数是什么:
    函数(function)是一段完成指定任务的已命名代码块。函数可以遵照给它的一组值或参数完成特定的任务,并且可能返回一个值。(比如循环输出10行10列的表格,或者N行N列的表格)

PHP中函数分为两种:
    1、自定义函数
        (比如循环输出10行10列的表格,或者N行N列的表格)
    2、系统函数
        (比如var_dump()、time()等等)

自定义函数
    1.自定义函数的格式
        function 函数名([参数列表])
        {
            函数体;
        }
    2.函数名的命名规则
        字母、数字、下划线,不能以数字开始;不能是关键字,不能与已存在的函数重名!
        函数名不区分大小写
    3.函数的调用
        函数名([参数列表])
        注意:函数的调用不分先后!!!!
        //小提示:在PHP中,只要以$符开始,就是变量;只要加()就是调用函数

函数的参数
    形参
        函数定义时写的参数叫形参
        形参可以有默认值,默认值必须是常量表达式,不能是诸如变量、或者函数调用等
        有默认值的形参应该写在形参列表的右边,不然形同虚设
    实参
        调用函数时传的参数叫实参
        实参的传递要与形参一一对应,个数最好是一样的,不能少(形参没有默认值的时候),也不要多

函数的返回值
    使用return语句可以让函数返回一个值
    1、没有return语句的函数,默认返回null
    2、return语句会立即终止函数的运行,函数中的后续代码不执行

四十九.检测函数是否存在
function_exists检测函数是否存在

五十.变量的作用域 —— 
    能够有效作用的区域
 全局变量
        1、在函数范围之外定义的变量叫全局变量(全局的按字面意思来说,到处都可以访问,比如函数内,C语或者Javascript言确实是的),但是,在PHP中,函数被看做一段独立的功能个体,它无法直接访问全局变量
        2、在函数内想要访问全局变量
            1.用关键字global将变量声明为全局的
            2.通过超全局数组$GLOBALS['变量名']取下标的方式访问
                这是一个特殊的变量,会在脚本运行时自动创建
局部变量
        1、在函数内部定义的变量叫局部变量,该变量仅在当前函数的作用域内有效,函数调用完毕立即释放
        2、在全局范围内访问局部变量
            1.将局部的用global变为全局的(要在变量定义之前声明)
            2.将变量当做返回值return出去
        3、形参也是局部变量

静态变量
    用关键字static声明静态变量
    特性:静态变量只会声明一次,不会重复声明

想了解任何一个函数都需要从3个方面去分析:
    功能 参数 返回值
    我们写函数的时候对这3个部分也要描述清楚,怎么描述呢,注释:
    参数
        1、常规参数,PHP八大类型
        2、伪类型参数  (语言参考-》类型-》本文档中使用的伪类型与变量)
            mixed    说明一个参数可以接受多种不同的(但不一定是所有的)类型。
                如:var_dump()
                    print_r()
            number   说明一个参数可以是 integer 或者 float。
                如:pow() 求次方数 
            callable 表示该参数需要传一个函数,还有个别名callback
                如:call_user_func()
                    session_set_save_handler()
            void 作为返回类型意味着函数的返回值是无用的;作为参数列表意味着函数不接受任何参数。
                如:unset()     不能有返回值
                    time()      不接受参数
            $... 表示一个函数可以接受任意个参数
                如:var_dump();
    
    (要求:自定义一个函数,将任意个参数相加并返回结果)

    可变个数的参数列表
        func_get_args()  //返回一个数组,包含所有参数
        func_num_args()  //返回参数总数 
        func_get_arg(int)    //接收一个数字参数,返回指定参数,从0开始数

函数参数的传递
    1.值传递(常用)
    2.引用传递
        通过引用传递的参数,函数可以修改其参数的值(语言参考-》引用的解释-》引用传递)

        注意:如果形参用'&$a'引用传递,调用函数时必须传变量,不能直接传值

函数的种类:
    可变函数
        如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它

    回调函数
        被当做参数传递的函数,叫回调函数
        专门用来调用回调函数的函数:
            call_user_func('函数名'[, 参数1, 参数2...])

    匿名函数:
        没有名字的函数;
        通常作为回调函数传递

    递归函数:
        就是自己调用自己的函数

文件的包含:
    可以使用自定义函数库,并且可以更好的实现代码重用!
    include
        include '文件路径';
        include('文件路径');
    require
        require '文件路径';
        require('文件路径');
    区别:如果包含的文件不存在,include报warning警告级别的错误,后续代码继续执行;require报一个fatal error致命错误,后续代码不执行

    include_once
    require_once
        用法同上面的include 和require ,区别也同上
    
    include和include_once的区别
        include:包含一次就执行一次;
        include_once:不管包含多少次,都只会执行一次,通常用于包含有函数、或者常量等不能重复定义的文件





五十一.正则表达式 
    1、什么是正则表达式?
        正则表达式是一个从左到右匹配目标字符串的模式
    2、作用
        1.用于匹配(比如匹配邮箱、手机号)
        2.用于替换(可以用新的东西把符合你条件的东西给替换了)
        3.用于提取想要的内容
    3、学习正则的流程
        1.正则的语法
        2.正则的函数

正则语法
    1、分隔符
        在PHP中,正则表达式其实就是一个用分隔符包裹着的特殊的字符串,比如:
            $pattern = '/\d/';

        常用的分隔符为'/',但是不仅限于'/';分隔符可以是任意非字母、数字、非反斜线、非空白字符,比如:#、$、%。。。
    2、原子
    原子是组成正则表达式的最小单位,每个正则表达式最少要包含一个原子!

    原子的类型:
        1.普通字符做为原子
            比如:0~9 a~z A~Z...等等
        2.特殊字符做为原子
            比如:$ . * ? ^...等等
            一般标点符号和其他在正则中有意义的符号,想做为原子都需要加转义斜线\
            提示:部分标点符号不用加\也可以,但是,加了也不会出错!比如逗号,
        3.非打印字符(转义字符)
            \r \n \t \\ ...等等
        4.通用字符类型做为原子
            \d  匹配0~9之间的数字
            \D  匹配除了0~9之间的数字之外的
            \w  匹配数字、字母、下划线
            \W  匹配除了数字、字母、下划线
            \s  匹配任意个空白符
            \S  匹配除了空白符之外的
        5.自定义原子列表
            用[]自定义原子列表
            比如:'/[abc]/'表示abc任何一个都可以
            1.中横线-可以表示范围:1-9|a-z
            2.^可以表示除了

    3、元字符:拥有特殊的含义,不再单纯的表示自己
        1、字符串的边界
            ^ 表示匹配开始位置
            $ 表示匹配结束位置
        2、重复匹配:
            这几个元字符表示量词,用于修饰前面一个原子的个数
            ?   表示0次或1次
            +   表示1次或多次
            *   表示0次、1次或多次(任意次)
        3、通配符:点号.
            匹配除了换行符\n之外的任意一个字符
        4、重复匹配之自定义量词
            元字符{},用于自定义量词
            {n}     表示前面的原子为n次
            {n,}    表示前面的原子最少为n次,可以大于n次
            {n,m}   表示前面的原子最少为n次,最多为m次
        5、原子列表 []
            元字符[],用于定义原子列表(详情请见:6.正则的原子.php)
        6、模式选择符 | (或者叫表达式选择符)
            从|隔开的正则表达式中任意选一个来用
        7、模式单元 ()
            元字符()可以将正则表达式变成一个单元,将表达式看成一个原子来使用

            1、系统会自动将()中匹配的值存储起来,有需要时可以通过\\1、\\2、\\n或者$1、$2、$n的方式反向引用
            2、不想存储()中的值,可以用?:取消存储

    4、模式修正符:
        对整个表达式进行修饰,如:'/abc/i'
        i   表示忽略大小写
        U   修改量词的贪婪模式
            量词默认是贪婪的,表示的数尽可能的多
        x 忽略正则表达式中的空格
        s 全匹配符.将匹配任意字符,包括\n换行
        m 将字符串视为多行

五十二.正则函数:
    preg_match('正则', $str[, 匹配到的值[, 是否存储下标[, 从哪儿开始匹配]]])
        匹配到的值:第0个,为匹配到的整体字符串;之后依次放()里面匹配到的值,默认为一维数组
        是否存储下标:PREG_OFFSET_CAPTURE存储下标,会将$m变为二维数组
        从哪儿开始匹配:默认为0,匹配整个字符串
        返回值:返回匹配次数,0次或1次

    preg_match_all('正则', $str[, 匹配到的值[, 是否存储下标[, 从哪儿开始匹配]]])
        匹配到的值:第0个,为匹配到的整体字符串;之后依次放()里面匹配到的值,默认为二维数组
        是否存储下标:PREG_OFFSET_CAPTURE存储下标,会将$m变为二维数组
        从哪儿开始匹配:默认为0,匹配整个字符串
        返回值:返回匹配次数,0次或1次

    preg_replace('正则', '替换成', '在哪儿换');
        执行一个正则表达式的搜索和替换
        
        将正则匹配到的内容替换成指定内容;如果没匹配到,返回原字符串

    正则切割
        preg_split(‘正则’,‘要切的字符窜’,)
            用正则表达式切割字符串
  

五十三.错误处理
    错误的分类
        语法错误
            这种错误最常见,但也最容易搞定;一旦出现,一行代码都不执行
        运行时错误
            在页面上给你报出来,有的会终止代码执行,有的不会
        逻辑错误
            这种错误最麻烦
    
    错误的级别
        notice  
            提示级别,不会影响后续代码的执行
            如:输出不存在的变量
        warning 
            警告级别,也不会终止代码执行
            如:include包含文件
        error   
            错误级别,会终止代码执行
            如:语法错误或者require
        deprecated 
            反对级别,不赞成这样的使用,不会终止代码执行
            如:(5.6用mysql_connect、echo mktime())
        strict
            语法不够严谨

    处理错误:
        1.用@屏蔽错误信息
            有的错误屏蔽不了
        2.通过配置文件php.ini控制错误的显示
         phpinfo();能看到很多信息,找出php.ini的路径
            display_errors
                display_errors = off    //不显示任何错误
                注意:关闭错误显示后,如果页面中有error级别的错误,服务器会直接返回500错误
            error_reporting
                error_reporting = E_ALL //显示所有错误
                问:如何设置只显示除了NOTICE之外的错误
                答:方法一:error_reporting(E_ALL &   ~E_NOTICE)


        3.通过ini_set函数设置
            ini_set('配置项', '配置值')
            (不是所有的选项都可以用这个函数设置,具体哪些可以设置请参考手册:附录-》php.ini配置-》php.ini配置选项列表)
        4.通过error_reporting函数设置错误级别
            error_reporting(0); //屏蔽所有错误

    自定义错误处理:
        可以通过set_error_handler函数自己接管错误处理。
        注意:致命错误无法被自定义(手册中搜索set_error_handler)

    记录错误日志
        1、以文件的方式记录(默认)
            log_errors = On     开启错误日志的记录
            error_log = C:/sb.txt 指定错误的路径
        2、记录到操作系统日志中
            error_log = syslog 指定错误的路径
            我的电脑-》管理-》事件查看器-》windows日志-》应用程序

        函数error_log('日志信息'),手动写日志


五十四.PHP的时间和日期
    获取Unix时间戳
        time()  获取当前时间戳
            因为Unix操作系统的诞生,1970年为Unix元年
        mktime() 获取一个指定日期的时间戳
            mktime(时,分,秒,月,日,年)
            没有给的参数默认为当前的!
        strtotime()将英文的时间日期描述转换为时间戳

修改PHP默认时区:
    1、改php.ini配置文件:
        date.timezone = "PRC"   //默认为UTC
            //PRC 中华人民共和国的简写
            //People's Republic of China
        
        date.timezone = "Asia/shanghai"//上海
        中原(Asia/Shanghai)       上海
        陇蜀(Asia/Chongqing)      重庆
        长白(Asia/Harbin)         哈尔滨
        新藏(Asia/Urumqi)         乌鲁木齐(慢两小时)
        昆仑(Asia/Kashgar)        喀什(慢两小时)
        参考:五大时区的划分:http://www.niubb.net/a/2015/11-15/961925.html
        date.timezone = "Asia/hong_kong"//香港
    2、通过ini_set函数来临时设置
        ini_set('date.timezone', 'PRC');
    3、通过专门的函数来设置或者获取
        date_default_timezone_set('PRC');

        //获取当前的时区设置
        date_default_timezone_get();

    格式化输出:
    date(格式字串[, 时间戳])
        格式字串中不能被识别的字符将原样显示

        echo date('Y');  //4位完完整年份
        echo date('m');  //月份
        echo date('d');  //日
        echo date('H');  //时
        echo date('i');  //分
        echo date('s');  //秒

        y 两位数的年份
        n 没有前导0的月份
        j 没有前导0的日
        G 没有前导0的小时

    获取微秒数: microtime([true])
        给了参数true返回一个浮点数


五十五.文件系统: (函数参考-》文件系统相关扩展-》Filesystem)
    当程序运行时的数据是存放在内存中的,比如变量、常量等;想要长期保存程序运行完毕所产生的数据,我们可以利用文件的方式存储到硬盘上!

文件类型:
    可以通过filetype()获取一个文件的类型
    windows最常见的只有dir和file

判断文件类型
    is_dir(路径)  //判断是否是目录
    is_file(路径) //判断是否是文件

    //了解
    is_readable(路径)     //是否可读
    is_writable(路径)     //是否可写
    is_executable(路径) //是否可执行

文件的属性:(什么叫属性?比如大小、创建时间。。。)
    检测文件或目录是否存在
        file_exists(路径);
    获取文件大小
        filesize(文件路径);     //单位为字节
    获取相关时间
        filectime(文件路径);    //创建时间  create
        filemtime(文件路径);    //修改时间  modify
        fileatime(文件路径);    //访问时间  active

目录相关
    常见路径格式:
        windows
            C:/www/index.php
            C:\www\index.php
        Linux
            /var/www/index.php
        相对路径
            ./index.php
            ../1.jpg
    路径相关的函数
        basename()取出路径中的文件名部分
        dirname()去除路径中的文件名部分
        pathinfo()获取路径中的所有信息
        realpath() 获取规范的绝对路径(文件必须存在,否则返回false)

遍历目录
    opendir(目录路径) 打开一个目录
    readdir(资源) 读取一个目录资源,并将指针往前移,返回文件或目录名
    closedir(资源) 关闭一个目录

扩充:iconv(原字符集, 目标字符集, 字符串)字符集转换

创建和删除目录
    mkdir('目录'[, 权限, true]) 创建目录
        在Windows中权限被忽略,Linux中0777表示最高权限
        第3个true,表示递归创建目录
        注意:创建的目录已存在会报错

    rmdir('目录路径') 删除目录,只能删除空目录

    unlink('文件路径') 删除文件
        文件路径:
            相对路径:./a/b/c/1.txt
            绝对路径:C:\wamp\www\php15\a\b\c\1.txt
        注意:http的绝对路径无法删除

文件的基本操作
    touch('文件名'); 设定文件的修改时间
        如果文件不存在,则会被创建。
    copy(原文件名,新文件名);
        只能复制一个文件,不能复制目录
    rename(旧名,新名 );
        重命名一个文件,其实相当于剪切

五十六.文件操作:
    打开文件+
        fopen('文件路径', 打开方式);
        打开方式:
            'r'     只读方式打开,将文件指针指向文件头。  
            'r+'    读写方式打开,将文件指针指向文件头。  
            'w'     写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。  
            'w+'    读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 
            'a'     写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。  
            'a+'    读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 
 
        w或w+/a或a+,如果不存在会自动创建
        r或r+,不会自动创建文件
    写文件
        fwrite(资源, '写的内容');
            写的位置由打开方式决定
    读文件
        fread(资源, 读的长度);
            读的长度必须大于0
    关闭文件
        fclose(资源);
    指针重置:   
        rewind($?)   将文件指针重置到文件开头,方便读取内容
简单的文件读写:(常用)
    file_get_contents(文件路径)
        读取文件内容,返回文件内容的字符串
    file_put_contents(文件路径,写的内容[, FILE_APPEND])
        文件不存在就创建;默认为覆盖内容,可以用第3个参数设置为追加

文件上传和下载
    上传用到头像、相册、网盘、资料、种子、资源等
    下载资料、种子、资源、图片等

文件的上传
    就是将文件从客户端上传到服务端
    实现步骤:
        1、表单的设置
            1.要做文件上传,method必须使用post
            2.必须在form标签里面加:enctype="multipart/form-data"
                enctype:用于指定在发送数据到服务器之前如何对表单数据进行编码
                multipart/form-data:表示不对数据进行编码,以文件流(二进制)的形式上传到服务器。
                application/x-www-form-urlencoded:默认选项,默认对所有字符进行编码
            3.<input type="hidden" name="MAX_FILE_SIZE" value="2000">

        2、服务器端的设置
            1. file_uploads = On 是否允许文件上传
            2. upload_max_filesize = 2M 上传文件最大允许范围
            3. post_max_size = 8M POST表单上传数据的最大允许范围
            4. upload_tmp_dir ="c:/wamp/tmp" 上传文件的临时目录
            注意:
                post_max_size的值一定要大于upload_max_filesize的值

        3、PHP代码处理文件的上传
            1. 上传后的数据用$_FILES接收。
            2. $_FILES中每个元素的意思
                name    上传的文件名
                type    文件类型
                tmp_name    临时文件路径
                    文件上传的原理:就是在脚本执行完毕之前将文件从这个临时路径里面弄出来,因为这货会在脚本执行完毕后自动删除
                error   错误号
                    其值为 0,没有错误发生,文件上传成功。
                    其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
                    其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
                    其值为 3,文件只有部分被上传。
                    其值为 4,没有文件被上传。
                    其值为 6,找不到临时文件夹。
                    其值为 7,文件写入失败。(比如你的临时目录没有写的权限)
                size    文件大小,单位为字节

执行文件上传:
    move_uploaded_file(临时文件名, 新文件名);
    本函数检查文件是否是合法的上传文件

完整的文件上传步骤
    1、判断错误号
    2、判断文件的mime类型
    3、判断文件的大小
    4、生成随机的文件名
    5、获取文件的后缀名
    6、判断并执行文件上传
        is_uploaded_file()

五十七.文件下载步骤:
    将文件从服务器下载到客户端
    注意:如果浏览器能够识别该文件的mime类型,会直接解析;如果不能识别,则提供下载

    所以,我要手动告诉浏览器,这是一个附件,你不要给我解析出来

    步骤:
        1.告诉它是一个附件
            header('Content-disposition:attachment')
        2.下载的文件没内容
            在php输出的内容会被下载
            用readfile()读取并输出
        3.结合第1步,给文件取个名字
            header('Content-disposition:attachment;filename=xxoo.jpg')
        4.告诉它文件的大小
            header('Content-length:'.filesize('文件路径'));
        5.告诉它文件的类型
            header('Content-type:image/jpeg');

五十八.数据库
    数据库
    数据库是计算机应用系统中的一种专门管理数据资源的系统。数据库就是一组经过计算机整理后的数据,存储在一个或者多个文件中,而管理这个数据库的软件就称为数据库管理系统。常见的软件开发中应用数据库有IBM的DB2,Oracle,SQL Server,PostgreSQL,MySQL,Access等。


DBS 数据库系统
    DB         数据库
        Database
    DBMS     数据库管理系统
        Database Management System
    DBA     数据库管理员
        Database Administrator

SQL结构化查询语言
    SQL是一种专门用于查询和修改数据库里的数据,以及对数据库进行管理和维护的标准化语言

    数据定义语言(DDL):用于定义和管理数据对象,包括数据库,数据表等。例如:CREATE,DROP,ALTER等。
    数据操作语言(DML):用于操作数据库对象中所包含的数据。例如:INSERT,UPDATE,DELETE语句。
    数据查询语言(DQL):用于查询数据库对象中所包含的数据,能够进行单表查询,连接查询,嵌套查询,以及集合查询等各种复杂程度不同的数据库查询,并将数据返回客户机中显示。例如:SELETE
    数据控制语言(DCL):是用来管理数据库的语言,包括管理权限及数据更改。例如:GRANT,REVOKE,COMMIT,ROLLBACK等。

关系型数据库
    以行和列的形式存储数据,这一系列的行和列被称为表,一堆表组成了数据库,一堆库组成了咱们的数据库服务器

mysql的连接
    mysql -u用户名 -p密码 -h服务器地址
注意:
    1.每个SQL命令都需要使用分号来完成
    2.可以将一行命令拆成多行
    3.可以通过\c、ctrl+c来取消本行命令
    4.可以通过\q、exit或者quit来退出当前客户端

常见操作
    显示帮助信息:\h(同help命令)
    将查询后的数据立起来:\G
    取消当前未完成的操作:\c
    退出当前客户端:\q
    显示当前服务器状态:\s
    更改执行符:\d

数据库的基本操作
    -- 查看所有的数据库
        show databases;
    -- 选择数据库
        use 库名;
    -- 创建数据库;库名已存在报错
        create database 库名;
        create database if not exists 库名;
        create database 库名 default charset=utf8; --指定默认字符集
    -- 删除数据库;库名不存在报错
        drop database 库名;
        drop database if exists 库名;

表的基本操作
    -- 查看所有数据表
        show tables;
    -- 创建数据表;
        create table 表名(
            字段1 类型,
            字段2 类型,
            字段2 类型
        )engine=myisam default charset=utf8;
        注意:字符集为utf8,少个-
    -- 查看表结构
        desc 表名;

    -- 删除数据表
        drop table 表名;

数据相关操作
    -- 插入数据
    insert into 表名 (字段1,字段2...) values(值1,值2...);
    -- 查看数据
    select `字段1`,`字段2` from 表名;
    select * from 表名;
    -- 修改数据
    update 表名 set 字段1='值1',字段2='值2'... where 条件;
    -- 删除数据
    delete from 表名 where 条件;

    注意:
        1.字段名的反引号``可以省略,关键字除外;
        2.所有的字符串值都需要加引号'';
        3.所有修改和删除不加where条件都是耍流氓!

导出备份
    -- 在cmd下操作:
    -- 导出指定数据库的结构和数据
    mysqldump -uroot -p 库名 > 导出的路径
        如:mysqldump -uroot -p gz24 > C:/gz24.sql;
    -- 导出指定数据库里面某张数据表的结构和数据
    mysqldump -uroot -p 库名 表名 > 导出路径

    -- 小技巧:库名前面加-d表示只导出结构,不导出数据
        如:mysqldump -uroot -p -d gz24 > C:/gz24.sql;

还原
    -- 导入1:在cmd操作
    mysql -uroot -p 库名 < 要导入的文件路径
    -- 导入2:在进入mysql并use了数据库的情况
    source 文件路径

权限相关
    -- 修改密码1:在cmd通过mysqladmin操作.密码太简单可能会有警告warning
    mysqladmin -uroot -p password 123

    -- 修改密码2:进入mysql的情况
    set password for root@localhost=password('123');

    -- 修改密码3:修改mysql库中user表,改完记得刷新服务器
    update user set authentication_string=password('123') where user='root';
    -- 刷新服务器
    flush privileges;

    -- 给一个用户授权,用户不存在就自动创建
    grant 权限 on 库名.表名 to 用户名@主机名 identified by '密码';
    -- 例子:
    grant all privileges on *.* to hehe@localhost identified by '123';
    grant select,insert,update,delete on *.* to hehe@localhost identified by '123';



建表相关
    1、定义数据表时,会指定数据的类型,整型、浮点型、字符串、日期、枚举、集合类型
    根据你里面存什么东西来选择用什么类型。

    整型 
        tinyint
            取值范围
                有符号:-128 ~ 127
                无符号:0 ~ 255  unsigned
            占1个字节
            可以用于存年龄、标记,比如商品的状态:1新添加,2表示在售中,3已下架;订单状态、性别
        smallint 占2个字节
        mediumint 占3个字节
        int     占4个字节
            取值范围
                有符号:正负二十多个亿
                无符号:0~40多个亿
            用于计数、时间戳
        bigint 占8个字节

        注意:
            1.存入小数会四舍五入
            2.超出取值范围报错
                非严格模式下,取最大值存入
            3.int(5)表示的只是显示宽度,并不是限定只能插入5位数,它具体的取值范围,由类型所决定

    浮点 float  6,2 9999.99
        定点数和浮点数都可以使用类型名后面加(M,D)方式来表示。(M,D)表示该类型一共显示出M位数字(整数位+小数位),D为小数点后面几位
        float(浮点型)
        double(双精度)
            可以表示的范围更广,精度更高
        decimal(定点数)
            默认为(10,0)
            比float更精确

        注意:
            1.当小数超出规定长度,采用四舍五入保存
            2.超出整数范围,报错,无法插入

        2、decimal和double的不同点
            定点数如果不写精度和标度会按照decimal(10,0)来进行操作。如果超出了精度和标度,
             也会进行四舍五入。定点数的存储使用二进制进行存储所以比较准确。

            注意:
                1、浮点数会存在误差。
                2、对于精度比较敏感的数据应该用定点数来进行表示。

    字符串
        char和varchar很类似,都可以用来存储MySQL中较短的字符串,区别:+
            1、char列的长度为固定长度,创建表的时候声明的最大长度,可以为0~255
            2、varchar值可变长度,长度为0~65535之间的值。
            3、char和varchar在超出指定的长度时都会被截取到指定的字符串(非严格模式下)。

            4、text和blob,二者之间的区别是blob用来保存二进制数据,text只能保存字符串数据。
            5、blob和text在经过大量的删除操作之后有可能会引起性能问题。(删除以后在数据表中留下“空洞”)
            可以使用 optimize table 表名 来回收这些空间。

    时间戳 int

    枚举类型:enum
        mysql> create table tt3(
            -> test enum('a','b')
            -> );
        Query OK, 0 rows affected (0.03 sec)

        mysql> insert into tt3(test) values('a');

    注意:
        1、枚举方式的取值范围需要在创建表的时候显式的指定。
        2、对于1~255个成员的枚举需要占用1个字节存储对于256~65535个成员使用2个字节存储。最多存储65535个成员。
        3、如果超过了枚举里面指定的值,将会插入一个‘空’,枚举类型只能从集合中选取单个的值。而不能一次选去多个值。
        4、enum的值不区分大小写


    集合类型
        mysql> create table t3(
        -> col set('a','b','c','d')+
        -> );

    注意:
        1、set类型可以在里面保存0~64个成员,根据成员的不同所占空间的大小也不同
            1~8 1
            9~16 2
            17~24 3
            25~32 4
            33~64 8

        2、set和enum除了存储之外,主要区别在于set类型可以一次选取多个成员,enum只能选取一个。
        mysql> insert into t3(col) values ('a,b,c');

        注意:
            1、重复的成员只保留一个。
            2、超出范围的成员将会忽略。
            3、插入值的时候应该都带引号。

    总结:
        int 4个字节  正负20多个亿或者0~40多个亿
        tinyint 1个字节 正负127左右 或者 0~255

        decimal(10,2) 最多10位,其中有两位小数:99999999.99

        char(32) 定长
        varchar(255) 不定长 length + 1

约束条件:对字段进行一些约束用的
    1、null、not null,插入值时没有在字段中插入一个值,默认为null。
    指定not null必须在插入值时在该字段中插入一个值。如果不给插入一个值那么为”空“

    2、default 默认值在不插入该字段时默认插入的值。

    整型的约束条件:
        1、zerofill表示0填充。一般和整型后面设定的宽度一起使用,如果数值长度小于指定的长度那么将会在前面补充相对应的0进行填充。
        2、unsigned(无符号)如果要在字段里面保存非负数,或者较大上限的值时可使用该约束条件,将从0开始,需要在字段类型后面紧跟着定义unsigned
            mysql> create table t9(
            -> id int unsigned not null,
            -> name char(32)
            -> );

        3、auto_increment,自增,在产生一个唯一的标识或顺序值的时候,可以利用这个约束条件。这个约束条件只能用于整数类型,值一般从1开始。
每行加1,插入一个null到一个auto_increment列时,MySQL将插入一个比出现过的最大值+1的值。一个表中只能有一个auto_increment列,并且必须定义为primary key或unique才能够使用
            mysql> create table t1(
            -> id int unsigned auto_increment primary key,
            -> name char(32)
            -> );

索引
    索引是数据库中用来提高搜索性能的。我们通常在做数据库优化的时候通常先做索引的优化,数据量少的时候没效果,数据越多效果越明显。索引加上之后是自动创建的,不是我们刻意去使用的。

索引的分类:
    1、常规索引(index),最基本的索引,没有任何限制
        创建索引:
            create table 表名(
            字段.....,
            index 索引名 (要索引的字段)
            );

            mysql> create table t2(
            -> id int unsigned,
            -> name char(32)
            -> ,index id(id)
            -> );

        表已经创建的情况下:
            create index 索引名 on 表名(要加索引的字段);
            mysql> create index id on t3(id);

        删除索引:
            drop index 索引名 on 表名

    2、唯一索引(unique)与普通索引相似,但是索引列里面的值必须是唯一的,允许有空值

        创建索引:
            create table 表名(
            字段....,
            unique 索引名(要索引的字段)
            );

            mysql> create table t4(
            -> id int unsigned,
            -> name char(32),
            -> unique id(id)
            -> );

        表已经创建的情况下:
            create unique index 索引名 on 表名(要索引的字段)
            mysql> create unique index id on t5(id);

        删除索引:
            drop index 索引名 on 表名


    3、主键索引(primary key),和唯一索引类似,也是唯一的,一个表只能有一个主键
        创建索引:
            create table 表名(
            id int unsigned auto_increment primary key,
            name char(32)
            );

        删除索引:
            alter table 表名 drop primary key
            mysql> alter table t7 drop primary key;

            注意:如果主键的字段上面有自增(auto_increment)那么需要先将auto_increment去掉。然后再删除。

            alter table 表名 change 自增的列  自增的列  类型

            mysql> alter table t6 change idaaaaa id int primary key;


-- 存储引擎
    mysql中常用的存储引擎就两种:myisam和innodb
    基本的差别:
        1.myisam不支持事物处理、外键等高级特性,而innodb支持
        2.myisam强调的是性能,其执行速度比innodb略快
        3.myisam是表锁,innodb是行锁

-- 字符集的设置
    mysql的字符集分为4个级别:
        服务器级别
        库级别
        表级别
        字段级别

    库级别
        1.查看数据库的字符集
        show create database 库名;
        2.建库的时候指定字符集
        create database 库名字 default charset=utf8;
        3.修改库的字符集
        alter database 库名字 default charset=utf8;

    表级别:
        1.查看表的字符集
        show create table 表名字;
        2.建表的时候指定字符集
        参考之前的
        3.修改表的字符集
        alter table 表名字 default charset=utf8;

    注意:没有指定字符集的时候,默认是向上继承


-- 表的修改
    1.修改表的名字
        alter table 旧表名 rename 新表名
    -- 2.改字段的类型
    alter table s1 modify name char(30) not null;
    -- 3.改字段名
    alter table s1 change username name varchar(30) default 'no';
    -- 4.添加新字段
    alter table s1 add sex enum('m', 'w', 'y') not null default 'm';
    alter table s1 add des varchar(255) first;
    alter table s1 add des2 varchar(255) after id;
    -- 5.删除字段
    alter table s1 drop des2;
    -- *6.修改表的存储引擎
    alter table 表名字 engine=myisam;
    -- *7.修改表的字符集
    alter table 表名字 charset=utf8;
    alter table 表名字 default charset=utf8;


-- 数据操作语言(DML)
    1.insert 增 
        1.可以插入单条语句
        insert into 表名 value();
        2.插入多条语句
        insert into 表名 values(),()...;
        3.指定字段
        insert into 表名(字段1,字段2...) values(),();
        注意:没有指定字段的情况下,必须将所有的字段都一一赋值
    2.update 改
        update 表名 set 字段1=值1,字段2=值2... where 条件;
    3.delete 删
        delete from 表名 where 条件;

-- 数据查询语言(DQL)
    select语句
    1.查询所有
    select * from 表名;
    2.查询指定字段
    select 字段1,字段2... from 表名;
    3.给字段指定别名
    select 字段1 as 别名,字段2 from 表名;
    -- as可以省略
    select 字段1 别名,字段2 from 表名;
    5.在select中使用表达式
    运算符:+ - * / %
    函数:
        md5()  md5加密
        password()  mysql的加密
        unix_timestamp() Unix时间戳(和php中time()返回的一样)
        concat() 将两个字段连接查询
    6.where条件
    and 和 or
    is null 和 is not null
    between 和 not between
        select * from exam_type where id between 3 and 10;
    like 和 not like
        _     表示任意的单个字符
        %     表示任意个字符
        select * from exam_user where username not like '%强';
    in 和 not in
        select * from exam_user where id not in(1,2,2,3,4,3,432,423,4,234,32);

    排序
        order by 字段[ asc];(默认升序)
        order by 字段 desc;(倒序)
    限定条数
        limit 5; 只查5条
        limit 5,5;跳过5条,取5条
        分页公式: (当前页-1) * 每页显示条数
五十九.误删除root用户或者忘记mysql密码

在误删root用户或者忘掉root密码的时候咋办?别急,哥来告诉你,按照以下步骤就能搞定:(前提得是自己的mysql服务器)

1.在my.ini中的[mysqld]模块下添加 skip-grant-tables并重启,表示跳过权限表的加载
//扩充,这一步还有另一个方法:
    停止mysql服务后,在cmd用mysqld命令开启安全服务,之后也可以直接进行下面的步骤:
        mysqld --skip-grant-tables
    关键是操作完毕后要记得关闭安全服务,不然mysql服务无法启动:
        mysqladmin shutdown

2.重启后登录数据库:mysql

3.找到mysql库的user表,添加数据:
    insert into user(user,ssl_cipher,x509_issuer,x509_subject) values('roots','','','');
添加完成后,对该root用户更新权限,更新权限命令如下:
update user set Host='localhost',select_priv='y', insert_priv='y',update_priv='y', Alter_priv='y',delete_priv='y',create_priv='y',drop_priv='y',reload_priv='y',shutdown_priv='y',Process_priv='y',file_priv='y',grant_priv='y',References_priv='y',index_priv='y',create_user_priv='y',show_db_priv='y',super_priv='y',create_tmp_table_priv='y',Lock_tables_priv='y',execute_priv='y',repl_slave_priv='y',repl_client_priv='y',create_view_priv='y',show_view_priv='y',create_routine_priv='y',alter_routine_priv='y',create_user_priv='y' where user='root';

4.执行完成后,更新权限并退出数据库。
    flush privileges;
    exit;

5.注释掉skip-grant-tables参数,重启数据库,就可以使用root登录了,默认没有设置密码!



五十九 .POD

 面向对象编程 —— OOP(Object-Oriented Programming)
    面向对象的三大特征
        封装、继承、多态
    对象
        万事万物皆对象
        客观存在的任何一个实体
    类
        对相同或相似对象的一种抽象描述
    类与对象
        通常先有类,通过类实例化出对象;大多数情况下使用的是对象

    类的定义格式
        class 类名
        {
            [成员属性] —— 相当于变量
                可以有默认值
                不能是变量
                可以是常量
                可以有运算 5.6+
                值可以是任意类型

            [成员方法] —— 相当于函数
                和以往的函数一致
                可以直接访问自己的成员属性($this)
        }

    类的实例化
        new
            $对象名 = new 类名;
            $对象名 = new 类名();

            每次new都会得到一个新对象
            都会触发构造方法

    对象成员访问符 ->
        $对象名->属性名;    //加了$,含义不一样
        $对象名->方法名();

    伪变量 $this
        类型是一个对象,表示的是自己
        不能在类外使用

    魔术方法
        构造方法
            __construct()
            在使用new关键字得到新对象的时候
        析构方法
            __destruct()
            在销毁对象的时候。脚本执行完毕,会自动销毁对象

    对象的比较
        =
            取别名,不会产生新对象
        ==
            判断是否是同一个类的实例,并且属性和值是否相同
        ===
            判断两个对象是否是同一个对象

PDO的基本使用

封装
    三个关键字
        public、protected、private
    三个范围
        自己、家族、外部
    3P表
                自己     家族     外部
    public           Y       Y       Y
    protected       Y       Y       N
    private       Y       N       N     

魔术方法
    __construct构造方法(可能会看到和类名同名的方法)
        触发时机:使用new关键字得到新对象的时候
        参数:可有可无
    __destruct析构方法
        触发时机:销毁对象的时候
        参数:不能有

    __set
        触发时机:在给一个没有权限访问或者不存在的属性赋值的时候
        参数:2个(要赋值的属性名,值)
    __get
        触发时机:在获取一个没有权限访问或者不存在的属性的时候
        参数:1个(要获取的属性名)

    __isset
        触发时机:在使用isset函数检测一个没有权限访问或不存在的属性的时候
        参数:1个(要检测的属性名)
    __unset
        触发时机:在使用unset函数删除一个没有权限访问或不存在的属性的时候
        参数:1个(要删除的属性名)

    __call 
        调用没有权限访问或者不存在方法的时候
    __callStatic
        调用没有权限访问或者不存在静态方法的时候

    __toString
        将对象当做字符串输出的时候
    __invoke
        将对象当做函数调用的时候

    __sleep
        使用serialize串行化对象的时候
    __wakeup
        使用unserialize反串行化的时候

    __clone
        使用clone关键字克隆对象的时候

    __autoload
        在使用不存在的类的时候
        唯一一个写在类外的方法

extends
    用于继承
父类
    被其他类继承的类,也叫基类
子类
    继承其他类的类,也叫派生类

继承本身的特性
    PHP只支持单继承     只能有一个爹
    PHP可以被多个继承     一个爹可以有多个儿子
    PHP支持多层继承     可以有祖孙关系
属性的继承
    子类会覆盖父类的同名属性,私有除外
    权限只能扩大,不能缩小
    父类         子类
    public         public
    protected     public protected
    private     public protected private
    访问的一定是覆盖后的结果,私有的无法覆盖
方法的继承
    子类会覆盖父类的同名方法,私有除外
    权限只能扩大,不能缩小
    父类         子类
    public         public
    protected     public protected
    private     public protected private
    访问的一定是覆盖后的结果,私有的无法覆盖

    建议:重写父类的方法的时候,参数结构(个数,是否有默认值)保持一致;
    可以通过parent关键字调用父类的方法
    要求:重写构造方法的时候,务必先调用一次父类的构造方法,保证基类正常运行
        parent::__construct();
        父类名::__construct();

关键字
    final
        可以修饰类和方法
        被修饰的类不能被继承,方法不能被重写
    static
        可以修饰方法和属性,不能修饰类
        静态方法里面不能出现$this
        静态方法里面只能访问静态的成员属性
            self::$属性名
            类名::$属性名
    const
        在类里面定义常量
            self::常量名
            类名::常量名
    instanceof(运算符)
        检测该对象是否是该类的实例

抽象类:制定规范
    包含抽象方法的类就是抽象类
        必须用abstract来修饰

    抽象类是一个半成品,不能直接实例化
    必须继承并且子类要实现所有的抽象方法
    可以有自己的普通方法

抽象方法
    没有方法体的方法
        必须用abstract来修饰
        必须以分号结尾
    不能是private和static

接口:制定规范
    定义格式
        interface 接口名{
            [常量]
            [抽象方法]
        }

    特性
        接口里面所有都是抽象方法,不需要用abstract修饰
        接口与类之间是实现(implements)关系,可以多实现(用逗号隔开)
        接口与接口之间是继承关系
        类在继承其他类的同时还可以实现接口(多实现)

    和抽象类的区别
        如果只是单纯的定义规范,两种都可以
        如果定义规范的同时还要共享一些方法,就必须是抽象类

多态:不同的对象做相同的事情得到不同的结果

和类相关的函数
    1. class_alias('旧类名', '新类名');
        给类名取个别名

    2. method_exists(对象或者类名, '方法名');
        检测对象或者类(不受封装限制)中的方法是否存在
    3. property_exists(对象或者类名, '属性名')
        检测对象或者类中的属性是否存在,父类的私有属性无法检测
    4. class_exists('类名')
        检测类是否存在

    5.get_object_vars(对象)
        获取对象中有权限访问的成员属性,返回一个数组
    6.get_class_methods(类名或者对象)
        获取类或者对象中有权限访问的方法,返回一个数组

    7.get_parent_class('子类名');
        获取父类类名

try-catch和异常类
    $e = new Exception('胖子固有一死,或重于泰山,或重于其他山');
    try {
        echo 123;
        throw $e;    
        echo 321;    //无法执行到
    } catch (Exception $e) {
        echo $e->getMessage();
    }

 这是我的个人笔记希望对大家有帮助,

html 01, 3月27
一. 可以写在head头部的标签
1.title
用于定义网页的标题
2.meta
用于定义页面描述的相关信息
常用属性:
1.charset 用于设置网页字符集 <meta charset="utf-8"/>

值: utf-8 gbk gb2312
2.content 定义与 http-equiv 或 name 属性相关的元信息
3.name 将content的值关联到一个名称
值:
author 定义网页的作者
keywords 定义网站关键字
description 定义网站描述
4.http-equiv 将content的值关联到http的头部
常用的值:
content-type 定义文档的字符集
refresh 刷新或者跳转页面
3.link标签
用于定义两个文档的关系,通常用于导入一个css文件
常用属性
rel 定义两个文档之间的关系
css文件:stylesheet
icon小图标: icon
href 定义文件的地址
实例:
<link href="style.css" rel="stylesheet" />
<link href="f.gif" rel="icon" />
4.script标签
用于执行js文件
常用属性
src 外部js文件的地址
实例:
<script> js代码 </script>
<script src=""></script>
5.style标签
二.HTML中的文本标签
h族 标题标签
h1~h6 数字越大,字体越小
p 段落标签
b 定义粗体文本
strong 表示重要,用粗体显示
i 定义斜体文本
em 表示强调,用斜体显示
sub 下标
sup 上标
button 按钮标签

三 超链接标签 a
属性
href 指定跳转地址
注意:
1.值为空默认为刷新当前页
2.要跳转网络地址,一定要加上http://协议
target 指定跳转方式
值:
_self 在本页面打开(默认)
_blank 在新窗口打开
_top和其他分帧的name值,以后再讲
name 用于锚点跳转
锚点跳转:a标签href的值一定要与另一个a标签的name值或者其他标签的id值一毛一样

四.路径
1.相对路径
从当前访问的文件出发
./ 当前目录
../ 上一级目录
../../ 上上级目录
../../../../../ 点到盘符为止

2.绝对路径
指的是完整的路径
http://www.baidu.com
file:///D:/wamp/www/1.html


html 02, 3月28
五.图片和图像映射
img 标记一张图片
属性:
src 图片路径(相对或者绝对)
alt 图片加载失败的时候显示的文字

title 给图片加描述
width/height 设置图片的宽高
align 设置图片在本行中的位置
值:top/bottom/left/right
usemap 定义图片映射,和map标签的name值相对应

map 用于图像映射
属性:
name name的值用于配合img标签中的usemap属性
area 定义图像映射的区域
属性
shape 映射的形状
default 规定全部区域。
rect 定义矩形区域。
circ 定义圆形。
poly 定义多边形区域。
coords 配合shape使用,确定可点击区域的坐标
href 点击区域要去的地址
target 打开方式


六.音频标签

<!--
audio 加载一段音频,h5新增标签
属性:
src 音频的路径
controls 显示播放控件
autoplay 自动播放
loop 循环播放
muted 是否静音

提示:双标签,标签里面的内容是在浏览器不支持该标签的时候显示
-->
七.视频标签
<!--
video 加载一段视频,h5新增标签
属性:
src 音频的路径
controls 显示播放控件
autoplay 自动播放
loop 循环播放
muted 是否静音

width/height 设置视频的宽高
poster 设置视频封面图,值是图片路径

提示:双标签,标签里面的内容是在浏览器不支持该标签的时候显示
-->
八,音频标签
source
定义音频或者视频的媒介资源
属性:
src 定义媒介资源的路径

会从资源列表中找出一个可解析的资源

九.表格标签

table 定义个表格
属性:
border 定义表格的边框,值是边框的宽度
width 定义表格的宽度
cellspacing 定义每个单元格之间的空白距离
cellpadding 定义每个单元格内容与边框之间的距离

bgcolor 设置表格的背景颜色
align 设置表格的水平位置
值:left(默认)/right/center

caption 定义表格的标题
tr 定义表格的行(有多少行就有多少对tr)


属性:
height 设置行的高度
align 设置本行的文本的水平对齐方式
值:left(默认)/right/center
valign 设置本行文本的垂直对齐方式
值:top/bottom/middle(默认)
bgcolor 设置本行的背景颜色

th 定义表格的表头(有多少列就有多少对th)
默认为加粗并居中
td 定义表格的单元格
属性:
width/height 定义单元格的宽高
align 设置本行的文本的水平对齐方式
值:left(默认)/right/center
valign 设置本行文本的垂直对齐方式
值:top/bottom/middle(默认)

*colspan 规定单元格可以横跨的列数
*rowspan 规定单元格可以横跨的行数

thead 定义表格的头部部分
tfoot 定义表格的页脚部分
tbody 定义表格的主体部分

 

 

表单标签
form 定义一个表单
属性:
action 要提交的地址(通常为服务器上的某个php文件)
method 提交的方式
get(默认) 会将表单的数据显示在url地址栏
post 不会将表单的数据显示在地址栏
input 定义一个输入框
属性:
type 规定输入框的类型
值:
text (默认) 文本输入框
password 密码输入框
radio 单选框(name值一定要一样)
checkbox 多选框

name 定义输入框的名字
button 按钮标签

html 04,3月29
十,补充两个标签
font 定义字体
属性:
color 设置文字颜色
size 1~7 设置文字大小,默认为3
center 对包裹的元素进行居中

 

十一. 表单标签
input


属性:
type
text value设置默认值
passwor value设置默认值

radio 单选框 真正的值
checkbox 复选框 真正的值
file 文件上传
hidden 隐藏域(用于悄悄传输数据)
submit 表单提交按钮
image 表单提交按钮,样式来自于图片,配合src使用
reset 重置表单
button 普通按钮
size 设置type为text或者password的最大 输入框宽度
maxlength 设置type为text或者password的最大输入长度(1个汉子也只是一个字符)
readonly 设置type为text或者password的输入框为只读
mutiple 设置typ为file的文件上传域为多选(多文件上传)

 

value 定义input框的值
name 定义input
注意:input 如果没有name属性,后台拿不到数据

checked 设置单选框或者多选框的默认选中

button 按钮标签
属性
submit默认值
reset 重置表单
button普通按钮
form 将按钮绑定到某个表单
注意:值一定要与表单的id一样

label 将某个元素绑定到某个表单控件上
属性:
for 一定要和表单控件上的id值相对应
textarea 定义一个大文本域
属性:
name 定义大文本域的名字
rows 规定大文本域最大的行数
cols 规定大文本与最大的列数
select 定义一个下拉框
属性:
name 定义下拉框的名字
multipe 将下拉框定义为多选
option 下拉框中的选项
属性:
value 定义下来框真正的值
selected 默认选中
fieldset 将表单项进行分组
legend 给分组的表单加个标题
disabled: 禁用表单的属性
*: 可以加载input|select|option|textarea|button上,通用属性 可以加在表单 控件里面 用于禁用某个控件

 


十二,表单input属性
url 必须输入一个网址(必须是一http://或者https://开头)
email 必须输入一个邮箱
number 必须输入一个数字 :max, min,step

 

input的属性
required 必须输入的选项
sutofocus 自动获取焦点
placeholder 设置提示信息
autocomplete on/off 是否使用自动功能


十三,分帧标签
frameset 设置框架集 不能与body同在 (html5 淘汰)
属性:
rows 把页面分为几行
cols 把页面分为几列
frameborder 是否显示边框 0/1
border 边框的大小

frame 配合frameset使用,定义基本的框架 单标签
属性:
src 本框架链接的页面
name 本框架的名字
noresize 不能调整大小(单属性)
scrolling no/auto 是否显示滚动条

a

a标签的target属性的值
_self
_blank
_top

 

十四, iframe 框架级
在body中加载一个行内框架
属性:
src 要加载的页面地址
width/height 设置宽/高
scroling 是否显示滚动条 on/auto
frameborder 是否显示边框 值: 0/1


 

css 01,3月30
十五,css的使用方式
1.内联式(行内式)
在标签里面添加style属性。属性值为css代码
2.内部样式(通常在head)
把css代码写在style标签对中
注意:style标签对可以放在文档的任意位置,但是建议写在head里面
3.外部样式 使用用 link标签引入外部样式的文件 。例如:link herf=“” rel=“strlesheet”
注意:文件后缀不影响,推荐使用css后缀。
4.用@import导入外部文件
例如:
注意:一定要写在style标签对或者外部文件的第一行
十六,css的基本语法
1.css语法
由选择器和声明两部分组成
选择器:你需要改变样式的html元素
声明:都被包含在{}中
每条声明都是由属性和值组成,中间用“:" 冒号隔开
最后一条声明可以省略掉“;” 分号
2.css的注释
/* 注释内容 */
3.单位
3.1 长度单位
px 像素 屏幕显示的最小单位
em 倍数 字体大小相对与对于自己当前的字体大小的倍数
% 百分比

in 英寸
pt 磅
cm/mm 厘米/毫米
3.2 颜色单位
1.英语单词
2.16进制
3.rgb()
rgeb(红,绿,蓝);
数字:rgb(0~255,0~255,0~255)
百分比:rgb()

十七,css选择器
1.通配符选择器 *{margin:0;padding:0;}
2.标签选择器 不区分大小写
li{声明}
3.class类选择器 区分大小写
同时用两个或者多个类,请用空格隔开
.class名{声明}
4.id选择器 区分大小写
页面id唯一性,一次只能用一个id,一个id只能用一次

以上的这几种都是最基本,最常用的选择器。标签名不区分大小写,类和id都区分大小写

后代选择器

爹 后代 (中间用空格隔开)
组合选择器
li,p,b{}
中间用,隔开
伪元素选择器
a :link 设置访问前的样式
a :visited 设置访问后的样式
a:hover 鼠标放在链接上没有点击的状态(最常用的)
a:avtive 设置鼠标按下去还没有放开的样式

十八,选择器的优先级
标签<后代选择器<类<id 选择范围越小,优先级越高


十九,字体属性
font-size 设置字体大小
tont-family 设置字体文件
font-weight 设置粗细
取值范围:100/200/300/400/500/600/700/800/900 ,临界值为600
font-style 设置是否斜体
值:italit 斜体

font
统一设置:font:[斜体] [粗细] [大小][字体] 字体和大小必须要有,同时至少有两个才生效

二十,背景属性
background
background-color 背景颜色,值颜色单位
background-image 背景图片。值url(‘图片路径’)
background-repeat 背景图片平铺方式

repeat 默认,都平铺
repeat-x x轴平铺
repeat-y y轴平铺
no-repeat 不平铺
round 根据款到自己拉伸图片进行平铺(css3)


backfround-pasition 背景图片的位置
left/center/right 容器内左/居中/右对齐
top/bottom 上/下
background-position:x轴 y轴
background-position:100px -100px 可以给负数

统一设置背景:
background:red url('1.jpg') 图片的位置,平铺方式等等。 参数不要求个数,不要求位置


css 02,3月31
二十一,文本的属性
1.text-indent 首行缩进
text-indent:2em 首行缩进两个字符
2.text-transform :转换大小写
(1)capitlize 首字母大写
(2)uppercass 全大写
(3)lowercase 全小写
3.word-spacing 设置词间距
值:长度单位(靠空格分一个词语)

4.text-decoration 设置下划线,上划线,贯穿线
none 没有线
underline 下划线
overline 上划线
line-through 删除线
5.text-align 文本的水平对齐方式
left/center/right
6.vertical-align 文本的垂直对齐方式
top 当前行的最顶部
bottom 当前行的最底部
100px 直接用数值

7.line-height: 一行文本的垂直居中。 值一定要和容器的高一样
8.border 边框 边框默认为px,黑色,
border-width 边框的宽度
border-color 边框颜色
border-style 边框样式
值: solid 实现 (常用)
dotted 点线
dashed 虚线

可以单独设置某一条边
border-top 上
border-top-color 上颜色
border-top-width 上宽
border-top-style 上边样式
border-letf 左
border-left-width 左宽
border-left-color 左颜色
border-left-style 左样式
border-right 右
border-right-width 右宽
border-right-color 右颜色
border-right-style 右样式
border-bottom 下
border-bottom-width 下宽
border-bottom-style 下样式
border-bottom-color 下颜色

9.cursor 设置鼠标样式
值:poiter 变成小手

10列表属性
统一设置: list-style:
list-stype:none; 没有
list-style-type:
list-style-image:url()
list-style-position:
outside;在list框外
inside; 在list框内

二十二,布局。
网页布局(DI+CSS)
html额网页:标准的文档流,从从往右,从上往下

1.盒子模型
定义:任何一个元素都可以抽象成一个盒子,每个盒子可以嵌套其它盒子。
组成:元素的内容(宽高),内边距(内部白,内填充),边框,外边距(外部白,外填充)
自合模型的宽高:
盒子的宽=内容的宽+左右内边距+左右边框;
相关属性:
width/height 设置宽高
padding 内边距
border 边框
margin 外边距

2 padding 和margin 内/外边距
padding:10px 20px 30px 40px; 内边距 上 右 下 左
padding:10px 10px;上下 左右
padding:10px 20px 30px 上 左右 下

padding-top 上内边距
padding-left 左内边距
padding-right 右内边距
padding-bottom 下内边距

margin 外边距 参数用法 和内边距一样
margin-top 上外边距
margin-left 左外边距
margin-right 右外边距
margin-bottom 下外边距

3.块级元素 与行级元素
标签分为块级元素或者行级元素
1,块级元素
特点:
1.从左到右,独占一行 .
2.如果没有设置宽度,默认继承爹的宽度
3.通常块级原色可以包含其它的块级元素或者行级元素,部分标签除外。
部分标签:p,p标签千万不能套其它块级元素 h1~h6,dt.
ul,ol,table他们的子原色需要指定元素
2,行级元素
特点:
1.多个行级元素从左到右在同一行显示
2.设置宽高无效(部分标签无效),margin/padding值左右有效,上下无效。
部分标签:img/buttom/select/input/teztarea/lable 就是那么多个设置了宽/高有效的标签
3.行级元素不能嵌套其它的块级元素,只能嵌套其它的行级元素或者文本内容

3,块级与行级元素互转
display

display:block;将元素转换成块级元素
display:inline;将元素转换成行级元素
display:inline-block 将元素转换成 行级的块状元素

display:none,彻底隐藏,不保留任何物理空间

 

CSS 03 ,4月1


二十三, float 浮动
值:
left 左浮动
right 右浮动
none 不浮动
clear 清除浮动
值:
left
right
both 清除两边的浮动

css中的布局方式
1.标准文档流
从左往右、从上往下
2.浮动
浮动的盒子会脱离文档流;脱离文档流之后,其他的元素会无视它的存在;(注意:元素中的文本,依然会为它让出位置)
3.定位
二十四.定位
相对定位
relative
相对于自己原来的位置进行定位,不会脱离文档流,不会影响其他元素的布局
绝对定位
absolute
固定定位

以下4个属性,一定要设置定位后才有效
top|bottom|left|right

二十五.position 定位
相对定位 relative
相对于自己原来的位置进行定位,不会脱离文档流,不会影响其他元素的布局
绝对定位 absolute
相对于离自己最近的已经定位过的父元素进行定位,如果没找到,就相对于浏览器的左上角进行定位
会脱离文档流
固定定位 fixed

以下4个属性,一定要设置定位后才有效
top|bottom|left|right

二十六.固定定位
会脱离文档流,固定在浏览器的某个为止,不会随着滚动条的滚动而滚动

z-index 设置元素的堆叠层级
值必须为一个整数,值越大,层级越高,可以有负值
注意:必须设置position定位属性后,才可以使用

position属性
值:
relative 相对定位
absolute 绝对定位
fixed 固定定位

二十七,坑
1.元素的垂直外边距,会重叠,取最大的值显示
2.父元素的第一个子元素的上外边距margin-top如果碰不到父元素有效的边框或者padding,就会不断一层一层的找自己‘领导’的麻烦,将自己的margin-top作用在‘领导’身上;
解决:
1.给父元素加有效的边框或者padding(不能为0px)
2.给父元素设置 overflow:hidden

溢出隐藏 溢出隐藏
/*overflow:hidden;*/

/*溢出显示滚动条*/
/*overflow:scroll;*/

/*自动决定是否显示滚动条*/
/*overflow:auto;*/
。反例:不要将display设置为hidden

.子元素浮动时候,父元素的高度就不会被撑开了
解决:
1.让父元素也浮起来
2.给父元素加overflow:hidden;(常用)

 

二十八.水平居中
1.让文本或者行级元素水平居中 text-align
2.让块级元素水平居中 margin:0 auto

二十九.垂直居中
/*经典的垂直居中做法*/
position:absolute;
top:50%;
left:50%;

margin-left:-100px;容器的宽度的一半,用负值
margin-top:-100px;容器的高度的一半,用负值

 

 

三十,什么是PHP?
拍黄片。
HTML:HyperText Mark-up Language 超文本标记语言
PHP(PHP:Hypertext Preprocessor )超文本预处理器,是一种运行在服务器端的脚本语言,尤其适合web开发。

PHP能干什么?
收集表单数据
生成动态网页
收发cookies
跨平台运行
输出图像
文件处理
处理XML格式的数据
处理JSON格式的数据
会话跟踪
。。。。。


服务端脚本,用于写web网页(主攻)CGI
命令行脚本,CLI
编写桌面应用程序

PHP的特点
跨平台运行
开源免费
http://www.github.com
支持大多数的web服务器
支持很大范围的数据库

PHP的发展史
1995年由Lerdorf(PHP之父)发明
1998年PHP3发布
2000年PHP4发布,开始引入面向对象的思想(半成品)
2004年PHP5发布,完全的支持面向对象思想
5.4或者5.6最稳定
2015年12月3号直接发布了PHP7,速度翻了一倍

第一个PHP文件
1.环境装好之后,进入到网站根目录(www,如果不是wampserver,有可能是htdoc)
2.新建的文件后缀名一定是.php,文件名不能是中文的
3.写php代码:phpinfo();
4.在浏览器中访问文件:http://localhost:80/demo.php

HTML中嵌套PHP代码:
1.文件后缀必须是php
2.可以嵌套到任何地方:body中、html之外、属性中、css中
3.PHP代码必须被<?php ?>所包裹

PHP的标记
1.标准风格(常用)
<?php php代码 ?>
5.<?= 是echo的简写(常用)
<?='123';?> 相当于 <?php echo '123'; ?>


2.长风格(废物!!!!)
<script language="php">php代码</script>
3.短风格(废物!!!!)
<? php代码 ?>
需要在php.ini中开启short_open_tag(将它设置为on,默认为off)
4.asp风格(废物!!!!)
<% php代码 %>
需要在php.ini中开启asp_tag(将它设置为on,默认为off)

注意:
PSR规范中,只允许使用<?php ?>和<?= ?>这两种
如果是纯php文件,标准风格的结束标记可以不写

指令分隔符
PHP中语句分为两种
1.结构定义语句
流程控制、分支、循环、函数。。。用大括号标识,可以不加分号
2.功能执行语句
输出、变量定义、函数调用。。。后面必须加上分号
提示:php的结束标记中隐含了一个分号,最后一条语句可以不加分号

PHP中的注释
注释掉的代码,PHP都会忽略解析
1.//单行注释
//注释内容。。。
2.多行注释
/*
注释内容
*/
3.#单行注释
# 注释内容。。。

PHP中对空白符的处理
PHP会忽略空格、换行、tab制表符的解析,所以可以利用这个特点写出可读性比较高的代码
要求:php代码必须要按照严格的缩进;PSR规范规定,缩进只能4个空格(因为tab制表符的宽度,编辑器解释不一样,不利于代码的移植)

三十一.变量
什么是变量?
变量是用于临时存储值的容器
值可以是数字、文本或者其他一些比较复杂数据(数组、对象)

变量的特性
PHP是弱类型的语言,不必告知变量的类型是什么,它会根据存储的值来决定这个变量是什么类型的

*变量的命名规范:
1.必须以$开始,后面跟变量名
2.变量名由字母、数字或者下划线_组合而成
3.不能以数字开头
4.严格区分大小写
5.可以是中文,但是别让我看到这种代码,不然罚抄10000遍

三十二.八种数据类型
4种标量类型
boolean 布尔型
只有两个值,要么是true,要么是false
通常用于if判断,其他类型转换为布尔型得到false的情况:
布尔型:false
字符串:'' '0'
整型:0 -0
浮点型:0.0
数组:array() 空数组
null:null(包括未定义的变量)
其他所有值都被认为是true

integer 整型
1.整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。
八进制表达,数字前必须加上0(零)
十六进制表达,数字前必须加上 0x
二进制表达,数字前必须加上 0b
2.PHP中整型的字长用PHP_INT_SIZE表示,一般占4个字节
3.整型的取值范围:PHP_INT_MAX 正负二十多个亿!超出取值范围自动转换为浮点型
-2147483647~2147483647

float 浮点型
1.浮点数,就是有小数点的数,通常用来表示整数无法表达的数值,比如金钱值、距离值、速度值
2.可以用科学计数法来表示
3.在PHP中float也有最大数,1.8e308
4.浮点数的精度有问题
5.将浮点数取整的函数
round() 四舍五入
floor() 舍去取整
ceil() 进一取整

string 字符串类型
定义方式:
1. 单引号
2. 双引号
3. heredoc 定界符方式
4. nowdoc(5.3以上)
单双引号的区别:
1、双引号可以解析变量;单引号不能解析变量,会原样输出;
2、双引号可以解析转义字符;单引号只能转义\\和\'本身;
3、单双引号都不能自己嵌套自己,可以互相嵌套

转义字符:
\r 回车
\n 换行
\t 制表符
\\ 斜线本身

heredoc和nowdoc
heredoc定界符可以嵌套单双引号,可以解析变量和转义字符
nowdoc可以嵌套单双引号,不能解析变量和转义字符

建议:尽量使用单引号,效率略高
2种复合类型
array 数组类型
object 对象类型
2种特殊类型
resource 资源类型
null 空
只有一个值,就是null本身
得到null的情况:
1、直接赋值为null
2、未被赋值的变量,默认值也是null
3、被unset()删除掉的变量也是null

PHP中的伪类型(看手册,var_dump()),并不是PHP的原始数据类型
mixed:代表这个参数可以是多种不同的类型
number:代表这个参数可以是int或者float
pow()
callback:还有个别名叫callable,代表这个参数必须是一个函数(回调函数)
call_user_func()、session_set_save_handler()
void:代表这个函数不接收任何参数;如果作为返回值,表示这个返回值是无用的
time( void )
var_dump()
unset()

PHP中的类型转换
强制转换
(int)/(integer) 强制转换为整型
(bool)/(boolean) 强制转换为布尔型
(float) 强制转换为浮点型
(string) 强制转换为字符串
(array) 强制转换为数组
(object) 强制转换为对象
(unset) 强制转换为null
自动转换
布尔环境
数值环境
字符串环境

三十三.数据类型的判断:
is_bool() 检测变量是否是布尔型
is_string() 检测变量是否是字符串类型
is_int() 检测变量是否是整型
is_float() 检测变量是否是浮点型
is_array() 检测变量是否是数组类型
is_object() 检测变量是否是对象类型
is_resource() 检测变量是否是资源类型
is_null() 检测变量是否是null空类型

is_scalar() 检测变量是否是标量类型(int、float、string、boolean)
is_numeric() 检测变量是否是数字或数字字符串

gettype($a) 获取变量的类型
settype($a, 'bool') 设置变量的类型(类似于强制转换)

三十四.常量
常量
汉语字典中第1条解释:长久,经久不变,常量也就是恒量
一经定义,不能删除和改变。

常量的定义:
define
define('常量名', 常量值);
const
const 常量名 = '常量值';

常量名:
和变量名一样,只能是数字、字母或下划线;
不能以数字开头 (定义的时候可以,但用不了)
严格区分大小写(define可以通过第3个参数指定是否区分大小写,true不区分)
常量值:
define定义的常量,除了object之外,都可以;(数组是PHP7新加的)
const定义的常量值,不能是资源和对象;

define和const的区别:
const可在类中使用,define不能
const不能在条件语句中定义常量
const采用一个普通的常量名称,define可以采用表达式作为名称
const只能接受静态的标量,而define可以采用任何表达式
const定义的常量时大小写敏感的,而define可通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。

提示:echo一个未定义的常量时,会报一个notice并将常量名自动转换为字符串输出;

defined(常量名)
用于检测常量是否定义

预定义常量:get_defined_constants()获取当前已经定义好的常量!
PHP_INT_MAX
PHP_INT_SIZE
PHP_VERSION
...

魔术常量:
值会随着环境的变化而改变
__LINE__ 当前行号
__FILE__ 当前文件
__DIR__ 当前文件的目录
__CLASS__
__METHOD__
__NAMESPACE__
。。。

三十五.运算符
运算符是可以通过给出的一个或多个值来产生另一个值的东西;
有3种类型的运算符
一元运算符
只能够接收1个值参与运算的叫一元运算符
1 -1 负值运算符 ++ -- !
二元运算符
2 + 2 算术运算符 + - * /
三元运算符
3 可以接收3个值的就是三元运算符
?:
表达式1 ? 表达式2 : 表达式3;

算数运算符
+ - * /
% 取余(取模)运算
39 % 3 == 0 求两个数相除的余数;39除以3余数为0

递增递减运算
++
$i++; //后递增: 先返回$i,再将$i的值加1,下次用的时候值就是加1后的
++$i; //前递增:先将$i的值加1,然后返回加过1后的$i
--
$i--; //同上
--$i;
提示:
递增/递减运算符不影响布尔值
null的递减无效,递增结果为1
字符串的递减无效;++是按照Perl的语法,比如z++ 会变成aa

字符串运算符
. 将其左右参数进行拼接运算
.= 将右边参数,附加到左边参数之后

赋值运算符
=
将右边的表达式的值,赋值给左边的变量
+=
$a += 3; //将$a加上3之后再赋值给$a,可以拆为$a = $a + 3;
-= *= /= %=

比较运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
=== 全等于
!= | <> 不等于
!== 不全等于

逻辑运算符:
逻辑与:&& and
想娶你们小红姐,你要有房,并且还要有车!
洗脸:左脸和右脸
只有两边都为true,才返回true,否则返回false
逻辑或:|| or
想娶凤姐,要么你财大,要么你器粗!
丢钱包:你找到了,或者我找到了
只要有任何一边为true,结果就为true;
注意:前面为true,后边就不再执行,俗称短路
逻辑非 !
小星星本来是纯爷们(true),去了趟泰国,被砍了一刀(false),就不纯了
就是取反的意思
$bool = true;
!$bool == false
逻辑异或 xor
男(true)男(true)不能结婚;
女(false)女(false)也不能结婚
两边不一样才返回true,否则返回false

位运算符(了解)
按位与 &
按位或 |
按位异或 ^
左移 <<
右移 >>
按位非 ~

其他运算符
?: 三元运算符
表达式1 ? 表达式2 : 表达式3;
1为真就执行2,为假就执行3;
@ 错误控制符,可以屏蔽错误
`` 执行运算符,可以执行一些操作系统的命令

//别急,讲到相应知识点的时候会补充讲解
=> 数组下标指定符号
-> 对象成员访问符
instanceof 类型运算符

三十六.流程控制
1.概述
任何PHP脚本都是由语句组成的。 此外,还可以用花括号将一组语句封装成一个语句组,语句组本身可以当作是一行语句
2.在PHP中有三种基本的程序结构:
顺序结构
分支结构
循环结构

顺序结构
在程序结构中,最基本的就是顺序结构,表示程序会自上而下的顺序执行。

流程控制之分支结构:
1. 单向分支
if (表达式为true) {
执行真区间
}

2. 双向分支
if (true) {
表达式为true执行真区间
} else {
表达式为false执行假区间
}

 

 


三十七.数组
概述
简单说,就是一组数据的集合,是PHP8大类型中的一种;
(比如标量在内存中是单个存储的,数组呢,就像一列火车或者地铁)
相关概念
下标:也叫做键(key)或者索引,相当于数据在该数组中的名称。
值:就是数据本身
数组的分类:
1.按照下标形式分
索引数组:下标全是数字
关联数组:下标全是字符串
混合数组:下标既有数字又有字符串
2.按照维度划分
一维数组
二维数组
三维数组
N维数组
...
数组的定义:
方式一:array() 语言结构
array([ [key => ]val, $...]);
$arr = array('name'=>'老杨', '18', '卡哇伊~~');
方式二:array()的替代语法[]; PHP版本需要5.4+
$arr = ['name'=>'老杨', '18', '好可爱'];
方式三:直接给数组下标赋值
$arr[键] = 值;

查看数组的方式
1.var_dump()打印变量的相关信息
但是,比较复杂的数组,无法显示完整;比如:get_defined_constants()
2.print_r(),配合pre可以完整的显示所有数据

数组定义时的细节:
1.未指定下标的值,会从0开始比较,找出当前数组中最大的数字下标加1,作为自己的下标
2.如果key是浮点数,会被舍去取整!如果是一个纯洁的数字字符串,也会被转换为相应的int值!

三十八.数组的遍历:
遍历:
一栋楼 ,3层,每层10间房,分别为101-110,201-210,301-310,每个房间里住着一个美女。有人要求你进入这栋楼去找一个叫‘刘亦菲’的美女,你将怎么找?

遍历,遍,就是寻遍,找遍。遍历原意是从头到尾,或从尾到头,每个元素查验一次,不重复查验,也绝不遗漏一个。但是实际上我们做遍历,往往是,查找到目标(刘亦菲),遍不会继续浪费时间精力、资源去查验剩下的房间。

1.for循环遍历数组
只能遍历索引数组,并且数组下标还必须是连续的

2.foreach遍历数组:
foreach ($数组 as $键 => $值) {

}
每次开始循环,会从数组的第一个元素开始,将值拿出来赋值给$v,将键拿出来赋值给$k;直到数组被遍历完毕,结束循环

3.联合使用list()、each()、while遍历数组
list():把数组中的值赋给一些变量
注意:list只能用于下标从0开始的索引数组
each():返回数组中当前的键/值对并将数组指针向前移动一步,超出数组长度返回false!

三十九.预定义变量之超全局变量:
超全局变量:超全局变量是在全部作用域中始终可用的内置变量(语言参考->预定义变量)

$_SERVER 包含了头信息、路径、脚本位置等信息的数组
$_GET 包含了通过URL的参数传过来的数据
$_POST 包含了通过POST方法传过来的数据(需要用表单发起POST请求)
$_REQUEST 默认包含了GET、POST和COOKIE的数据(COOKIE后面再讲)

GET和POST的区别:
1、get通过URL传输数据,随时可以查看和修改,安全性相对较低;而post不会显示在URL,相对安全
2、get传输的数据量大小会被URL的长度所限制(循环10万个1);而post传输的数据量是根据php.ini的配置文件(post_max_size),默认为8M!
(友情提示:要上传大文件还需要设置upload_max_filesize,默认为2M)
建议:登录、注册等涉及到密码或者文件上传等操作的时候用POST;做搜索或者传输一些简单数据的时候一般用get

$GLOBALS 包含所有全局范围的变量(包括其他的超全局变量)

$_ENV 包含服务器端环境变量的数组(不常用)
默认为空,需要修改php.ini中的:
variables_order = "GPCS"
variables_order = "EGPCS" //加个E

$_FILES、$_COOKIE和$_SESSION后面再讲

 

 


四十.系统函数
数组相关的函数:
数组的键/值操作:
1.array_values($arr)
返回数组中所有的值并给其建立数字索引
2.array_keys($arr[, '值'[, true]])
返回数组中所有的键名
给'值'表示拿出该值的键
给'true'表示值用===判断
3.in_array('值', $arr[, true])
判断数组中是否有某个值
给true表示用===判断
4.array_key_exists('键', $arr)
判断数组中是否有某个键
5.array_flip($arr)
键值交换
6.array_reverse($arr[, true])
反转数组
给true表示保留原来的数字下标
统计与唯一性:
count($arr[, 1]) 统计数组元素的个数
给1表示递归统计数组个数(不常用)
array_count_values($arr) 统计数组中值出现的次数
注意:只能统计string或者int,否则报错
array_unique($arr) 去除数组中重复的元素,保留前面的值
使用回调函数过滤数组:
array_filter($arr, callback);
会将数组中的每个值都传给回调函数,在回调函数中返回true就保留该值,返回false就不保留
数组排序函数:
1.sort() 从小到大,不保留键 (升序)
2.rsort() 从大到小,不保留键(降序)
3.asort() 从小到大,保留键 (升序)
4.arsort() 从大到小,保留键(降序)
5.ksort() 按照键,从小到大(升序)
5.krsort() 按照键,从大到小(降序)

注意:在对混合类型值排序时可能会产生不可预知的结果

拆分、合并、交差集:
1.array_slice(切谁, 开始位置[, 切几个[, 是否保留键]])
切谁:要切的数组
开始位置:从0开始数,会保留开始位置的元素
[切几个]:没给的时候,默认切到最后
[是否保留键]:默认false,不保留;true保留原来的键

2.array_splice(&切谁, 开始位置[, 切几个[, 替代品]])
切谁:要切的数组,是引用传递
开始位置:从0开始数,会保留开始位置的元素
[切几个]:没给的时候,默认切到最后
[替代品]:将替代品插入到原来的数组中,不会保留键

3.array_combine(键数组, 值数组)
用键数组的值作为键,值数组的值作为值;
要求两个数组的长度必须一致,否则报错并返回false

4.array_merge($arr1[, $arr2, $...])
合并N个数组;
注意:同名的键,后面会覆盖前面的

扩充:加号也可以合并数组;同名的键会保留前面的值

5.array_intersect($arr1, $arr2[, $...])
返回N个数组中都有的值,下标保留前面

6.array_diff($arr1, $arr2[, $...])
返回$arr1中有,其他数组里面没有的元素,下标保持不变

数组与数据结构:
array_pop() 弹出数组中最后一个元素
array_shift() 弹出数组中第一个元素
array_push() 往数组最后追加1个或多个元素
array_unshift() 往数组最前面追加1个或多个元素

数据结构:用于存放数据的容器
队列:相当于管子,先进先出(吃多了拉)
栈:相当于杯子,后进先出(吃多了吐)
随机打乱数组
range() 生成指定范围的数组
shuffle() 随机打乱数组

四十一.系统函数 指针相关
current() 返回数组当前指针的值
next() 将数组的指针移到下一个,并返回其值
prev() 将数组的指针移到上一个,并返回其值
end() 将数组的指针移到最后,并返回最后一个值
reset() 将数组的指针重置

 


四十二.系统函数 字符串相关
字符串常用输出:
echo 输出一个或多个字符串
print 输出一个字符串
echo和print是一种语言结构,不是一个函数;
用于输出字符串等简单的数据

print_r 打印变量易于理解的信息
就是查看各种类型变量的值
var_dump 打印变量的相关信息
可以看到任意类型的值和类型
printf() 格式化输出字符串
%s 表示字符串
%b 表示二进制数
%o 表示八进制数
%d 表示十进制数
%x 表示十六进制数
%c 表示是个ascii码值
%% 表示一个单纯的%
sprintf() 同上,只是将结果返回,而不是输出

笔试题之echo和print_r的区别:
1.echo是一种语言结构,不是函数,所以效率略高;
2.echo可以同时输出多个字符串,而print_r不可以
3.echo只能输出简单的数据类型,而print_r可以打印复合类型的数据,比如数组、对象等

去除和填充:
ltrim($str[, '要去除的字符列表'])
默认去除左边的空格
rtrim($str[, '要去除的字符列表'])
默认去除右边的空格
trim($str[, '要去除的字符列表'])
默认去除两边的空格
str_pad($str, 长度,填充品)
用一个字符串将另一个字符串填充为指定长度

四十三. 系统函数 字符串大小写的转换:
strtolower() 转换为小写
strtoupper() 转换为大写
ucfirst() 首字母大写
ucwords() 单词的首字母大写(空格区分单词)

四十四.和HTML标签处理相关的函数:
htmlspecialchars()
将特殊字符转换为实体
htmlentities() 同上,基本不用
老版本里面会将中文一起转了
strip_tags()
去除html标签
nl2br
将\n换行转换为<br>换行

字符串反转、长度与加密:
strrev()
将字符串颠倒显示
str_shuffle()
将字符串随机打乱
strlen()
统计字符串的长度,utf-8的中文占3个字节
md5()
将字符串进行加密,得到一个32位的加密后的字符串
number_format()
格式化一个数字
只能是1个、2个或者4个参数

字符串比较函数:cmp:compare的简写,比较的意思
strcmp()
比较两个字符串(区分大小写)
strncmp()
比较字符串开头的若干个字符(区分大小写)
strcasecmp()
比较两个字符串(不区分大小写)
strncasecmp()
比较字符串开头的若干个字符(不区分大小写)

字符串的切割与连接:
explode('切割符', $str)
使用一个字符串分割另一个字符串,返回一个数组
implode('连接符', $arr)
将一维数组用指定字符串连接,返回一个字符串
join()
implode的别名

字符串截取:
substr($str, 开始位置, 截多长);
开始位置从0开始数;为负数时表示倒着数!

字符串也有下标:
可以像数组一样通过下标取出字符串的值
但是,最好不要用来取中文

字符串的查找:
提示:用法统一都是($str, '要找的子字符串');
1.strstr($str, '要找的字符串');
返回从子字符串第一次出现的位置开始,到结尾的字符串;
还有个别名:strchr
2.strrchr 返回从子字符串最后一次出现的位置开始,到结尾的字符串
3.strpos($str, '要找的字符串')
返回子字符串第一次出现的索引位置,从0开始;
注意:1个汉字占3个字节
4.strrpos($str, '要找的字符串')
返回子字符串最后一次出现的索引位置
5.stripos()不区分大小写的strpos

字符串的替换
str_replace('找什么', '换成什么', '在哪儿换');

四十五.系统函数 数学函数
ceil() 向上取整
floor() 向下取整
round() 四舍五入

max() 最大
min() 最小
mt_rand() 随机数


四十六.分支
多向分支
if (表达式1) {
表达式1为true执行真区间,这个分支就执行完了,否则继续往后
} elseif (表达式2) {
表达式2为true执行这里,这个分支就执行完了,否则继续往后
} elseif (表达式3) {
表达式3为true执行这里,这个分支就执行完了,否则继续往后
} else {
表达式为false执行假区间
}

if分支的特点:
1. 所有的条件表达式最终都会被转换为布尔值,要么为true,要么为false
if ('123') { true }
2. 当if后面没有花括号{}包裹的时候,只会执行1条PHP语句(了解)
3. else if中间可以加上一个或多个空格隔开(了解)
4. 流程控制有一些替代写法(了解)

4. 巢状分支(就是if嵌套)

5. switch语句的多向分支
switch (表达式) {
case 值1:
语句体;
case 值2:
语句体;
...
default:
语句体;
}
switch会取出括号里的值,然后与语句体中的case所列出的值逐一比较(用==比较),如果结果为false,则将结果往下一个case传递;如果为true,则执行该case中的语句体;然后再碰到break语句即跳出switch条件判断,如果所有的值比对都不符合,则会执行default中的语句体

四十七.流程控制之循环结构:
1、while循环
while (表达式) {
循环体;
}

当‘表达式’的结果为真时,程序将反复执行‘循环体’,直到表达式的结果为假时才停止执行该段程序,循环结束

2、do...while循环
do {
循环体
} while (表达式);

程序会先执行 do 里面的循环体,然后再检查表达式是否为真;
真,就再进行 do 语句体中的语句;
假,循环立马结束,不再执行循环体;继续运行后续代码

3、for循环
for (初始化语句; 条件判断语句; 每次循环后执行的语句) {
循环体;
}
初始化语句:在整个循环开始前,无条件的执行一次,并且只有一次;
条件判断语句:在每次循环前都会判断,为true执行循环体,为false就终止循环
每次循环后执行的语句:每单次循环后都会执行这个语句

特殊的流程控制语句:
break 跳出整个循环
continue 跳出本次循环,继续下一次循环
exit 或者 die 结束脚本执行;
die;
exit;
die();
exit();
die('结束时输出的字符串');
exit('结束时输出的字符串');

流程控制的替代语法:
替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor; 以及 endswitch;。

do-while 只有一种语法,没有替代语法

四十八.函数是什么:
函数(function)是一段完成指定任务的已命名代码块。函数可以遵照给它的一组值或参数完成特定的任务,并且可能返回一个值。(比如循环输出10行10列的表格,或者N行N列的表格)

PHP中函数分为两种:
1、自定义函数
(比如循环输出10行10列的表格,或者N行N列的表格)
2、系统函数
(比如var_dump()、time()等等)

自定义函数
1.自定义函数的格式
function 函数名([参数列表])
{
函数体;
}
2.函数名的命名规则
字母、数字、下划线,不能以数字开始;不能是关键字,不能与已存在的函数重名!
函数名不区分大小写
3.函数的调用
函数名([参数列表])
注意:函数的调用不分先后!!!!
//小提示:在PHP中,只要以$符开始,就是变量;只要加()就是调用函数

函数的参数
形参
函数定义时写的参数叫形参
形参可以有默认值,默认值必须是常量表达式,不能是诸如变量、或者函数调用等
有默认值的形参应该写在形参列表的右边,不然形同虚设
实参
调用函数时传的参数叫实参
实参的传递要与形参一一对应,个数最好是一样的,不能少(形参没有默认值的时候),也不要多

函数的返回值
使用return语句可以让函数返回一个值
1、没有return语句的函数,默认返回null
2、return语句会立即终止函数的运行,函数中的后续代码不执行

四十九.检测函数是否存在
function_exists检测函数是否存在

五十.变量的作用域 ——
能够有效作用的区域
全局变量
1、在函数范围之外定义的变量叫全局变量(全局的按字面意思来说,到处都可以访问,比如函数内,C语或者Javascript言确实是的),但是,在PHP中,函数被看做一段独立的功能个体,它无法直接访问全局变量
2、在函数内想要访问全局变量
1.用关键字global将变量声明为全局的
2.通过超全局数组$GLOBALS['变量名']取下标的方式访问
这是一个特殊的变量,会在脚本运行时自动创建
局部变量
1、在函数内部定义的变量叫局部变量,该变量仅在当前函数的作用域内有效,函数调用完毕立即释放
2、在全局范围内访问局部变量
1.将局部的用global变为全局的(要在变量定义之前声明)
2.将变量当做返回值return出去
3、形参也是局部变量

静态变量
用关键字static声明静态变量
特性:静态变量只会声明一次,不会重复声明

想了解任何一个函数都需要从3个方面去分析:
功能 参数 返回值
我们写函数的时候对这3个部分也要描述清楚,怎么描述呢,注释:
参数
1、常规参数,PHP八大类型
2、伪类型参数 (语言参考-》类型-》本文档中使用的伪类型与变量)
mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。
如:var_dump()
print_r()
number 说明一个参数可以是 integer 或者 float。
如:pow() 求次方数
callable 表示该参数需要传一个函数,还有个别名callback
如:call_user_func()
session_set_save_handler()
void 作为返回类型意味着函数的返回值是无用的;作为参数列表意味着函数不接受任何参数。
如:unset() 不能有返回值
time() 不接受参数
$... 表示一个函数可以接受任意个参数
如:var_dump();

(要求:自定义一个函数,将任意个参数相加并返回结果)

可变个数的参数列表
func_get_args() //返回一个数组,包含所有参数
func_num_args() //返回参数总数
func_get_arg(int) //接收一个数字参数,返回指定参数,从0开始数

函数参数的传递
1.值传递(常用)
2.引用传递
通过引用传递的参数,函数可以修改其参数的值(语言参考-》引用的解释-》引用传递)

注意:如果形参用'&$a'引用传递,调用函数时必须传变量,不能直接传值

函数的种类:
可变函数
如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它

回调函数
被当做参数传递的函数,叫回调函数
专门用来调用回调函数的函数:
call_user_func('函数名'[, 参数1, 参数2...])

匿名函数:
没有名字的函数;
通常作为回调函数传递

递归函数:
就是自己调用自己的函数

文件的包含:
可以使用自定义函数库,并且可以更好的实现代码重用!
include
include '文件路径';
include('文件路径');
require
require '文件路径';
require('文件路径');
区别:如果包含的文件不存在,include报warning警告级别的错误,后续代码继续执行;require报一个fatal error致命错误,后续代码不执行

include_once
require_once
用法同上面的include 和require ,区别也同上

include和include_once的区别
include:包含一次就执行一次;
include_once:不管包含多少次,都只会执行一次,通常用于包含有函数、或者常量等不能重复定义的文件

 

 

五十一.正则表达式
1、什么是正则表达式?
正则表达式是一个从左到右匹配目标字符串的模式
2、作用
1.用于匹配(比如匹配邮箱、手机号)
2.用于替换(可以用新的东西把符合你条件的东西给替换了)
3.用于提取想要的内容
3、学习正则的流程
1.正则的语法
2.正则的函数

正则语法
1、分隔符
在PHP中,正则表达式其实就是一个用分隔符包裹着的特殊的字符串,比如:
$pattern = '/\d/';

常用的分隔符为'/',但是不仅限于'/';分隔符可以是任意非字母、数字、非反斜线、非空白字符,比如:#、$、%。。。
2、原子
原子是组成正则表达式的最小单位,每个正则表达式最少要包含一个原子!

原子的类型:
1.普通字符做为原子
比如:0~9 a~z A~Z...等等
2.特殊字符做为原子
比如:$ . * ? ^...等等
一般标点符号和其他在正则中有意义的符号,想做为原子都需要加转义斜线\
提示:部分标点符号不用加\也可以,但是,加了也不会出错!比如逗号,
3.非打印字符(转义字符)
\r \n \t \\ ...等等
4.通用字符类型做为原子
\d 匹配0~9之间的数字
\D 匹配除了0~9之间的数字之外的
\w 匹配数字、字母、下划线
\W 匹配除了数字、字母、下划线
\s 匹配任意个空白符
\S 匹配除了空白符之外的
5.自定义原子列表
用[]自定义原子列表
比如:'/[abc]/'表示abc任何一个都可以
1.中横线-可以表示范围:1-9|a-z
2.^可以表示除了

3、元字符:拥有特殊的含义,不再单纯的表示自己
1、字符串的边界
^ 表示匹配开始位置
$ 表示匹配结束位置
2、重复匹配:
这几个元字符表示量词,用于修饰前面一个原子的个数
? 表示0次或1次
+ 表示1次或多次
* 表示0次、1次或多次(任意次)
3、通配符:点号.
匹配除了换行符\n之外的任意一个字符
4、重复匹配之自定义量词
元字符{},用于自定义量词
{n} 表示前面的原子为n次
{n,} 表示前面的原子最少为n次,可以大于n次
{n,m} 表示前面的原子最少为n次,最多为m次
5、原子列表 []
元字符[],用于定义原子列表(详情请见:6.正则的原子.php)
6、模式选择符 | (或者叫表达式选择符)
从|隔开的正则表达式中任意选一个来用
7、模式单元 ()
元字符()可以将正则表达式变成一个单元,将表达式看成一个原子来使用

1、系统会自动将()中匹配的值存储起来,有需要时可以通过\\1、\\2、\\n或者$1、$2、$n的方式反向引用
2、不想存储()中的值,可以用?:取消存储

4、模式修正符:
对整个表达式进行修饰,如:'/abc/i'
i 表示忽略大小写
U 修改量词的贪婪模式
量词默认是贪婪的,表示的数尽可能的多
x 忽略正则表达式中的空格
s 全匹配符.将匹配任意字符,包括\n换行
m 将字符串视为多行

五十二.正则函数:
preg_match('正则', $str[, 匹配到的值[, 是否存储下标[, 从哪儿开始匹配]]])
匹配到的值:第0个,为匹配到的整体字符串;之后依次放()里面匹配到的值,默认为一维数组
是否存储下标:PREG_OFFSET_CAPTURE存储下标,会将$m变为二维数组
从哪儿开始匹配:默认为0,匹配整个字符串
返回值:返回匹配次数,0次或1次

preg_match_all('正则', $str[, 匹配到的值[, 是否存储下标[, 从哪儿开始匹配]]])
匹配到的值:第0个,为匹配到的整体字符串;之后依次放()里面匹配到的值,默认为二维数组
是否存储下标:PREG_OFFSET_CAPTURE存储下标,会将$m变为二维数组
从哪儿开始匹配:默认为0,匹配整个字符串
返回值:返回匹配次数,0次或1次

preg_replace('正则', '替换成', '在哪儿换');
执行一个正则表达式的搜索和替换

将正则匹配到的内容替换成指定内容;如果没匹配到,返回原字符串

正则切割
preg_split(‘正则’,‘要切的字符窜’,)
用正则表达式切割字符串

五十三.错误处理
错误的分类
语法错误
这种错误最常见,但也最容易搞定;一旦出现,一行代码都不执行
运行时错误
在页面上给你报出来,有的会终止代码执行,有的不会
逻辑错误
这种错误最麻烦

错误的级别
notice
提示级别,不会影响后续代码的执行
如:输出不存在的变量
warning
警告级别,也不会终止代码执行
如:include包含文件
error
错误级别,会终止代码执行
如:语法错误或者require
deprecated
反对级别,不赞成这样的使用,不会终止代码执行
如:(5.6用mysql_connect、echo mktime())
strict
语法不够严谨

处理错误:
1.用@屏蔽错误信息
有的错误屏蔽不了
2.通过配置文件php.ini控制错误的显示
phpinfo();能看到很多信息,找出php.ini的路径
display_errors
display_errors = off //不显示任何错误
注意:关闭错误显示后,如果页面中有error级别的错误,服务器会直接返回500错误
error_reporting
error_reporting = E_ALL //显示所有错误
问:如何设置只显示除了NOTICE之外的错误
答:方法一:error_reporting(E_ALL & ~E_NOTICE)


3.通过ini_set函数设置
ini_set('配置项', '配置值')
(不是所有的选项都可以用这个函数设置,具体哪些可以设置请参考手册:附录-》php.ini配置-》php.ini配置选项列表)
4.通过error_reporting函数设置错误级别
error_reporting(0); //屏蔽所有错误

自定义错误处理:
可以通过set_error_handler函数自己接管错误处理。
注意:致命错误无法被自定义(手册中搜索set_error_handler)

记录错误日志
1、以文件的方式记录(默认)
log_errors = On 开启错误日志的记录
error_log = C:/sb.txt 指定错误的路径
2、记录到操作系统日志中
error_log = syslog 指定错误的路径
我的电脑-》管理-》事件查看器-》windows日志-》应用程序

函数error_log('日志信息'),手动写日志


五十四.PHP的时间和日期
获取Unix时间戳
time() 获取当前时间戳
因为Unix操作系统的诞生,1970年为Unix元年
mktime() 获取一个指定日期的时间戳
mktime(时,分,秒,月,日,年)
没有给的参数默认为当前的!
strtotime()将英文的时间日期描述转换为时间戳

修改PHP默认时区:
1、改php.ini配置文件:
date.timezone = "PRC" //默认为UTC
//PRC 中华人民共和国的简写
//People's Republic of China

date.timezone = "Asia/shanghai"//上海
中原(Asia/Shanghai) 上海
陇蜀(Asia/Chongqing) 重庆
长白(Asia/Harbin) 哈尔滨
新藏(Asia/Urumqi) 乌鲁木齐(慢两小时)
昆仑(Asia/Kashgar) 喀什(慢两小时)
参考:五大时区的划分:http://www.niubb.net/a/2015/11-15/961925.html
date.timezone = "Asia/hong_kong"//香港
2、通过ini_set函数来临时设置
ini_set('date.timezone', 'PRC');
3、通过专门的函数来设置或者获取
date_default_timezone_set('PRC');

//获取当前的时区设置
date_default_timezone_get();

格式化输出:
date(格式字串[, 时间戳])
格式字串中不能被识别的字符将原样显示

echo date('Y'); //4位完完整年份
echo date('m'); //月份
echo date('d'); //日
echo date('H'); //时
echo date('i'); //分
echo date('s'); //秒

y 两位数的年份
n 没有前导0的月份
j 没有前导0的日
G 没有前导0的小时

获取微秒数: microtime([true])
给了参数true返回一个浮点数


五十五.文件系统: (函数参考-》文件系统相关扩展-》Filesystem)
当程序运行时的数据是存放在内存中的,比如变量、常量等;想要长期保存程序运行完毕所产生的数据,我们可以利用文件的方式存储到硬盘上!

文件类型:
可以通过filetype()获取一个文件的类型
windows最常见的只有dir和file

判断文件类型
is_dir(路径) //判断是否是目录
is_file(路径) //判断是否是文件

//了解
is_readable(路径) //是否可读
is_writable(路径) //是否可写
is_executable(路径) //是否可执行

文件的属性:(什么叫属性?比如大小、创建时间。。。)
检测文件或目录是否存在
file_exists(路径);
获取文件大小
filesize(文件路径); //单位为字节
获取相关时间
filectime(文件路径); //创建时间 create
filemtime(文件路径); //修改时间 modify
fileatime(文件路径); //访问时间 active

目录相关
常见路径格式:
windows
C:/www/index.php
C:\www\index.php
Linux
/var/www/index.php
相对路径
./index.php
../1.jpg
路径相关的函数
basename()取出路径中的文件名部分
dirname()去除路径中的文件名部分
pathinfo()获取路径中的所有信息
realpath() 获取规范的绝对路径(文件必须存在,否则返回false)

遍历目录
opendir(目录路径) 打开一个目录
readdir(资源) 读取一个目录资源,并将指针往前移,返回文件或目录名
closedir(资源) 关闭一个目录

扩充:iconv(原字符集, 目标字符集, 字符串)字符集转换

创建和删除目录
mkdir('目录'[, 权限, true]) 创建目录
在Windows中权限被忽略,Linux中0777表示最高权限
第3个true,表示递归创建目录
注意:创建的目录已存在会报错

rmdir('目录路径') 删除目录,只能删除空目录

unlink('文件路径') 删除文件
文件路径:
相对路径:./a/b/c/1.txt
绝对路径:C:\wamp\www\php15\a\b\c\1.txt
注意:http的绝对路径无法删除

文件的基本操作
touch('文件名'); 设定文件的修改时间
如果文件不存在,则会被创建。
copy(原文件名,新文件名);
只能复制一个文件,不能复制目录
rename(旧名,新名 );
重命名一个文件,其实相当于剪切

五十六.文件操作:
打开文件+
fopen('文件路径', 打开方式);
打开方式:
'r' 只读方式打开,将文件指针指向文件头。
'r+' 读写方式打开,将文件指针指向文件头。
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。

w或w+/a或a+,如果不存在会自动创建
r或r+,不会自动创建文件
写文件
fwrite(资源, '写的内容');
写的位置由打开方式决定
读文件
fread(资源, 读的长度);
读的长度必须大于0
关闭文件
fclose(资源);
指针重置:
rewind($?) 将文件指针重置到文件开头,方便读取内容
简单的文件读写:(常用)
file_get_contents(文件路径)
读取文件内容,返回文件内容的字符串
file_put_contents(文件路径,写的内容[, FILE_APPEND])
文件不存在就创建;默认为覆盖内容,可以用第3个参数设置为追加

文件上传和下载
上传用到头像、相册、网盘、资料、种子、资源等
下载资料、种子、资源、图片等

文件的上传
就是将文件从客户端上传到服务端
实现步骤:
1、表单的设置
1.要做文件上传,method必须使用post
2.必须在form标签里面加:enctype="multipart/form-data"
enctype:用于指定在发送数据到服务器之前如何对表单数据进行编码
multipart/form-data:表示不对数据进行编码,以文件流(二进制)的形式上传到服务器。
application/x-www-form-urlencoded:默认选项,默认对所有字符进行编码
3.<input type="hidden" name="MAX_FILE_SIZE" value="2000">

2、服务器端的设置
1. file_uploads = On 是否允许文件上传
2. upload_max_filesize = 2M 上传文件最大允许范围
3. post_max_size = 8M POST表单上传数据的最大允许范围
4. upload_tmp_dir ="c:/wamp/tmp" 上传文件的临时目录
注意:
post_max_size的值一定要大于upload_max_filesize的值

3、PHP代码处理文件的上传
1. 上传后的数据用$_FILES接收。
2. $_FILES中每个元素的意思
name 上传的文件名
type 文件类型
tmp_name 临时文件路径
文件上传的原理:就是在脚本执行完毕之前将文件从这个临时路径里面弄出来,因为这货会在脚本执行完毕后自动删除
error 错误号
其值为 0,没有错误发生,文件上传成功。
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
其值为 3,文件只有部分被上传。
其值为 4,没有文件被上传。
其值为 6,找不到临时文件夹。
其值为 7,文件写入失败。(比如你的临时目录没有写的权限)
size 文件大小,单位为字节

执行文件上传:
move_uploaded_file(临时文件名, 新文件名);
本函数检查文件是否是合法的上传文件

完整的文件上传步骤
1、判断错误号
2、判断文件的mime类型
3、判断文件的大小
4、生成随机的文件名
5、获取文件的后缀名
6、判断并执行文件上传
is_uploaded_file()

五十七.文件下载步骤:
将文件从服务器下载到客户端
注意:如果浏览器能够识别该文件的mime类型,会直接解析;如果不能识别,则提供下载

所以,我要手动告诉浏览器,这是一个附件,你不要给我解析出来

步骤:
1.告诉它是一个附件
header('Content-disposition:attachment')
2.下载的文件没内容
在php输出的内容会被下载
用readfile()读取并输出
3.结合第1步,给文件取个名字
header('Content-disposition:attachment;filename=xxoo.jpg')
4.告诉它文件的大小
header('Content-length:'.filesize('文件路径'));
5.告诉它文件的类型
header('Content-type:image/jpeg');

五十八.数据库
数据库
数据库是计算机应用系统中的一种专门管理数据资源的系统。数据库就是一组经过计算机整理后的数据,存储在一个或者多个文件中,而管理这个数据库的软件就称为数据库管理系统。常见的软件开发中应用数据库有IBM的DB2,Oracle,SQL Server,PostgreSQL,MySQL,Access等。


DBS 数据库系统
DB 数据库
Database
DBMS 数据库管理系统
Database Management System
DBA 数据库管理员
Database Administrator

SQL结构化查询语言
SQL是一种专门用于查询和修改数据库里的数据,以及对数据库进行管理和维护的标准化语言

数据定义语言(DDL):用于定义和管理数据对象,包括数据库,数据表等。例如:CREATE,DROP,ALTER等。
数据操作语言(DML):用于操作数据库对象中所包含的数据。例如:INSERT,UPDATE,DELETE语句。
数据查询语言(DQL):用于查询数据库对象中所包含的数据,能够进行单表查询,连接查询,嵌套查询,以及集合查询等各种复杂程度不同的数据库查询,并将数据返回客户机中显示。例如:SELETE
数据控制语言(DCL):是用来管理数据库的语言,包括管理权限及数据更改。例如:GRANT,REVOKE,COMMIT,ROLLBACK等。

关系型数据库
以行和列的形式存储数据,这一系列的行和列被称为表,一堆表组成了数据库,一堆库组成了咱们的数据库服务器

mysql的连接
mysql -u用户名 -p密码 -h服务器地址
注意:
1.每个SQL命令都需要使用分号来完成
2.可以将一行命令拆成多行
3.可以通过\c、ctrl+c来取消本行命令
4.可以通过\q、exit或者quit来退出当前客户端

常见操作
显示帮助信息:\h(同help命令)
将查询后的数据立起来:\G
取消当前未完成的操作:\c
退出当前客户端:\q
显示当前服务器状态:\s
更改执行符:\d

数据库的基本操作
-- 查看所有的数据库
show databases;
-- 选择数据库
use 库名;
-- 创建数据库;库名已存在报错
create database 库名;
create database if not exists 库名;
create database 库名 default charset=utf8; --指定默认字符集
-- 删除数据库;库名不存在报错
drop database 库名;
drop database if exists 库名;

表的基本操作
-- 查看所有数据表
show tables;
-- 创建数据表;
create table 表名(
字段1 类型,
字段2 类型,
字段2 类型
)engine=myisam default charset=utf8;
注意:字符集为utf8,少个-
-- 查看表结构
desc 表名;

-- 删除数据表
drop table 表名;

数据相关操作
-- 插入数据
insert into 表名 (字段1,字段2...) values(值1,值2...);
-- 查看数据
select `字段1`,`字段2` from 表名;
select * from 表名;
-- 修改数据
update 表名 set 字段1='值1',字段2='值2'... where 条件;
-- 删除数据
delete from 表名 where 条件;

注意:
1.字段名的反引号``可以省略,关键字除外;
2.所有的字符串值都需要加引号'';
3.所有修改和删除不加where条件都是耍流氓!

导出备份
-- 在cmd下操作:
-- 导出指定数据库的结构和数据
mysqldump -uroot -p 库名 > 导出的路径
如:mysqldump -uroot -p gz24 > C:/gz24.sql;
-- 导出指定数据库里面某张数据表的结构和数据
mysqldump -uroot -p 库名 表名 > 导出路径

-- 小技巧:库名前面加-d表示只导出结构,不导出数据
如:mysqldump -uroot -p -d gz24 > C:/gz24.sql;

还原
-- 导入1:在cmd操作
mysql -uroot -p 库名 < 要导入的文件路径
-- 导入2:在进入mysql并use了数据库的情况
source 文件路径

权限相关
-- 修改密码1:在cmd通过mysqladmin操作.密码太简单可能会有警告warning
mysqladmin -uroot -p password 123

-- 修改密码2:进入mysql的情况
set password for root@localhost=password('123');

-- 修改密码3:修改mysql库中user表,改完记得刷新服务器
update user set authentication_string=password('123') where user='root';
-- 刷新服务器
flush privileges;

-- 给一个用户授权,用户不存在就自动创建
grant 权限 on 库名.表名 to 用户名@主机名 identified by '密码';
-- 例子:
grant all privileges on *.* to hehe@localhost identified by '123';
grant select,insert,update,delete on *.* to hehe@localhost identified by '123';

 

建表相关
1、定义数据表时,会指定数据的类型,整型、浮点型、字符串、日期、枚举、集合类型
根据你里面存什么东西来选择用什么类型。

整型
tinyint
取值范围
有符号:-128 ~ 127
无符号:0 ~ 255 unsigned
占1个字节
可以用于存年龄、标记,比如商品的状态:1新添加,2表示在售中,3已下架;订单状态、性别
smallint 占2个字节
mediumint 占3个字节
int 占4个字节
取值范围
有符号:正负二十多个亿
无符号:0~40多个亿
用于计数、时间戳
bigint 占8个字节

注意:
1.存入小数会四舍五入
2.超出取值范围报错
非严格模式下,取最大值存入
3.int(5)表示的只是显示宽度,并不是限定只能插入5位数,它具体的取值范围,由类型所决定

浮点 float 6,2 9999.99
定点数和浮点数都可以使用类型名后面加(M,D)方式来表示。(M,D)表示该类型一共显示出M位数字(整数位+小数位),D为小数点后面几位
float(浮点型)
double(双精度)
可以表示的范围更广,精度更高
decimal(定点数)
默认为(10,0)
比float更精确

注意:
1.当小数超出规定长度,采用四舍五入保存
2.超出整数范围,报错,无法插入

2、decimal和double的不同点
定点数如果不写精度和标度会按照decimal(10,0)来进行操作。如果超出了精度和标度,
也会进行四舍五入。定点数的存储使用二进制进行存储所以比较准确。

注意:
1、浮点数会存在误差。
2、对于精度比较敏感的数据应该用定点数来进行表示。

字符串
char和varchar很类似,都可以用来存储MySQL中较短的字符串,区别:+
1、char列的长度为固定长度,创建表的时候声明的最大长度,可以为0~255
2、varchar值可变长度,长度为0~65535之间的值。
3、char和varchar在超出指定的长度时都会被截取到指定的字符串(非严格模式下)。

4、text和blob,二者之间的区别是blob用来保存二进制数据,text只能保存字符串数据。
5、blob和text在经过大量的删除操作之后有可能会引起性能问题。(删除以后在数据表中留下“空洞”)
可以使用 optimize table 表名 来回收这些空间。

时间戳 int

枚举类型:enum
mysql> create table tt3(
-> test enum('a','b')
-> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into tt3(test) values('a');

注意:
1、枚举方式的取值范围需要在创建表的时候显式的指定。
2、对于1~255个成员的枚举需要占用1个字节存储对于256~65535个成员使用2个字节存储。最多存储65535个成员。
3、如果超过了枚举里面指定的值,将会插入一个‘空’,枚举类型只能从集合中选取单个的值。而不能一次选去多个值。
4、enum的值不区分大小写


集合类型
mysql> create table t3(
-> col set('a','b','c','d')+
-> );

注意:
1、set类型可以在里面保存0~64个成员,根据成员的不同所占空间的大小也不同
1~8 1
9~16 2
17~24 3
25~32 4
33~64 8

2、set和enum除了存储之外,主要区别在于set类型可以一次选取多个成员,enum只能选取一个。
mysql> insert into t3(col) values ('a,b,c');

注意:
1、重复的成员只保留一个。
2、超出范围的成员将会忽略。
3、插入值的时候应该都带引号。

总结:
int 4个字节 正负20多个亿或者0~40多个亿
tinyint 1个字节 正负127左右 或者 0~255

decimal(10,2) 最多10位,其中有两位小数:99999999.99

char(32) 定长
varchar(255) 不定长 length + 1

约束条件:对字段进行一些约束用的
1、null、not null,插入值时没有在字段中插入一个值,默认为null。
指定not null必须在插入值时在该字段中插入一个值。如果不给插入一个值那么为”空“

2、default 默认值在不插入该字段时默认插入的值。

整型的约束条件:
1、zerofill表示0填充。一般和整型后面设定的宽度一起使用,如果数值长度小于指定的长度那么将会在前面补充相对应的0进行填充。
2、unsigned(无符号)如果要在字段里面保存非负数,或者较大上限的值时可使用该约束条件,将从0开始,需要在字段类型后面紧跟着定义unsigned
mysql> create table t9(
-> id int unsigned not null,
-> name char(32)
-> );

3、auto_increment,自增,在产生一个唯一的标识或顺序值的时候,可以利用这个约束条件。这个约束条件只能用于整数类型,值一般从1开始。
每行加1,插入一个null到一个auto_increment列时,MySQL将插入一个比出现过的最大值+1的值。一个表中只能有一个auto_increment列,并且必须定义为primary key或unique才能够使用
mysql> create table t1(
-> id int unsigned auto_increment primary key,
-> name char(32)
-> );

索引
索引是数据库中用来提高搜索性能的。我们通常在做数据库优化的时候通常先做索引的优化,数据量少的时候没效果,数据越多效果越明显。索引加上之后是自动创建的,不是我们刻意去使用的。

索引的分类:
1、常规索引(index),最基本的索引,没有任何限制
创建索引:
create table 表名(
字段.....,
index 索引名 (要索引的字段)
);

mysql> create table t2(
-> id int unsigned,
-> name char(32)
-> ,index id(id)
-> );

表已经创建的情况下:
create index 索引名 on 表名(要加索引的字段);
mysql> create index id on t3(id);

删除索引:
drop index 索引名 on 表名

2、唯一索引(unique)与普通索引相似,但是索引列里面的值必须是唯一的,允许有空值

创建索引:
create table 表名(
字段....,
unique 索引名(要索引的字段)
);

mysql> create table t4(
-> id int unsigned,
-> name char(32),
-> unique id(id)
-> );

表已经创建的情况下:
create unique index 索引名 on 表名(要索引的字段)
mysql> create unique index id on t5(id);

删除索引:
drop index 索引名 on 表名


3、主键索引(primary key),和唯一索引类似,也是唯一的,一个表只能有一个主键
创建索引:
create table 表名(
id int unsigned auto_increment primary key,
name char(32)
);

删除索引:
alter table 表名 drop primary key
mysql> alter table t7 drop primary key;

注意:如果主键的字段上面有自增(auto_increment)那么需要先将auto_increment去掉。然后再删除。

alter table 表名 change 自增的列 自增的列 类型

mysql> alter table t6 change idaaaaa id int primary key;


-- 存储引擎
mysql中常用的存储引擎就两种:myisam和innodb
基本的差别:
1.myisam不支持事物处理、外键等高级特性,而innodb支持
2.myisam强调的是性能,其执行速度比innodb略快
3.myisam是表锁,innodb是行锁

-- 字符集的设置
mysql的字符集分为4个级别:
服务器级别
库级别
表级别
字段级别

库级别
1.查看数据库的字符集
show create database 库名;
2.建库的时候指定字符集
create database 库名字 default charset=utf8;
3.修改库的字符集
alter database 库名字 default charset=utf8;

表级别:
1.查看表的字符集
show create table 表名字;
2.建表的时候指定字符集
参考之前的
3.修改表的字符集
alter table 表名字 default charset=utf8;

注意:没有指定字符集的时候,默认是向上继承


-- 表的修改
1.修改表的名字
alter table 旧表名 rename 新表名
-- 2.改字段的类型
alter table s1 modify name char(30) not null;
-- 3.改字段名
alter table s1 change username name varchar(30) default 'no';
-- 4.添加新字段
alter table s1 add sex enum('m', 'w', 'y') not null default 'm';
alter table s1 add des varchar(255) first;
alter table s1 add des2 varchar(255) after id;
-- 5.删除字段
alter table s1 drop des2;
-- *6.修改表的存储引擎
alter table 表名字 engine=myisam;
-- *7.修改表的字符集
alter table 表名字 charset=utf8;
alter table 表名字 default charset=utf8;


-- 数据操作语言(DML)
1.insert 增
1.可以插入单条语句
insert into 表名 value();
2.插入多条语句
insert into 表名 values(),()...;
3.指定字段
insert into 表名(字段1,字段2...) values(),();
注意:没有指定字段的情况下,必须将所有的字段都一一赋值
2.update 改
update 表名 set 字段1=值1,字段2=值2... where 条件;
3.delete 删
delete from 表名 where 条件;

-- 数据查询语言(DQL)
select语句
1.查询所有
select * from 表名;
2.查询指定字段
select 字段1,字段2... from 表名;
3.给字段指定别名
select 字段1 as 别名,字段2 from 表名;
-- as可以省略
select 字段1 别名,字段2 from 表名;
5.在select中使用表达式
运算符:+ - * / %
函数:
md5() md5加密
password() mysql的加密
unix_timestamp() Unix时间戳(和php中time()返回的一样)
concat() 将两个字段连接查询
6.where条件
and 和 or
is null 和 is not null
between 和 not between
select * from exam_type where id between 3 and 10;
like 和 not like
_ 表示任意的单个字符
% 表示任意个字符
select * from exam_user where username not like '%强';
in 和 not in
select * from exam_user where id not in(1,2,2,3,4,3,432,423,4,234,32);

排序
order by 字段[ asc];(默认升序)
order by 字段 desc;(倒序)
限定条数
limit 5; 只查5条
limit 5,5;跳过5条,取5条
分页公式: (当前页-1) * 每页显示条数
五十九.误删除root用户或者忘记mysql密码

在误删root用户或者忘掉root密码的时候咋办?别急,哥来告诉你,按照以下步骤就能搞定:(前提得是自己的mysql服务器)

1.在my.ini中的[mysqld]模块下添加 skip-grant-tables并重启,表示跳过权限表的加载
//扩充,这一步还有另一个方法:
停止mysql服务后,在cmd用mysqld命令开启安全服务,之后也可以直接进行下面的步骤:
mysqld --skip-grant-tables
关键是操作完毕后要记得关闭安全服务,不然mysql服务无法启动:
mysqladmin shutdown

2.重启后登录数据库:mysql

3.找到mysql库的user表,添加数据:
insert into user(user,ssl_cipher,x509_issuer,x509_subject) values('roots','','','');
添加完成后,对该root用户更新权限,更新权限命令如下:
update user set Host='localhost',select_priv='y', insert_priv='y',update_priv='y', Alter_priv='y',delete_priv='y',create_priv='y',drop_priv='y',reload_priv='y',shutdown_priv='y',Process_priv='y',file_priv='y',grant_priv='y',References_priv='y',index_priv='y',create_user_priv='y',show_db_priv='y',super_priv='y',create_tmp_table_priv='y',Lock_tables_priv='y',execute_priv='y',repl_slave_priv='y',repl_client_priv='y',create_view_priv='y',show_view_priv='y',create_routine_priv='y',alter_routine_priv='y',create_user_priv='y' where user='root';

4.执行完成后,更新权限并退出数据库。
flush privileges;
exit;

5.注释掉skip-grant-tables参数,重启数据库,就可以使用root登录了,默认没有设置密码!

 

五十九 .POD

面向对象编程 —— OOP(Object-Oriented Programming)
面向对象的三大特征
封装、继承、多态
对象
万事万物皆对象
客观存在的任何一个实体

对相同或相似对象的一种抽象描述
类与对象
通常先有类,通过类实例化出对象;大多数情况下使用的是对象

类的定义格式
class 类名
{
[成员属性] —— 相当于变量
可以有默认值
不能是变量
可以是常量
可以有运算 5.6+
值可以是任意类型

[成员方法] —— 相当于函数
和以往的函数一致
可以直接访问自己的成员属性($this)
}

类的实例化
new
$对象名 = new 类名;
$对象名 = new 类名();

每次new都会得到一个新对象
都会触发构造方法

对象成员访问符 ->
$对象名->属性名; //加了$,含义不一样
$对象名->方法名();

伪变量 $this
类型是一个对象,表示的是自己
不能在类外使用

魔术方法
构造方法
__construct()
在使用new关键字得到新对象的时候
析构方法
__destruct()
在销毁对象的时候。脚本执行完毕,会自动销毁对象

对象的比较
=
取别名,不会产生新对象
==
判断是否是同一个类的实例,并且属性和值是否相同
===
判断两个对象是否是同一个对象

PDO的基本使用

封装
三个关键字
public、protected、private
三个范围
自己、家族、外部
3P表
自己 家族 外部
public Y Y Y
protected Y Y N
private Y N N

魔术方法
__construct构造方法(可能会看到和类名同名的方法)
触发时机:使用new关键字得到新对象的时候
参数:可有可无
__destruct析构方法
触发时机:销毁对象的时候
参数:不能有

__set
触发时机:在给一个没有权限访问或者不存在的属性赋值的时候
参数:2个(要赋值的属性名,值)
__get
触发时机:在获取一个没有权限访问或者不存在的属性的时候
参数:1个(要获取的属性名)

__isset
触发时机:在使用isset函数检测一个没有权限访问或不存在的属性的时候
参数:1个(要检测的属性名)
__unset
触发时机:在使用unset函数删除一个没有权限访问或不存在的属性的时候
参数:1个(要删除的属性名)

__call
调用没有权限访问或者不存在方法的时候
__callStatic
调用没有权限访问或者不存在静态方法的时候

__toString
将对象当做字符串输出的时候
__invoke
将对象当做函数调用的时候

__sleep
使用serialize串行化对象的时候
__wakeup
使用unserialize反串行化的时候

__clone
使用clone关键字克隆对象的时候

__autoload
在使用不存在的类的时候
唯一一个写在类外的方法

extends
用于继承
父类
被其他类继承的类,也叫基类
子类
继承其他类的类,也叫派生类

继承本身的特性
PHP只支持单继承 只能有一个爹
PHP可以被多个继承 一个爹可以有多个儿子
PHP支持多层继承 可以有祖孙关系
属性的继承
子类会覆盖父类的同名属性,私有除外
权限只能扩大,不能缩小
父类 子类
public public
protected public protected
private public protected private
访问的一定是覆盖后的结果,私有的无法覆盖
方法的继承
子类会覆盖父类的同名方法,私有除外
权限只能扩大,不能缩小
父类 子类
public public
protected public protected
private public protected private
访问的一定是覆盖后的结果,私有的无法覆盖

建议:重写父类的方法的时候,参数结构(个数,是否有默认值)保持一致;
可以通过parent关键字调用父类的方法
要求:重写构造方法的时候,务必先调用一次父类的构造方法,保证基类正常运行
parent::__construct();
父类名::__construct();

关键字
final
可以修饰类和方法
被修饰的类不能被继承,方法不能被重写
static
可以修饰方法和属性,不能修饰类
静态方法里面不能出现$this
静态方法里面只能访问静态的成员属性
self::$属性名
类名::$属性名
const
在类里面定义常量
self::常量名
类名::常量名
instanceof(运算符)
检测该对象是否是该类的实例

抽象类:制定规范
包含抽象方法的类就是抽象类
必须用abstract来修饰

抽象类是一个半成品,不能直接实例化
必须继承并且子类要实现所有的抽象方法
可以有自己的普通方法

抽象方法
没有方法体的方法
必须用abstract来修饰
必须以分号结尾
不能是private和static

接口:制定规范
定义格式
interface 接口名{
[常量]
[抽象方法]
}

特性
接口里面所有都是抽象方法,不需要用abstract修饰
接口与类之间是实现(implements)关系,可以多实现(用逗号隔开)
接口与接口之间是继承关系
类在继承其他类的同时还可以实现接口(多实现)

和抽象类的区别
如果只是单纯的定义规范,两种都可以
如果定义规范的同时还要共享一些方法,就必须是抽象类

多态:不同的对象做相同的事情得到不同的结果

和类相关的函数
1. class_alias('旧类名', '新类名');
给类名取个别名

2. method_exists(对象或者类名, '方法名');
检测对象或者类(不受封装限制)中的方法是否存在
3. property_exists(对象或者类名, '属性名')
检测对象或者类中的属性是否存在,父类的私有属性无法检测
4. class_exists('类名')
检测类是否存在

5.get_object_vars(对象)
获取对象中有权限访问的成员属性,返回一个数组
6.get_class_methods(类名或者对象)
获取类或者对象中有权限访问的方法,返回一个数组

7.get_parent_class('子类名');
获取父类类名

try-catch和异常类
$e = new Exception('胖子固有一死,或重于泰山,或重于其他山');
try {
echo 123;
throw $e;
echo 321; //无法执行到
} catch (Exception $e) {
echo $e->getMessage();
}

转载于:https://www.cnblogs.com/herocan/p/8573209.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值