php学习笔记

    xiaoxiao2022-07-07  209

    2019/3/13首次接触失败    2019/4/13重新启程   2019/05/04 基础知识整理

     

    目录

    初识PHP

    配置问题:

    PHP 是一门弱类型语言

    PHP语法:

    时间戳: time()

    格式化日期: date()

    常量:可用define函数定义

    require、include载入文件

    表单

    $_POST:

    form表单:

    input

    checkbox:

    select:

    表单处理三部曲:

    $_FILES();

    $_SERVER

    HTTP

    json_decode:

    foreach:

    HTML autocomplete

    in_array

    explode

    move_uploaded_file

    file_get_contents

    file_put_contents

    php中页面传递参数:

    MYSQL

    mysqli_connect()

    mysql_query

    mysql_fetch_assoc()

    mysql_affected_rows

    pathinfo

    Cookie:


    服务器(提供服务)指的就是一台安装特定的软件的公共计算机,专门用于提供特定的服务。 按照服务类型的不同,又划分为:Web 服务器、数据库服务器、文件服务器等等。

    客户端(使用服务)指的是在一次服务过程中使用这个服务的设备(网络端点)。目前最常见的客户端就是浏览器。

    端口:80   服务:Http   说明:用于网页浏览。木马Executor开放此端口。

    端口:443  服务:Https    说明:网页浏览端口,能提供加密和通过安全端口传输的另一种HTTP。

    eg:-----https://zce.me:80/schools/students?id=18&name=zce#photo

    https-->协议

    ://zce.me:80--->host

    ://zce.me--->域名

    80--->端口

    /schools/students?--->请求路径

    id=18&name=zce--->请求参数

    #photo:锚点值

     

    配置问题:

    Options Indexes FollowSymLinks MultiViews ExecCGI

    去掉indexex则禁止用户访问目录

     

    C:\Users\DELL>F:

    F:\>cd/

    F:\>cd F:\Apache\AppServ\Apache2.2\bin

    F:\Apache\AppServ\Apache2.2\bin>

    F:\Apache\AppServ\Apache2.2\bin>httpd -t ok

     

    虚拟主机:

    把一个网站拆分成多个网站的手段。

    由于多个虚拟主机一同工作,每一个虚拟主机必须配置ServerName(访问的域名)。

    虚拟主机是Apache上面的一个功能。

    如果配置虚拟主机过后,默认绑定的IP和localhost都会直接请求第一台虚拟主机

     

    *80:绑定在当前电脑上的任意IP的 80端口

    添加代码段:

    <VirtualHost *:80>

    ServerAdmin webmaster@dummy-host2.x //网站出问题联系站长邮箱

    DocumentRoot "F:/Apache/AppServ/www"

    ServerName dummy-host2.x //域名

    ErrorLog "logs/dummy-host2.x-error.log" //错误的访问日志

    CustomLog "logs/dummy-host2.x-access.log" common

    <Directory "F:/Apache/AppServ/www">

    Options Indexes FollowSymLinks

    AllowOverride None

    Require all granted

    </Directory>

    </VirtualHost>

     

    注意:

    同时使用多个虚拟主机存在问题

    如果使用了虚拟主机,则默认必须全部使用虚拟主机,即之前的默认网站也必须通过虚拟主机方式配 置,否则访问不到

    <Directory "F:/Apache/AppServ/www">

    Options Indexes FollowSymLinks

    AllowOverride None

    Require all granted

    </Directory>

     

    如果设备没有连接任何网络,我们有一个本地回环地址127.0.0.1,本地回环地址不会随着网络的变化而变化

     

    c:/windows/system32/drivers/etc/host

    DNS先找浏览器缓存,再找HOST文件。若都没找到,则出去找DNS服务器

     

    chrome://net-internals/#dns 缓存

    Ctrl+Shift+P 打开命令行,node screenshot可截图

     

    页面静态动态区别:文件是否经过加工

     

    请求响应流程 :

    1. 用户打开浏览器

    2. 地址栏输入我们需要访问的网站网址(URL)

    3. 浏览器通过 DNS 服务器获取即将访问的网站 IP 地址

    4. 浏览器发起一个对这个 IP 的请求

    5. 服务端接收到这个请求,进行相应的处理

    6. 服务端将处理完的结果返回给客户端浏览器

    7. 浏览器将服务端返回的结果呈现到界面上

     

     

    php处理模块:

    这个模块不是根据后缀判断是否该PHP工作,而是根据mine.types是不是application/x‐httpd‐php判断是否应该让PHP上场

    text/html text/css application/javascript

    LoadModule php7_module C:/Develop/php/php7apache2_4.dll

     

    Apache是根据文件扩展名找到对应文件的类型,然后挨个问每一个模块是否能处理这个类型的文件。若不能,则Apache自己处理(按照静态文件的方式处理)

     

    PHP 是一门弱类型语言

    不必向 PHP 声明该变量的数据类型。PHP 会根据变量的值,自动把变量转换为正确的数据类型。

    而在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。

     

     

    输出的几种方式:

    1.echo:可多参数

      注意:echo 后面紧跟着一个空格

    2.print:只能有一个参数

    3.var_dump():用于输出数据及数据类型(调试代码)

    4.print_r:

    打印关于变量的易于理解的信息,如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。

    记住,print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。

    var_dump 和 print_r 的区别:var_dump 返回表达式的类型与值而 print_r 仅返回结果,相比调试代码使用 var_dump 更便于阅读。

     

    ` `反引号可变量解析

     

    省略结束标记 :

    如果这个PHP文件只是写PHP,不会产生混编情况,这时删除结束标记会避免额外产生空格(换行会占用字节)。

     

    与HTML混编:

    <?php if ($age >= 18) { ?>

      <p>成年人</p>

    <?php } else { ?>

      <p>小朋友</p> <?php } ?>

     

    常见用法:

    <?php if ($age > 18): ?>

      <p>成年人</p>

    <?php else: ?>

      <p>小朋友</p>

    <?php endif ?>

     

    PHP语法:

    1.变量:

    PHP 中申明一个变量是用一个美元符号+变量名来表示。变量名同样是区分大小写的。

    PHP 中变量无需声明类型,变量的类型根据值的类型来推断。

    2.数据类型:

    string(字符串)

    integer(整型)—— 只能存整数

    float(浮点型)—— 可以存带小数位的数字

    boolean(布尔型)

    array(数组)

    object(对象)

    NULL(空)

    Resource(资源类型)

    Callback / Callable(回调或者叫可调用类型)

     

    对比:javascript数据类型:

    值类型(基本类型):

    字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)Symbol。

    引用数据类型:

    对象(Object)、数组(Array)、函数(Function)。

    注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。

     

    3.字符串:

    并置运算符:

    在 PHP 中,只有一个字符串运算符。并置运算符 (.) 用于把两个字符串值连接起来。

    echo $txt1 . " " . $txt2;

     

    双引号字符串:

    支持转义符号 支持变量解析

    单引号字符串 不支持转义符号

     

    strlen() 函数:

    strlen() 函数返回字符串的长度(字符数)。

    strpos() 函数:

    strpos() 函数用于在字符串内查找一个字符或一段指定的文本。如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。

    ( 同js中的indexOf:indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回 -1。)

     

    4.数组:

    数值数组 - 带有数字 ID 键的数组:

    两种创建数值数组的方法:

    自动分配 ID 键(ID 键总是从 0 开始):

    $cars=array("Volvo","BMW","Toyota");

    人工分配 ID 键:

    $cars[0]="Volvo";

    $cars[1]="BMW";

    $cars[2]="Toyota";

    count() 函数:

    用于返回数组的长度(元素的数量);

    for循环:

    遍历并打印数值数组中的所有值

     

    关联数组 - 带有指定的键的数组,每个键关联一个值

    foreach循环:

    遍历并打印数值数组中的所有值

    <?php

    $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

    foreach($age as $x=>$x_value)

    {

    echo "Key=" . $x . ", Value=" . $x_value;

    echo "<br>";

    }

    ?>

     

    PHP foreach() 语法结构用于遍历操作或输出数组,foreach() 仅能用于遍历数组或对象,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。

    foreach (array as $value) 或者: foreach (array as $key => $value)

    上述语法中,每次循环将当前单元的值赋给 $value 并且数组内部的指针向前移一步(这意味着不需要在 foreach 循环之前调用 reset())。在第二种语法格式中还将当前单元的键名也会在每次循环中赋给变量 $key。

    foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。对返回的数组单元的修改也不会影响原数组,但 foreach 循环运行到结束,原数组的内部指针将指向数组的结尾。

     

    多维数组 - 包含一个或多个数组的数组

    主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。

     

    strpos(字符串,要找的数据) 若找不到就返回false

     

    注:php外面的东西会原封不动输出,即不要在PHP外面加注释

     

    API:(Application Programming Interface)

    应用程序编程接口:提供某种特定能力的事物,特点是有输入有输出,我们在开发时用到的接口就叫API .(应用程序编程接口)

     

    php_mbstring.dll

    配置php默认扩展:

    默认Apache加载的php.ini是去Window目录找的,可通过Apache 的默认配置文件修改默认加载路径。

     

    REPL

    F:\>cd F:\Apache\AppServ\php7.3.4

    F:\Apache\AppServ\php7.3.4>php -a

    Interactive shell

    php >

     

    display_error:

    只有当php.ini中的display_error=On的时候,才会在界面上显示Notice错误,开发阶段一定设置为On,生产阶段(开发)设置为Off。

     

    isset() 、empty():两者都会吞掉Undefined index 的警告

    来判断数组中有无键(指定值)

    isset()可判断数组中是否被定义,是否有特定的值 ;

    empty()判断是否没被定义,或者是是否为空 ;

    empty($dict['foo']) 相当于 !isset($dict['foo']) || $dict['foo']==false

    empty的实现:

    funcition empty($input){

    return !isset($input)||$input==false

    }

     

    注意:

    数字:只要不为0 => true

    字符串:

    只要不为空即为真

    0===false =>true '0'===false =>true

    将两者都转为数字作对比

     

    获取元素在数组中的下标:

    array_search();

     

    时间戳: time()

    从 Unix 纪元(格林威治时间 1970-01-01 00:00:00)到当前时间的秒数

     

    格式化日期: date()

    获取有格式的当前时间 格式化一个指定的时间戳

    第一个参数:时间格式

    第二个参数:时间戳--格林威治时间(可省,默认)

    方法:

    1.通过代码设置时区:data-default_tiemzone_set('REC');

    2.更改php.ini=> data.timezone=PRC;

     

    可以通过 strtotime() 将有格式的时间字符串转换为时间戳

    $str='2019-03-19 20:49:40';

    $timestamp=strtotime($str);

    echo date('Y年m月d日<b\r> H:i:s',$timestamp)

    两点注意:

    1.date()里面用单引号

    2.需要换行==> <b\r>

     

    常量:可用define函数定义

    设置之后不允许修改,也是历史存放数据的容器

    特点:

    程序的配置信息(不会在运行过程中修改)会在常量中定义

    变量或者函数采用snake_case(小写字母加下划线)命名规则

    何时使用:

    一般的程序配置信息(不会在运行过程中修改)都会在变量中定义

    命名规则:

    变量或者函数都是采用snake_case的命名规则

    常量是SNAKE_CASE(纯大写)命名规则

    参数:define( )

    1:名称

    2:值

    3.是否忽略大小写(不建议使用)

    不允许重复定义常量

     

    require、include载入文件

    require:

    类似CSS 的import

    require 用于在当前脚本中载入别的脚本文件并且执行

    注意:require在每次调用时都会载入对应的文件

     

    require_once:(如果之前载入过,不执行)只载入一次

    由于类似于定义常量 函数,不可定义多次require_once更适合载入这种文件

     

    include 一般用于载入公共文件,这个文件的存在与否不能影响程序后面的运行

    require 用于载入不可缺失的文件

     

    表单

    $_POST:

    当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本。

    form表单:

    get/post:

    1. 请求的方式不同

    2. 传参方式不同,get 用 url 传参数,post 用 请求体 传参

     

    input

    表单中使用了radio:

    1.若未设置value,不会提交。选中 -> on

    2.一定要为相同name的radio设置不同的value,让服务器端可以辨别,并输出->"value"

    3.只有选中才提交

     

    checkbox:

    如果没有选中则不会提交 选中->'on'

    设置value 选中->'value';

    多选:

    1.如果name没有以数组的形式则只能显示最后一个选中的

    2.设置name+'[ ]';服务器以索引数组形式接收值

    注意:请求体里面的数据:Form Data

     

    select:

    若option里面设置了value 提交后--->'value'

    没有设置value 提交--->innerText

     

    表单处理三部曲:

    1.接收并校验

    2.持久化--->文件(将数据持久保存到磁盘)

    3.响应(服务端的反馈)

     

    超全局变量:$GLOBALS

    全局变量:$global

     

    如果表单中存在一个文件域/文件上传,method一定为post,entype设置为mutipart/form-data

    enctype默认为urlencoded 格式:key1=value1$keya=value2

     

    提交文件: <input type='file'>

    $_FILES();

    $_FILES['userfile']['error']

    UPLOAD_ERR_OK:其值为 0,没有错误发生,文件上传成功。

    UPLOAD_ERR_INI_SIZE:其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

    UPLOAD_ERR_FORM_SIZE:其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

    UPLOAD_ERR_PARTIAL:其值为 3,文件只有部分被上传。

    UPLOAD_ERR_NO_FILE:其值为 4,没有文件被上传。

    UPLOAD_ERR_NO_TMP_DIR:其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

    UPLOAD_ERR_CANT_WRITE:其值为 7,文件写入失败。PHP 5.1.0 引进。

     

    $_SERVER

    $_SERVER['PHP_SELF'] :动态获取当前页面访问路径

    这样就不用因为文件重命名或者网站目录结 构调整而修改代码了

     

    $SERVER['REQUEST_METHOD']:

    访问页面使用的请求方法;例如"GET","HEAD","POST","PUT"。

    Note:

    如果请求方法为 HEAD,PHP 脚本将在发送 Header 头信息之后终止(这意味着在产生任何输出后,不再有输出缓冲)。

     

     

    HTTP

    header()函数专门用于设置响应头的信息

     

    json_decode:

    json_decode(string $json[, bool $assoc = false[, int $depth = 512[, int $options = 0]]] ) : mixed)

    json:待解码的 json string 格式的字符串。 这个函数仅能处理 UTF-8 编码的数据。

    assoc:当该参数为 TRUE 时,将返回 array 而非 object 。

    depth:指定递归深度。

    options:JSON解码的掩码选项。

    现在有两个支持的选项。第一个是JSON_BIGINT_AS_STRING,用于将大整数转为字符串而非默认的float类型。第二个是 JSON_OBJECT_AS_ARRAY,与将assoc设置为 TRUE 有相同的效果。

    json_encode:

    对变量进行 JSON 编码

     

    foreach:

    1.foreach (array as $value)

    statement

    2.foreach (array as $key => $value)

    statement

    第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

    第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。

     

    HTML autocomplete

    autocomplete 属性规定输入字段是否应该启用自动完成功能。

    自动完成允许浏览器预测对字段的输入。当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在字段中填写的选项。

    注释:autocomplete 属性适用于 <form>,以及下面的 <input> 类型:text, search, url, telephone, email, password, datepickers, range 以及 color。

     

    in_array— 检查数组中是否存在某个值

    in_array( mixed $needle, array $haystack[, bool $strict = FALSE] ) : bool

    needle:待搜索的值。

    如果找到 needle 则返回 TRUE,否则返回 FALSE。

    如果 needle 是字符串,则比较是区分大小写的。

    haystack:待搜索的数组。

    strict:如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。

     

    explode— 使用一个字符串分割另一个字符串

    explode( string $delimiter, string $string[, int $limit] ) : array

    以字符串delimiter来分割string

    此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。

     

    move_uploaded_file— 将上传的文件移动到新位置

    move_uploaded_file( string $filename, string $destination) : bool

    filename:上传的文件的文件名。

    destination:移动文件到这个位置。

    本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。

    这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

     

    在Windows中文系统上要求传入的参数如果有中文必须是GBK编码

    在接收文件时,注意中文

     

    file_get_contents— 将整个文件读入一个字符串

    ----->string

    file()------>array

     

    file_put_contents

    — 将一个字符串写入文件

    和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

    序列化:将数据转化为json

    反序列化:将json转化为字符串

     

    php中页面传递参数:

    1.问号传参(最常用)

    page01.php代码如下: <?php  $var = 'I love you !'; ?> <a href="<?php echo "page02.php?new=".$var ?>">get</a> 定义一个变量$var。 超链接a的href属性里写明要跳转到page02页面。后面加一个问号,一个自己定义的变量new【此名称在page02页面要使用】,new的值就是我们想传递的$var。

    page02.php 代码如下: <?php echo $_GET['new']; ?> 使用$_GET[ ]获取new的值,然后就可以输出或做其他用途。 这时的浏览器地址栏可以直接看到new变量和它的值。

    2.表单传递。 page01.php 代码如下: <form action="page02.php" method="post"> <input type="text" name="wuziling" /> <input type="submit" name="submit" value="提交" /> </form> 表单内的属性action直接指定此表单内容传递到哪个页面。method指明了传递的方式。post代表使用消息传递,就像我们发短信一样。 page02.php代码如下: <?php  $wu = $_POST['wuziling']; echo $wu; ?> 用$_POST[ ]获取传递过来的变量值。这个变量名wuziling在表单的input标签的name属性里定义。 然后将其传递给另外一个变量$wu。这样我们就可以输出了。直接输出也是可以的,echo $_POST['wuziling'];

     

    array_search()

    array_splice();

     

    单个文件域多个文件上传:

    name 一定 以 [] 结尾,服务端会接收到一个数组

    multiple 可以让一个文件域多选

     

    php传入文件的方式问题(绝对路径)

     

    MYSQL

    mysqli_connect()——函数打开一个到 MySQL 服务器的新的连接。

    语法

    mysqli_connect(host,username,password,dbname,port,socket);

     

    mysql_query— 发送一条 MySQL 查询(不支持多条查询)

     

    mysql_query(MySQL连接,SQL 查询语句);

    mysql_query() 仅对 SELECT,SHOW,DESCRIBE, EXPLAIN 和其他语句语句返回一个 resource,如果查询出现错误则返回 FALSE。

    对于其它类型的 SQL 语句,比如INSERT, UPDATE, DELETE, DROP 之类, mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。

    返回的结果资源应该传递给 mysql_fetch_array() 和其他函数来处理结果表,取出返回的数据。

     

    mysql_fetch_assoc()----返回对应结果集的关联数组,并且继续移动内部数据指针。

     

    mysql_fetch_assoc() 和用 mysql_fetch_array() 加上第二个可选参数 MYSQL_ASSOC 完全相同。它仅仅返回关联数组。

    对比:

    mysql_fetch_array() - 从结果集中取得一行作为关联数组,或数字数组,或二者兼有

    mysql_fetch_assoc() - 从结果集中取得一行作为关联数组

     

    mysql_affected_rows

    ([ resource $link_identifier = NULL] ) : int

     

    取得最近一次与数据库连接 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数。

    执行成功则返回受影响的行的数目,如果最近一次查询失败的话,函数返回 -1。

     

    pathinfo

    ( string $path[, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME] ) : mixed

     

    print_r(pathinfo("/resources/img/stock/wxb001/美景.png"));

    输出:

    5.6.4-2

    Array

    (

    [dirname] => /resources/img/stock/wxb001

    [basename] => 美景.png

    [extension] => png

    [filename] => 美景

    )

     

    Cookie:

    path:设置cookie的作用路径范围

    domain:设置cookie的作用域名范围

    httponly:

    只有请求访问时才能访问cookie, js无法获取

    toGMTString()

     

    setcookie(name, value, expire, path, domain, secure, httponly):

    1.name:Cookie 名称。

     

    2.value:Cookie 值。

    这个值储存于用户的电脑里,请勿储存敏感信息。比如 name 是 'cookiename',可通过 $_COOKIE['cookiename'] 获取它的值。

    3.expire:Cookie 的过期时间。

    这是个 Unix 时间戳,即 Unix 纪元以来(格林威治时间 1970 年 1 月 1 日 00:00:00)的秒数。也就是说,基本可以用 time() 函数的结果加上希望过期的秒数。或者也可以用 mktime()。 time()+60*60*24*30 就是设置 Cookie 30 天后过期。如果设置成零,或者忽略参数, Cookie 会在会话结束时过期(也就是关掉浏览器时)。

    Note:

    你可能注意到了,expire 使用 Unix 时间戳而非 Wdy, DD-Mon-YYYYHH:MM:SS GMT 这样的日期格式,是因为 PHP 内部作了转换。

     

    4.path:Cookie 有效的服务器路径。

    设置成 '/' 时,Cookie 对整个域名 domain 有效。如果设置成 '/foo/', Cookie 仅仅对 domain 中 /foo/ 目录及其子目录有效(比如 /foo/bar/)。默认值是设置 Cookie 时的当前目录。

     

    5.domain:Cookie 的有效域名/子域名。

    设置成子域名(例如 'www.example.com'),会使 Cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 'example.com')。

     

    6.secure设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。

    设置成 TRUE 时,只有安全连接存在时才会设置 Cookie。如果是在服务器端处理这个需求,程序员需要仅仅在安全连接上发送此类 Cookie (通过 $_SERVER["HTTPS"] 判断)。

     

    7.httponly设置成 TRUE,Cookie 仅可通过 HTTP 协议访问。

    这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。要有效减少 XSS 攻击时的身份窃取行为,可建议用此设置(虽然不是所有浏览器都支持),不过这个说法经常有争议。 PHP 5.2.0 中添加。 TRUE 或 FALSE

     

     

     

     

     

     

     

     

     

    最新回复(0)