LINUX常用命令
1.sudo
系统管理员的身份执行指令,也就是说,经由sudo所执行的指令就好像是root亲自执行
sudo service apache2 start
开启apache服务
sudo passwd root
修改root密码
sudo ifconfig
查看网络连接信息
sudo apt update
sudo apt upgrade
sudo apt install XXX
系统更新和软件安装
ls 命令,显示文件夹内容
-a:全部的档案,连同隐藏档(开头为.的档案)一起列出来。
-l:显示文件和目录的详细资料。
pwd 命令,查看当前工作目录的完整路径
cd 命令,切换目录
cd/home 进入 ‘/home’目录
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cp 命令,复制
cp 原文件 目标
rm 命令,删除
Arping
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在同一以太网中,通过地址解析协议,源主机可以通过目的主机的IP地址获得目的主机的MAC地址。
arping,用来向局域网内的其他主机发送ARP请求的指令,它可以用来测试局域网内的某个IP是否已被使用。
使用实例
查看某个IP的MAC地址
sudo arping 192.168.81.135
查看某个IP的MAC地址,并指定count数量
sudo arping -c 1 192.168.81.135
-w timeout 设定一个扫描时间,单位是秒。
sudo arping -w 1 192.168.81.135
hping3
hping是面向命令行的用于生成和解析CP/IP协议数据包汇编/分析的开源工具。
目前最新版是hping3,它支持TCP,UDP,ICMP和RAW-IP协议,具有跟踪路由模式,能够在覆盖的信道之间发送文件以及许多其他功能。
hping3是安全审计、防火墙测试等工作的标配工具。hping优势在于能够定制数据包的各个部分,因此用户可以灵活对目标机进行细致地探测。
实验靶机
Metasploitable2 IP:192.168.81.135
Windows7 IP:192.168.81.136
查看帮助
sudo hping3 --help
端口扫描
hping3 -I(大i) eth0 -S 192.168.81.135 -p 80
拒绝服务攻击
参数说明
-H --help 显示帮助
-v --VERSION 版本信息
-c --count count发送数据包的次数 关于counttreached timeout 可以在hping2.里编辑
-i --interval 包发送间隔时间(单位是毫秒)缺省时间是1秒,此功能在增加传输率上很重要,在
idle/spoofing扫描时此功能也会被用到,你可以参考hping-howto获得更多信息-fast每秒发10个数据包。
-n -nmeric 数字输出,象征性输出主机地址
-q -quiet 退出
-I --interface interface name 无非就是eth0之类的参数。
-v verbose 显示很多信息,TCP回应一般如:len=46 ip=192.168.1.1 flags=RADF seq=0 ttl=255
id=0 win=0 rtt=0.4ms tos=0 iplen=40 seq=0 ack=1380893504 sum=2010 urp=0
-D -debug 进入debug模式当你遇到麻烦时,比如用hping遇到一些不合你习惯的时候,你可以用此模式修改hping ,
(INTERFACE DELECTION,DATA LINK LAYER ACCESS,INTERFACE SETTINGS.....)
-p --deskport [+][+]desk port 设置目标端口,缺省为0,一个加号设置为:每发送一个请求包到达后,端口加一,两个加号为:每发送一个包,端口数加1.
-s --baseport source port hping 用源端口猜测回应包,它从一个基本端口计数,每收一个请求包,端口也加1,这规则你可以自己定义。
-m --tcpseq 设置TCP序列数。
-l --tcpck设置TCP ack;
nslookup 命令用于查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题
使用这款工具的时候,大家用到最多的就是查询一个域名的A记录。
nslookup domain [dns-server]
如果没指定dns-server,用 系统默认的dns服务器。
查询其他记录
直接查询返回的是A记录,我们可以指定参数,查询其他记录,比如AAAA,MX等。
nslookup -type=type domain [dns-server]
mx 邮箱服务器记录
nslookup -type=mx mail.xxxx.com
type可以是以下这些类型:
A 地址记录
AAAA 地址记录
AFSDB Andrew 文件系统数据库服务器记录
ATMA ATM 地址记录
CNAME 别名记录
HINFO 硬件配置记录,包括CPU/操作系统信息
ISDN 域名对应的ISDN号码
MB 存放指定邮箱的服务器
MG 邮箱组记录
MINFO 邮箱组和邮箱的信息记录
MR 改名的邮箱记录
MX 邮箱服务记录
NS 名字服务器记录
PTR 反向记录
RP 负责人记录
RT 路由穿透记录
SRV TCP 服务器信息记录
TXT 域名对应的文本记录
dnsenum是一款域名信息收集工具
dnsenum的目的是尽可能收集一个域的信息,它能够通过谷歌或者字典文件猜测可能存在的域名,以及对一个网段进行反向查询。它可以查询网站的主机地址信息、域名服务器等信息。
可以查询网站的主机地址信息、域名服务器、mx record(函件交换记录)
DNS信息劫持
DNS重定向
ARP欺骗
A(Address)记录是用来指定主机名或域名对应的ip得知记录
NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
MX(Mail Exchanger)记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发送邮件时根据收件人的地址后缀来定位邮件服务器。
PTR记录用于将一个IP地址映射到对应的域名,也可以看成A记录的反向,IP地址点的反向解析。
dnsmap 的使用
DNS域名暴力穷举工具
参数说明
-w 后加字典文件
-r 指定结果用常规格式输出文件
-c 指定结果用csv去输出
-d 设置延迟
-i 设置忽略ip(当你遇到一个虚假ip时很有用)
案例
dnsmap example.com
dnsmap example.com -w yourwordlist.txt -r /tmp/domainbf_results.txt
dnsmap example.com -r /tmp/ -d 3000
dnsmap example.com -r ./domainbf_results.txt
域名查询工具DMitry
DMitry工具是用来查询IP或域名WHOIS信息的。WHIOS是用来查询域名是否已经被注册,以及被注册域名的详情的数据库(如域名所有人和域名注册商)。使用该工具可以查询到域名的注册商和过期时间等。
常用参数:
-o 将输出保存到%host.txt或由-o文件指定的文件
-i 对主机的IP地址执行whois查找
-w 对主机的域名执行whois查找
-n 在主机上检索Netcraft.com信息
-s 执行搜索可能的子域
-e 执行搜索可能的电子邮件地址
-p 在主机上执行TCP端口扫描
-f 在显示输出报告过滤端口的主机上执行TCP端口扫描
-b 读取从扫描端口接收的banner
-t 0-9扫描TCP端口时设置TTL(默认为2)
Requires the -p 需要-p标记才能传递
网站防火墙探测工具Wafw00f
现在网站为了加强自身安全,通常都会安装各类防火墙。这些防火箱往往会拦截各种扫描请求,使得测试人员无法正确判断网站相关信息。kali LINUX提供了一款网站防火墙探测工具Wafw00f.它可以通过发送正常和带恶意代码的HTTP请求,以探测网站是否存在防火墙,并识别防火墙的类型。
WAFW00F是怎样工作的?
为了实现这一目的,WAFW00F会执行如下操作:
1、发送正常的HTTP请求,然后分析响应,这可以识别出很多WAF.
2、如果不成功,它会发送一些(可能是恶意的)HTTP请求,使用简单的逻辑推断是哪一个WAF。
3、如果这次也不成功,它会分析之前返回的响应,使用其他简单的算法猜测是否有某个WAF或者安全解决方案响应了我们的攻击。
它能检测什么?
它可以检测很多WAF,想要查看它能检测哪些WAF,以-1参数执行WAFW00F
使用方法
wafw00f -l
wafw00f -a www.xxxx.com
Nmap
Nmap是什么?
诸神之眼,Nmap是主机扫描工具,它的图形化界面是Zenmap,分布式框架为Dnmap.
Nmap可以完成以下任务:
主机探测
端口扫描
版本检测
系统检测
支持探测脚本的编写
Nmap在实际中应用场合如下:
通过对设备或者防火墙的探测来审计它的安全性
探测目标主机所开放的端口
通过识别新的服务器审计网络的安全性
探测网络上的主机
Nmap的基本操作
1、对单个主机的扫描
nmap <IP>
2、对多个不连续的主机进行扫描
nmap 192.168.3.2 192.168.3.155 192.168.13.56
不同的IP之间用空格分开
3、对连续的主机进行扫描
nmap 192.168.152.100-200
4、对整个子网进行扫描
nmap 912.168.152.1-255
Nmap端口扫描
什么是端口?
端口是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部的端口,不可见。例如见算计中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。
端口对应着服务和软件
端口范围:0~65535
文件共享服务端口
端口号 | 端口说明 | 攻击方向 |
21/22/69 | Ftp/tftp文件传输协议 | 允许匿名的上传,下载,爆破,嗅探操作 |
2049 | Nfs服务 | 配置不当 |
139 | Samba服务 | 爆破,未授权访问,远程代码执行 |
389 | Ldap目录访问协议 | 注入,允许匿名访问,弱口令 |
远程连接服务端口
端口号 | 端口说明 | 攻击方向 |
22 | SSH远程连接 | 爆破,SSH隧道及内网代理转发,文件传输 |
23 | Telnet远程连接 | 爆破,嗅探,弱口令 |
3389 | Rdp远程桌面连接 | Shift后门(需要win server2k3一下系统),爆破 |
5900 | VNC | 弱口令爆破 |
5632 | PyAnywhere服务 | 抓密码,代码执行 |
WEB服务端口
端口号 | 端口说明 | 攻击方向 |
80/443/8080 | 常见的Web服务端口 | Web攻击,爆破,对应服务器版本漏洞 |
7001/7002 | WebLogic控制台 | java反序列化,弱口令 |
8080/8089 | Jboss/Resin/Jetty/Jenkins | 反序列化,控制台弱口令 |
9090 | WebSphere控制台 | java反序列化,弱口令 |
4848 | GlassFish控制台 | 弱口令 |
1352 | Lotus domino 邮件服务 | 弱口令,信息泄露,爆破 |
10000 | Webmin-Web 控制面板 | 弱口令 |
数据库服务端口
端口号 | 端口说明 | 攻击方式 |
3306 | MySQL | 注入,提权,爆破 |
1433 | MSSQL数据库 | 注入,提权,SA弱口令,爆破 |
1521 | Oracle数据库 | TNS爆破,注入,反弹Shell |
5432 | PostgreSQL数据库 | 爆破,注入,弱口令 |
27017/27018 | MongDB | 爆破,未授权访问 |
6379 | Redis数据库 | 可尝试未授权访问,弱口令爆破 |
5000 | SysBase/DB2数据库 | 爆破/注入 |
邮件服务端口
端口号 | 端口说明 | 攻击方向 |
25 | SMTP邮件服务 | 邮件伪造 |
110 | POP3协议 | 爆破,嗅探 |
143 | IMAP协议 | 爆破 |
网络常见协议端口
端口号 | 端口说明 | 攻击方向 |
53 | DNS域名系统 | 允许区域传送,DNS劫持,缓存投毒,欺骗 |
67/68 | DHCP服务 | 劫持,欺骗 |
161 | SNMP协议 | 爆破,搜集目标内网信息 |
特殊服务端口
端口号 | 端口说明 | 攻击方式 |
2181 | Zookeeper服务 | 未授权访问 |
8069 | Zabbix服务 | 远程执行,SQL注入 |
9200/9300 | Elasticsearch服务 | 远程执行 |
11211 | Memcache服务 | 未授权访问 |
512/513/514 | Linux Rexec服务 | 爆破,Rlogin登录 |
873 | Rsync服务 | 匿名访问,文件上传 |
3690 | Svn服务 | Svn泄露,未授权访问 |
50000 | SAP Management Console | 远程执行 |
Nmap端口扫描方法
-p 参数 ,通过该参数指定一个想要扫描的端口号,可以指定一个也可以指定一个范围。
nmap -p 80 192.168.152.129
nmap -p 80-800 192.168.152.129
扫描tcp端口
-sT
nmap -sT 192.168.152.129
扫描udp端口
-sU
nmap -sU 192.168.152.129
Nmap主机发现
跳过Ping扫描阶段(无ping扫描)
通常Nmap在进行其他扫描之前,都会对目标进行一个Ping扫描。
如果目标对Ping扫描没反应的话,就会直接结束整个扫描过程(服务器可以禁止Ping)
nmap -PN<ip>
仅使用Ping协议进行主机发现
有时候,需要快速的大量主机中去快速的发现主机,这时候,仅使用Ping协议进行扫描,速度会非常快
nmap -sP<ip>
使用ARP协议进行主机发现
ARP协议扫描只适用于局域网内,使用ARP,不仅速度快,而且结果也会更加准确。
nmap -PR<ip>
Nmap指纹识别
什么是指纹识别?
指纹识别技术是众多生物特征识别技术中的一种,所谓生物特征识别技术(biometrics),是指利用人体所固有的生理特征或行为特征来进行个人身份鉴定,由于生物识别所具有的便捷与安全等优点使得生物识别技术在身份认证识别和网络安全领域拥有广阔的应用前景,可用的生物特征识别技术有指纹、人脸、声纹、虹膜等,指纹是其中应用最为广泛的一种。
服务和软件也有自己的特征,根据这些特征能够判断出具体的版本
不同版本对应不同的漏洞
识别服务和软件版本
-sV
Nmap -sV 192.168.152.129
识别操作系统版本
-O
Nmap -O 192.168.152.130
Nmap信息收集
在渗透测试过程中,信息收集非常重要,
Nmap作为诸神之眼,扫描之王,像信息收集这样的任务,自然也可以去完成。
IP信息收集
nmap --script ip-geolocation-*www.0day.cn
Whois信息查询(域名)
nmap -script whois-domain www.0day.cn
NSE脚本
在文件系统的user/share/nmap/
Legion漏洞扫描分析工具
Legion是Sparta的一个分支,她是一个开源的、易于使用的、超级可扩展的、半自动的网络渗透测试框架
是一款kali linux系统默认集成的Python GUI应用程序工具。Legion是一个Nmap、Nikto、Hydra等工具的集合,利用各种工具的优秀功能,完成信息收集、扫描和爆破等任务。
Legion主要包含以下功能:
端口扫描,程序自动调用nmap进行扫描,根据nmap的扫描结果,nikto自动加载结果,展开更精确的扫描。
针对扫描的结果,特定使用,如:使用dirbuster目录爆破,利用webslayer进行web指纹识别。
针对可暴力破解的端口,可调用hydra进行暴力破解。
漏洞利用
https://www.exploit-db.com
利用本地漏洞资源
kali Linux系统中,有搜索漏洞数据库(exploitdb)的本地副本,我们可以在终端窗口中输入命令去搜索。
Searchsploit
参数
-c, --case[Term]执行区分大小写的搜索,默认搜索对大小写不敏感。
-e, --exact[Term]对exploit标题执行EXACT匹配(默认为AND)
-j, --json[Term]以JSON格式显示结果
-m, --mirror [EDB-ID]将一个漏洞利用镜像(副本)到当前工作目录,后面跟漏洞ID号
-o, --overflow [Term] Exploit标题被允许溢出其列
-p, --path[EDB-ID]显示漏洞利用的完整路径(如果可能,还将路径复制到剪切板),后面跟漏洞ID号
-t, --title [Term]仅仅搜索漏洞标题(默认是标题和文本的路径)
-u, --update 检查并安装任何exploitdb软件包更新(deb或git)
-w, --www [Term]显示Exploit-DB.com的URL而不是本地路径(在线搜索)
使用实例
搜索标题中包含oracle windows的漏洞
searchsploit -t oracle windows
搜索漏洞号为39446的漏洞
searchsploit -p 3389
查找mssql的漏洞
searchsploit mysql
查找apple的漏洞
searchsploit apple
案例演示
实验靶机:Windows7 带 easy file sharing这款软件 IP:192.168.152.133
Easy File Sharing 这个软件,是一种允许访客容易地经由浏览器上传/下载文件的文件分享系统。
我们在kali的本地漏洞库中搜索这个软件的相关漏洞
searchsploit easy file sharing
python /usr/share/exploitdb/exploits/windows/remote/39009.py 192.168.152.133 80
安全建议:
系统和软件都使用最新版本
渗透测试者的困扰
1、需要学习的工具软件太多,那么多的命令实在记不住
2、不同的工具软件有不同的使用习惯,如果这些工具能够统一风格,将会更加方便。
Metasploit被业内誉为可以黑掉整个宇宙的工具,虽然有些夸张,但Metasploit确实有强大的功能。
Metasploit是目前最流行,最强大,最具拓展性的渗透测试平台。
2003年有HD摩尔发布第一版,2007年用ruby语言重写。
后来被Rapid收购后,分出了多个版本,有付费的,也有免费的。
官网:https://www.metasploit.com/
该软件适用于Windows系统,Linux系统,苹果系统
Metasploit:端口扫描
实验靶机:metasploitable2 ip:xxxx
用 nmap ip
用Metasploit模块扫描
search portscan
使用模块
use anxiliary/scanner/portscan/tcp
查看需要设置的参数
show options
设置参数
set rhosts ip
Metasploit:SMB扫描 获取系统信息
实验靶机:Windows7 IP:192.168.81.135
什么是SMB
SMB(全称是Server Message Block)是一个协议名,它能被用于Web连接和客户端与服务器之间的信息沟通。
中文名:服务器信息块
通过扫描SMB,可以识别目标的系统信息
Metasploit:服务识别
扫描服务器的SSH服务
search
网络嗅探,获取FTP密码
切换管理员
sudo su
启动metasploit
输入命令msfconsole 启动 metasploit
使用密码嗅探模块
SNMP扫描与枚举
SNMP是专门设计用于在IP网络管理网络节点(服务器,工作站,路由器,交换机等)
的一种标准协议,它是一种应用协议。
各种网络设备上都可以看到默认启用的SNMP服务,从交换机到路由器,从防火墙到网络打印机,无一例外。
默认情况下,Metasploitable的SNMP服务仅侦听本地主机。
打开并编辑“ /etc/default/snmpd”,然后将以下内容更改为:
SNMPDOPTS='-Lsd -Lf/dev/null -u snmp -l -smux -p /var/run/snmpd.pid 127.0.0.1'
修改为
SNMPDOPTS='-Lsd -Lf/dev/null -u snmp -l -smux -p /var/run/snmpd.pid 0.0.0.0'
什么是计算机网络
- 计算机网络是利用通信线路将不同地理位置、具有独立功能的计算机和通信设备连接起来,实现资源共享和信息传递等目的的计算机系统。
主要有局域网(LAN)、城域网(MAN)、广域网(WAN)和互联网(Internet)等。
信息系统是能进行信息的采集、传输、存储、加工、使用和维护的计算机应用系统。
信息安全
- 信息安全是指保护信息系统中的计算机硬件、软件及数据不因偶然或恶意的原因而遭到破坏、更改、泄露,保障系统连续可靠正常地运行,信息服务不中断。
- 信息安全(狭义)是指保护信息系统的安全,主要目标包括保护信息系统的保密性、完整性和可用性等。
计算机病毒
计算机病毒是指编制或者在计算机程序中插入的,破坏计算机功能或者毁坏数据、影响计算机使用,并能自我复制的一组计算机指令或者程序代码。计算机病毒具有寄生性、隐蔽性和传染性等特点。
计算机木马
木马是一种用来非法收集信息或者控制另一台计算机的特定程序,通常有客户端和服务端两部分,植入木马的计算机是服务端部分。木马通常会伪装成程序包、压缩文件、图片、视频等形式,通过网页、邮件、即时通信等渠道诱导用户下载安装,如果用户打开了此类木马程序,用户的计算机或只能终端等设备便会被木马植入者所控制,造成数据文件被窃取或修改、电子账户资金被盗用等危害。
入侵
指对计算机网络或系统的非授权访问行为,通常是恶意的存取信息、处理信息或破坏系统的行为。
攻击
只利用网络或计算机系统存在的漏洞和安全缺陷对其进行破坏、泄露、更改或使其丧失功能的行为。
漏洞
指网络或信息系统的硬件、软件、协议的具体实现或安全策略上存在的弱点或缺陷。漏洞可能来自应用软件或操作系统设计时的缺陷或编码时产生的错误,也可能来自业务在交互处理过程中的设计缺陷或不合理的逻辑流程处理。
后门
指绕过安全性控制而获取对程序或系统访问权的程序方法,是有意留在计算机系统中,共某些特殊使用者通过某种特殊方式控制计算机系统的途径。后门与漏洞的区别在于:漏洞是一种无意行为,而后门是程序员在软件开发过程中有意创建的。
防火墙
是一种将内部网和外部网隔离,保护内部网免收非法用户的侵入的访问控制技术。防火墙可以软件实现,也可以硬件实现。
补丁
指针对软件系统在使用过程中暴露的缺陷而发布的修补漏洞的小程序。
密码
一种用于数据或信息的技术(符号系统)。密码系统的基本功能是实现信息的机密性服务。
数字签名
是信息的发送者通过签名算法产生的,用于证明信息发送者发送信息真实性一段数字串。数字签名一般通过密码技术实现,与普通物理签名具有同样法律效力。
数字水印
是一种将标识信息嵌入到数字载体当中,用于确认载体所有者、判断载体是否被篡改或传送秘密信息的技术。嵌入的标识信息也称为数字水印,数字载体包括多媒体、文档、软件等,数字水印嵌入到数字载体时,应不影响原载体的使用价值。
网络安全概述
恶意代码攻击
相关命令:
Reg /?
Reg add /?
消除恶意程序
删除文件C:\Windows\System32\run1132.bat
运行gpedit.msc组策略编辑器
用户配置--->管理模板-->系统,将“阻止访问注册表工具”设为“已禁用”
用户配置-->管理模板-->Windows组件-->Internet Explorer,将“禁止更改主页设置”设为“已禁用”
编辑注册表,删除开机启动项“ctfmom”
重新打开
安全防护
Cookie安全限制
Cookie是一个数据包,当用户浏览一个网站后会生成这样一个数据包,包含了发布Cookie的网站名、用户访问、个人资料、浏览习惯、消费习惯等数据。它的作用是能够让你在下一次访问时不需要重新输入用户名和口令。COOKIE本身是安全的,它既可以存储在个人计算机上,也可在一次浏览会话中创建、使用并删除。Cookie的安全问题十个人信息容易被别人以不为人觉察的方式收集、存储和利用。
在浏览器中对Cookie的使用作出限制,并制定删除浏览器中的Cookie有利于保护自己的隐私不被跟踪。
限制使用Cookie的方法,单击“工具/Internet选项”->“隐私”->“设置”菜单中,调整Cookie的安全级别。多数的网站论坛站点需要使用Cookie信息,一般选择“中高”或者“高”的安全级别。最高安全级别是“阻止所有Cookie”;如果只是为了禁止个别网站的Cookie,可以单击“编辑”按钮,将要屏蔽的网站添加到列表中。清除Cookie的方法:点击浏览器上方的“工具/Internet选项”->“常规”菜单,点击“删除浏览的历史记录”,选择删除“Cookie”。
PHP变量与常量
- PHP变量
在这个abc.php文件中写入如下代码。
<?php
$iphone6 = 5880;
$iphone6plus = 6088;
echo $iphone6+$iphone6plus;
变量的几个特点:
- 必须要以$开始。如变量x必须要写成$x;
- 变量的首字母不能以数字开头。
- 变量的名字区分大小写
- 变量不要用特殊符号、中文,_不算特殊符号。
- 变量命名要有意义(别写xxx,aaa,ccc这种变量名)
变量分类:可变变量、外部变量、环境变量。
- 可变变量举例说明:
<?php
//定义了一个变量叫作$shu ,将$shu这个变量的值设为字符串的biao
$shu='biao';
//定义了一个【变量】$biao。将他的值设置为鼠标
$biao='鼠标';
//$$shu就是可变变量:在已声明的变量$shu前又加上了一个变量符
echo $$shu;
- 外部变量举例说明:
PHP的外部变量是PHP在使用过程中规定好的一些变量。这个变量的规定是这样规定的,,就这样使用。
<?php
//$_POST后面加上中括号,将username作为字符串放在中括号里面,就得到了表单里面的<input type="text" namae="username" />的值
$u=$_POST['username'];
echo $u.'<br />';
//$_POST['pwd']得到表单<input type="text" name="username" />的值
$passwd = $_POST['pwd'];
echo $passwd.'<br />';
通过上面的实验我们知道了,通过$_POST这个外部变量,可以得到从表单输入的值。
全局变量名 | 功能说明 |
$_COOKIE | 得到会话控制中cookie传值 |
$_SESSION | 得到会话控制中session的值 |
$_FILES | 得到文件上传的结果 |
$_GET | 得到get传值的结果 |
$_POST | 得到post传值的结果 |
$_REQUEST | 即能得到get的传值结果,也能得到Post传值的结果 |
- 环境变量举例说明:
环境变量我们主要用的有$_SERVER和$_env两个环境变量。不过,$_ENV逐渐被PHP的新版给废弃了。
<?php
phpinfo();
其他环境变量:
$_SERVER[“REQUEST_METHOD”] 请求当前PHP页面的方法
$_SERVER[“REQUEST_URL”] 请求的URL
$_SERVER[“REQUEST_SOFTWARE”] 用的是哪一种服务器
$_SERVER[“REMOTE_ADDR”] 客户的IP地址
$_SERVER[“SERVER_ADDR”] 当前服务器的IP地址
$_SERVER[“SCRIPT_FILENAME”] 主前请求文件的路径
$_SERVER[“HTTP_USER_AGENT”] 当前访问这个网站的电脑和浏览器的情况
$_SERVER[“HTTP_REFERER”] 上级来源(用户从哪个地址进入当前网页的)
$_SERVER[“REQUEST_TIME”] 当前的时间
- PHP常量
define(常量名,常量值)
注:
- 常量名可以小写,但通常大写
- 常量名可以不加引号,但通常加上引号
- 在字符串中调用常数的时候,必须在引号外面
- 常量名建议只用字母和下划线
<?php
define('MY_NAME','PHP中文网');
echo MY_NAME;
echo '我的名字是'.MY_NAME;
此外,系统还为我们准备了一些内置的常量。这些常量都是规定好的。
常量名 | 说明 |
LINE | 当前所在的行 |
FILE | 当前文件在服务器的路径 |
FUNCTION | 当前函数名 |
CLASS | 当前类名 |
METHOD | 当前成员方法名 |
常量名 | 说明 |
PHP_OS | PHP运行得操作系统 |
PHP_VERSION | 当前PHP的版本 |
TRAIT | Trait的名字,php5.4新加 |
DIR | 文件所在的目录 |
NAMESPACE | 当前命名空间的名称(区分大小写) |
PHP的数据类型
PHP中一共有八种数据类型,包括4种标量数据类型,即boolean(布尔类型),integer(整型),float/double(浮点型)和string(字符串型)两种复合数据类型,即array(数组)和object(对象),两种特殊的数据类型,即resource(资源)与null(无,空白)。
数据类型 | 描述 |
Boolean(布尔型) | 布尔型是最简单的数据类型,只有两个值false和true |
String(字符串型) | 字符串就是连续的字符序列,如echo “string” |
Integer(整型) | 整型数据类型只能包含整数,这些数据类型可以是负数或者正数 |
Float(浮点型) | 浮点型类型用于存储数字,和整型不同的是浮点型可以有小数点 |
Array(数组) | 一组相同类型的集合 |
Object(对象) | 对象是一个实力,使用new命令创建一个对象 |
Resource(资源) | 资源是一种特殊的变量,保存在外部资源的一个应用,资源是通过函数来建立的 |
Null(空白) | 特殊的值,表示变量没有值,任何变量的初始值都是null |
- 字符串数据
在PHP语言中声明字符串有三种方式:
- 用单引号声明
- 用双引号声明
- 用字界符声明(需要输入非常大段的字符串时使用)
- 单引号声明
用英文半脚的单引号,将字符串包起来
<?php
//声明字符串变量$zifu
$zifu='你是谁';
echo $zifu;
- 双引号声明字符串
<?php
//声明字符串变量$str
$str="你是谁";
echo $str;
- 字界符声明
- 在变量后面的等号写三个小于号(<<<).
- 然后在<<<后面写上字符(建议英文大写字符)。例如:ABC
- 然后换行写上任意想写的字符
- 写完后,顶行。在行最开始处,再写上<<<后面的字符和分号。
<?php
$dingjie=<<<ABC
如果
非要在这个滚犊子
前
面<br/>
加上一段
<i>距离的话</i>
我想说:<h1>思想有多远,你就跟我滚多远</h1>
ABC;
echo $dingjie;
双引号与单引号的区别:
- 双引号解析变量,单引号不解析变量。
- 在双引号里面插入变量,变量后面如果有英文或者中文字符,他会把这个字符和变量拼接起来,视为一整个变量。一定要在变量后面接上特殊字符,例如空格等分开。
- 如果在双引号里面插入变量的时候,后面不想有空格,可以拿大括号将变量包起来。
- 双引号解析转义字符,单引号不解析转义字符。但单引号能解析\’和\
- 单引号效率高于双引号,尽可能使用单引号
- 双引号和单引号可以互插,双引号当中插入单引号,单引号当中插入变量,这个变量会被解析。
- php数据类型之查看和判断数据类型
查看数据类型
- gettype(传入一个变量)能够获得变量的类型
- var_dump(传入一个变量)输出变量类型和值
判断数据类型
我们使用is_*系列函数。Is_types这一系列的函数,来进行判断某个东西是不是某个类型。如果是这个类型返回真,不是这个类型返回假。
is_int 是否为整型
is_bool 是否为布尔
is_float 是否为浮点
is_string 是否是字符串
is_array 是否是数组
is_object 是否是对象
is_null 是否为空
is_resouce 是否为资源
is_scalar 是否为标量
is_numeric 是否为数值类型
is_callable 是否为函数
PHP的函数基本语法
函数就是功能。调用一个函数就是在调用一个功能。
Function 函数名([参数名1[=值1],参数名2[=值2],参数名n[=值n]])
{
函数中功能体
[return 返回值]
}
文件包含函数
在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这写代码的文件只需要包含这个文件即可。这种方法有助于提高代码的重用性,给代码的编写与维护带来很大的便利。在PHP中,有require,require_once,include,include_once四种方法包含一个文件。
函数 | 包含失败 | 特点 |
include | 返回一个警告 | 文件继续向下执行。通常用于动态包含 |
require | 一个致命的错 | 代码就不会继续向下执行。通常包含极为重要的文件,整个代码甭想执行 |
include_once | 返回一个警告 | 除了原有include的功能以外,他还会做once检测,如果稳健曾经已经被包含过,不再包含 |
require_once | 一个致命的错 | 除了原有功能以外,会做一次once检测,防止文件反复被包含 |
1.abs(): 求绝对值
$abs = abs(-4.2); //4.2 数字绝对值数字
2.ceil(): 进一法取整
echo ceil(9.999); // 10 浮点数进一取整
3.floor(): 舍去法取整
echo floor(9.999); // 9 浮点数直接舍去小数部分
4.fmod(): 浮点数取余
$x = 5.7;
$y = 1.3; // 两个浮点数,x>y 浮点余数
$r = fmod($x, $y);
// $r equals 0.5, because 4 * 1.3 + 0.5 = 5.7
5.pow(): 返回数的n次方
echo pow(-1, 20); // 1 基础数|n次方乘方值
6.round(): 浮点数四舍五入
echo round(1.95583, 2); // 1.96, 一个数值|保留小数点后多少位,默认为0 舍入后的结果
7.sqrt(): 求平方根
echo sqrt(9); //3 被开方的数平方根
8.max(): 求最大值
echo max(1, 3, 5, 6, 7); // 7
多个数字或数组 返回其中的最大值
echo max(array(2, 4, 5)); // 5
9.min(): 求最小值
输入: 多个数字或数组
输出: 返回其中的最小值
10.mt_rand(): 更好的随机数
输入: 最小|最大, 输出: 随机数随机返回范围内的值
echo mt_rand(0,9);//n
11.rand(): 随机数 输入: 最小|最大, 输出: 随机数随机返回范围内的值
12.pi(): 获取圆周率值
字符串函数
去空格或或其他字符:
13.trim(): 删除字符串两端的空格或其他预定义字符
$str = "\r\nHello World!\r\n";
echo trim($str);
输入: 目标字符串
返回值: 清除后的字符串
14.rtrim(): 删除字符串右边的空格或其他预定义字符
$str = "Hello World!\n\n";
echo rtrim($str);
15.chop(): rtrim()的别名
16.ltrim(): 删除字符串左边的空格或其他预定义字符
$str = "\r\nHello World!";
echo ltrim($str);
17.dirname(): 返回路径中的目录部分
echo dirname("c:/testweb/home.php"); //c:/testweb
输入: 一个包含路径的字符串
返回值: 返回文件路径的目录部分
字符串生成与转化:
18.str_pad(): 把字符串填充为指定的长度
$str = "Hello World";
echo str_pad($str,20,".");
输入:
要填充的字符串|新字符串的长度|供填充使用的字符串, 默认是空白
输出:
完成后的字符串
19.str_repeat(): 重复使用指定字符串
echo str_repeat(".",13); // 要重复的字符串|字符串将被重复的次数13个点
20.str_split(): 把字符串分割到数组中
print_r(str_split("Hello"));
输入: 要分割的字符串|每个数组元素的长度,默认1
输出: 拆分后的字符串数组
21.strrev(): 反转字符串
echo strrev("Hello World!"); // !dlroW olleH
输出: 目标字符串颠倒顺序后的字符串
22.wordwrap(): 按照指定长度对字符串进行折行处理
$str = "An example on a long word is: Supercalifragulistic";
echo wordwrap($str,15);
输入: 目标字符串|最大宽数
输出: 折行后的新字符串
23.str_shuffle(): 随机地打乱字符串中所有字符
echo str_shuffle("Hello World");
输入: 目标字符串顺序
输出: 打乱后的字符串
24.parse_str(): 将字符串解析成变量
parse_str("id=23&name=John%20Adams", $myArray);
print_r($myArray);
输入: 要解析的字符串|存储变量的数组名称
输出:
Array(
[id] => 23
[name] => John Adams)
25.number_format(): 通过千位分组来格式化数字
输入:
要格式化的数字|规定多少个小数|规定用作小数点的字符串|规定用作千位分隔符的字符串
输出:
1,000,0001,000,000.001.000.000,00
大小写转换:
26.strtolower(): 字符串转为小写
echo strtolower("Hello WORLD!");
目标字符串
小写字符串
27.strtoupper(): 字符串转为大写
echo strtoupper("Hello WORLD!");
输出: 大写字符串
28.ucfirst(): 字符串首字母大写
echo ucfirst("hello world"); // Hello world
29.ucwords(): 字符串每个单词首字符转为大写
echo ucwords("hello world"); // Hello World
html标签关联:
30.htmlentities(): 把字符转为HTML实体
$str = "John & 'Adams'";echo htmlentities($str, ENT_COMPAT); // John & 'Adams'
31.htmlspecialchars(): 预定义字符转html编码
32.nl2br(): \n转义为<br>标签
echo nl2br("One line.\nAnother line.");
输出: 处理后的字符串
33.strip_tags(): 剥去 HTML、XML 以及 PHP 的标签
echo strip_tags("Hello <b>world!</b>");
34.addcslashes():在指定的字符前添加反斜线转义字符串中字符
$str = "Hello, my name is John Adams.";
echo $str;
echo addcslashes($str,'m');
输入:
目标字符串|指定的特定字符或字符范围
35.stripcslashes(): 删除由addcslashes()添加的反斜线
echo stripcslashes("Hello, \my na\me is Kai Ji\m.");
// 目标字符串 Hello, my name is Kai Jim.
36.addslashes(): 指定预定义字符前添加反斜线
$str = "Who's John Adams?";echo addslashes($str);
输出: 把目标串中的’ ” \和null进行转义处理
37.stripslashes(): 删除由addslashes()添加的转义字符
echo stripslashes("Who\'s John Adams?"); // 清除转义符号Who's John Adams?
38.quotemeta(): 在字符串中某些预定义的字符前添加反斜线
$str = "Hello world. (can you hear me?)";echo quotemeta($str);
// Hello world\. \(can you hear me\?\)
39.chr(): 从指定的 ASCII 值返回字符
echo chr(052); // ASCII 值返回对应的字符
40.ord(): 返回字符串第一个字符的ASCII值
echo ord("hello"); 字符串第一个字符的 ASCII 值
字符串比较:
41.strcasecmp(): 不区分大小写比较两字符串
echo strcasecmp("Hello world!","HELLO WORLD!");
输入:
两个目标字符串
输出:
大1|等0|小 -1
42.strcmp(): 区分大小写比较两字符串
43.strncmp(): 比较字符串前n个字符,区分大小写
调用: int strncmp ( string $str1 , string $str2 , int $len)
44.strncasecmp(): 比较字符串前n个字符,不区分大小写
调用: int strncasecmp ( string $str1 , string $str2 , int $len )
45.strnatcmp(): 自然顺序法比较字符串长度,区分大小写
调用: int strnatcmp ( string $str1 , string $str2 )
输入:
目标字符串
46.strnatcasecmp(): 自然顺序法比较字符串长度, 不区分大小写
调用: int strnatcasecmp ( string $str1 , string $str2 )
字符串切割与拼接:
47.chunk_split():将字符串分成小块
调用: str chunk_split(str $body[,int $len[,str $end]])
输入:
$body目标字串, $len长度, $str插入结束符
输出:
分割后的字符串
48.strtok(): 切开字符串
调用: str strtok(str $str,str $token)
目标字符串$str,以$token为标志切割返回切割后的字符串
49.explode(): 使用一个字符串为标志分割另一个字符串
调用: array explode(str $sep,str $str[,int $limit])
输入: $sep为分割符,$str目标字符串,$limit返回数组最多包含元素数
输出: 字符串被分割后形成的数组
50.implode(): 同join,将数组值用预订字符连接成字符串
调用: string implode ( string $glue , array $pieces )
$glue默认, 用”则直接相连
51.substr(): 截取字符串
调用: string substr ( string $string , int $start [, int $length ] )
字符串查找替换:
52.str_replace(): 字符串替换操作,区分大小写
调用mix str_replace(mix $search,mix $replace, mix $subject[,int &$num])
输入:
$search查找的字符串,$replace替换的字符串,$subject被查找字串, &$num
输出: 返回替换后的结果
53.str_ireplace() 字符串替换操作,不区分大小写
调用: mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] )
输入:
$search查找的字符串,$replace替换的字符串,$subject被查找字串,&$num
输出: 返回替换后的结果
54.substr_count(): 统计一个字符串,在另一个字符串中出现次数
调用: int substr_count ( string $haystack , string $needle[, int $offset = 0 [, int $length ]] )
55.substr_replace(): 替换字符串中某串为另一个字符串
调用: mixed substr_replace ( mixed $string, string $replacement,int $start [, int $length ] )
56.similar_text(): 返回两字符串相同字符的数量
调用: int similar_text(str $str1,str $str2)
输入:
两个比较的字符串
输出:
整形,相同字符数量
57.strrchr(): 返回一个字符串在另一个字符串中最后一次出现位置开始到末尾的字符串
调用: string strrchr ( string $haystack , mixed $needle )
58.strstr(): 返回一个字符串在另一个字符串中开始位置到结束的字符串
调用: string strstr ( string $str, string $needle , bool $before_needle )
59.strchr(): strstr()的别名,返回一个字符串在另一个字符串中首次出现的位置开始到末尾的字符串
调用: string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
60.stristr(): 返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写
调用:string stristr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
61.strtr(): 转换字符串中的某些字符
调用: string strtr ( string $str , string $from , string $to )
62.strpos(): 寻找字符串中某字符最先出现的位置
调用: int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
63.stripos(): 寻找字符串中某字符最先出现的位置,不区分大小写
调用: int stripos ( string $haystack , string $needle [, int $offset ] )
64.strrpos(): 寻找某字符串中某字符最后出现的位置
调用: int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
65.strripos(): 寻找某字符串中某字符最后出现的位置,不区分大小写
调用: int strripos ( string $haystack , string $needle [, int $offset ] )
66.strspn(): 返回字符串中首次符合mask的子字符串长度
调用: int strspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
67.strcspn(): 返回字符串中不符合mask的字符串的长度
调用: int strcspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
输入:
$str1被查询,$str2查询字符串,$start开始查询的字符,$length是查询长度
输出:
返回从开始到第几个字符
字符串统计:
68.str_word_count(): 统计字符串含有的单词数
调用: mix str_word_count(str $str,[])
输入: 目标字符串
输出: 统计处的数量
69.strlen(): 统计字符串长度
函数原型: int strlen(str $str)
输入: 目标字符串
输出:整型长度
70.count_chars(): 统计字符串中所有字母出现次数(0..255)
调用: mixed count_chars ( string $string [, int $mode ] )
字符串编码:
71.md5(): 字符串md5编码
$str = "Hello";
echo md5($str);
数组函数
数组创建:
72.array(): 生成一个数组
$a=array("Dog","Cat","Horse");
print_r($a);
数组值或,键=>值一个数组型变量
73.array_combine(): 生成一个数组,用一个数组的值
作为键名,另一个数组值作为值
$a1=array("a","b","c","d");
$a2=array("Cat","Dog","Horse","Cow");
print_r(array_combine($a1,$a2));
输入参数: $a1为提供键,$a2提供值
输出: 合成后的数组
74.range(): 创建并返回一个包含指定范围的元素的数组。
$number = range(0,50,10);
print_r ($number);
输入: 0是最小值,50是最大值,10是步长
输出: 合成后的数组
75.compact(): 创建一个由参数所带变量组成的数组
$firstname = "Peter";
$lastname = "Griffin";
$age = "38";
$result = compact("firstname", "lastname", "age");
print_r($result);
变量或数组
返回由变量名为键,变量值为值的数组,变量也可以为多维数组.会递归处理
76.array_fill(): 用给定的填充(值生成)数组
$a=array_fill(2,3,"Dog");
print_r($a);
2是键,3是填充的数量,’Dog’为填充内容返回完成的数组
数组合并和拆分:
77.array_chunk(): 把一个数组分割为新的数组块
$a=array("a"=>"Cat","b"=>"Dog","c"=>"Horse","d"=>"Cow");
print_r(array_chunk($a,2));
一个数组分割后的多维数组,规定每个新数组包含2个元素
78.array_merge(): 把两个或多个数组合并为一个数组。
$a1=array("a"=>"Horse","b"=>"Dog");
$a2=array("c"=>"Cow","b"=>"Cat");
print_r(array_merge($a1,$a2));
输入: 两个数组
输出: 返回完成后的数组
79.array_slice(): 在数组中根据条件取出一段值,并返回。
$a=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
print_r(array_slice($a,1,2));
输入: 一个数组
输出: 1为从’Cat’开始,2为返回两个元素
数组比较:
80.array_diff(): 返回两个数组的差集数组
$a1=array(0=>"Cat",1=>"Dog",2=>"Horse");$a2=array(3=>"Horse",4=>"Dog",5=>"Fish");
print_r(array_diff($a1,$a2)); //返回'Cat'
输入: 两个或多个数组
输出: $a1与$a2的不同之处
81.array_intersect(): 返回两个或多个数组的交集数组
输出:
返回’Dog’和’Horse’, $a1与$a2的相同之处
数组查找替换:
82.array_search(): 在数组中查找一个值,返回一个键,没有返回返回假
$a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse");
echo array_search("Dog",$a);
输入: 一个数组
输出: 成功返回键名,失败返回false
83.array_splice(): 把数组中一部分删除用其他值替代
$a1=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
$a2=array(0=>"Tiger",1=>"Lion");
array_splice($a1,0,2,$a2);
print_r($a1);
输入: 一个或多个数组
输出: $a1被移除的部分由$a2补全
84.array_sum(): 返回数组中所有值的总和
$a=array(0=>"5",1=>"15",2=>"25");
echo array_sum($a);
输入: 一个数组
输出: 返回和
85.in_array(): 在数组中搜索给定的值,区分大小写
$people = array("Peter", "Joe", "Glenn", "Cleveland");
if (in_array("Glenn",$people) {
echo "Match found";
}
else{
echo "Match not found";
}
输入: 需要搜索的值|数组
输出: true/false
86.array_key_exists(): 判断某个数组中是否存在指定的 key
输入: 需要搜索的键名|数组
数组引用操作:
87.key(): 返回数组内部指针当前指向元素的键名
88.current(): 返回数组中的当前元素(单元).
89.next(): 把指向当前元素的指针移动到下一个元素的位置,并返回当前元素的值
90.prev(): 把指向当前元素的指针移动到上一个元素的位置,并返回当前元素的值
91.end(): 将数组内部指针指向最后一个元素,并返回该元素的值(如果成功)
92.reset(): 把数组的内部指针指向第一个元素,并返回这个元素的值
93.list(): 用数组中的元素为一组变量赋值
$my_array=array("Dog","Cat","Horse");
list($a, $b, $c) = $my_array;
输入: $a, $b, $c为需要赋值的变量
输出: 变量分别匹配数组中的值
94.array_shift(): 删除数组中的第一个元素,并返回被删除元素的值
$a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse");
echo array_shift($a);
print_r ($a);
95.array_unshift(): 在数组开头插入一个或多个元素
$a=array("a"=>"Cat","b"=>"Dog");
array_unshift($a,"Horse");
print_r($a);
96.array_push(): 向数组最后压入一个或多个元素
$a=array("Dog","Cat");
array_push($a,"Horse","Bird");
print_r($a);
输入: 目标数组|需要压入的值
返回值: 返回新的数组
97.array_pop(): 取得(删除)数组中的最后一个元素
$a=array("Dog","Cat","Horse");
array_pop($a);
print_r($a);
输入: $a为目标数组
输出: 返回数组剩余元素
数组键值操作:
98.shuffle(): 将数组打乱,保留键名
$my_array = array("a" => "Dog", "b" => "Cat");
shuffle($my_array);
print_r($my_array);
输入: 一个或多个数组
输出: 顺序打乱后的数组
99.count(): 计算数组中的单元数目或对象中的属性个数
$people = array("Peter", "Joe", "Glenn",
"Cleveland");
$result = count($people);
echo $result;
输入: 数组
输出: 输出元素个数
100.array_flip(): 返回一个键值反转后的数组
$a=array(0=>"Dog",1=>"Cat",2=>"Horse");
print_r(array_flip($a));
输出: 返回完成后的数组
101.array_keys(): 返回数组所有的键,组成一个数组
$a=array("a"=>"Horse","b"=>"Cat","c"=>"Dog");
print_r(array_keys($a));
输出: 返回由键名组成的数组
102.array_values(): 返回数组中所有值,组成一个数组
输出: 返回由键值组成的数组
103.array_reverse(): 返回一个元素顺序相反的数组
元素顺序相反的一个数组,键名和键值依然匹配
104.array_count_values(): 统计数组中所有的值出现的次数
$a=array("Cat","Dog","Horse","Dog");
print_r(array_count_values($a));
输出: 返回数组原键值为新键名,次数为新键值
105.array_rand(): 从数组中随机抽取一个或多个元素,注意是键名!!!
$a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse");
print_r(array_rand($a,1));
$a为目标数组, 1为抽取第几个元素的键名返回第1个元素的键名b
106.each(): 返回数组中当前的键/值对并将数组指针向前移动一步
调用array each ( array &$array )
在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()。
返回值:
数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为0,1,key和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
如果内部指针越过了数组的末端,则 each() 返回 FALSE。
107.array_unique(): 删除重复值,返回剩余数组
$a=array("a"=>"Cat","b"=>"Dog","c"=>"Cat");
print_r(array_unique($a));
输入: 数组
输入: 返回无重复值数组,键名不变
数组排序:
108.sort(): 按升序对给定数组的值排序,不保留键名
$my_array = array("a" => "Dog", "b" => "Cat", "c" => "Horse");
sort($my_array);
print_r($my_array);
输出: true/false
109.rsort(): 对数组逆向排序,不保留键名
110.asort(): 对数组排序,保持索引关系
111.arsort(): 对数组逆向排序,保持索引关
112.ksort(): 系按键名对数组排序
113.krsort(): 将数组按照键逆向排序
114.natsort(): 用自然顺序算法对数组中的元素排序
115.natcasesort(): 自然排序,不区分大小写
文件系统函数
116.fopen(): 打开文件或者 URL
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
调用: resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )
返回值: 如果打开失败,本函数返回 FALSE
117.fclose(): 关闭一个已打开的文件指针
$handle = fopen('somefile.txt', 'r');
fclose($handle);
bool fclose(resource handle)
输出: 如果成功则返回 TRUE,失败则返回 FALSE
文件属性
118.file_exists(): 检查文件或目录是否存在
$filename = '/path/to/foo.txt';
if (file_exists($filename)) {
echo "exists";
} else {
echo "does not exist";
}
调用: bool file_exists ( string filename )
输入: 指定的文件或目录
输出: 存在则返回 TRUE,否则返回 FALSE
119.filesize(): 取得文件大小
$filename = 'somefile.txt';echo $filename . ': ' . filesize($filename) .'bytes';
调用: int filesize ( string $filename )
输出: 返回文件大小的字节数,如果出错返回 FALSE 并生成一条 E_WARNING 级的错误
120.is_readable(): 判断给定文件是否可读
$filename = 'test.txt';
if (is_readable($filename)) {
echo '可读';
} else {
echo '不可读';
}
调用: bool is_readable ( string $filename )
输出: 如果由 filename指定的文件或目录存在并且可读则返回 TRUE
121.is_writable(): 判断给定文件是否可写
$filename = 'test.txt';
if (is_writable($filename)) {
echo '可写';
} else {
echo '不可写';
}
调用: bool is_writable ( string $filename )
filename 参数 可以是一个允许进行是否可写检查的目录名
输出:
如果文件存在并且可写则返回 TRUE。
122.is_executable(): 判断给定文件是否可执行
$file = 'setup.exe';
if (is_executable($file)) {
echo '可执行';
} else {
echo '不可执行';
}
调用: bool is_executable ( string $filename )
输出: 如果文件存在且可执行则返回 TRUE
123.filectime(): 获取文件的创建时间
$filename = 'somefile.txt';echo filectime($filename);
调用: int filectime ( string $filename )
输出: 时间以 Unix 时间戳的方式返回,如果出错则返回FALSE
124.filemtime(): 获取文件的修改时间
$filename = 'somefile.txt';echo filemtime($filename);
int filemtime ( string $filename )
输出: 返回文件上次被修改的时间,出错时返回 FALSE。时间以 Unix时间戳的方式返回
125.fileatime(): 获取文件的上次访问时间
$filename = 'somefile.txt';echo fileatime($filename);
调用: int fileatime (string $filename)
输出: 返回文件上次被访问的时间, 如果出错则返回FALSE. 时间以Unix时间戳的方式返回.
126.stat(): 获取文件大部分属性值
$filename = 'somefile.txt';
var_dump(fileatime($filename));
调用: array stat (string $filename
输出: 返回由 filename 指定的文件的统计信息
文件操作
127.fwrite(): 写入文件
$filename = 'test.txt';
$somecontent = "添加这些文字到文件\n";
$handle = fopen($filename, 'a');
fwrite($handle, $somecontent);
fclose($handle);
调用: int fwrite ( resource handle, string string [, int length] )
输出:
把 string 的内容写入 文件指针 handle 处。如果指定了 length,当写入了length个字节或者写完了string以后,写入就会停止, 视乎先碰到哪种情况
128.fputs(): 同上
129.fread(): 读取文件
$filename = "/usr/local/something.txt";$handle = fopen($filename, "r");$contents = fread($handle, filesize($filename));
fclose($handle);
调用: string fread ( int handle, int length )
从文件指针handle,读取最多 length 个字节
130.feof(): 检测文件指针是否到了文件结束的位置
$file = @fopen("no_such_file", "r");
while (!feof($file)) {
}
fclose($file);
调用: bool feof ( resource handle )
输出: 如果文件指针到了 EOF 或者出错时则返回TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE
131.fgets(): 从文件指针中读取一行
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
echo $buffer;
}
fclose($handle);
}
调用: string fgets ( int handle [, int length] )
输出: 从handle指向的文件中读取一行并返回长度最多为length-1字节的字符串.碰到换行符(包括在返回值中)、EOF 或者已经读取了length -1字节后停止(看先碰到那一种情况). 如果没有指定 length,则默认为1K, 或者说 1024 字节.
132.fgetc(): 从文件指针中读取字符
$fp = fopen('somefile.txt', 'r');
if (!$fp) {
echo 'Could not open file somefile.txt';
}
while (false !== ($char = fgetc($fp))) {
echo "$char\n";
}
输入: string fgetc ( resource $handle )
输出: 返回一个包含有一个字符的字符串,该字符从 handle指向的文件中得到. 碰到 EOF 则返回 FALSE.
133.file(): 把整个文件读入一个数组中
$lines = file('http://www.example.com/');
// 在数组中循环,显示 HTML 的源文件并加上行号。
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " .
htmlspecialchars($line) . "<br />\n";
}
// 另一个例子将 web 页面读入字符串。参见 file_get_contents()。
$html = implode('', file('http://www.example.com/'));
调用: array file ( string $filename [, int $use_include_path [, resource $context ]] )
输出: 数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败 file() 返回 FALSE
134.readfile(): 输出一个文件
调用: int readfile ( string $filename [, bool $use_include_path [, resource $context ]] )
输出: 读入一个文件并写入到输出缓冲。返回从文件中读入的字节数。如果出错返回 FALSE
135.file_get_contents(): 将整个文件读入一个字符串
echo file_get_contents('http://www.baidu.com');
调用:
string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )
136.file_put_contents():将一个字符串写入文件
file_put_contents('1.txt','aa');
调用: int file_put_contents ( string $filename , string $data [, int $flags [, resource $context ]] )
输出: 该函数将返回写入到文件内数据的字节数
137.ftell(): 返回文件指针读/写的位置
$fp=fopen('tx.txt','r');
fseek($fp,10);
echo ftell($fp);
fread($fp,4);
echo ftell($fp);
调用: int ftell ( resource $handle )
输出: 返回由 handle 指定的文件指针的位置,也就是文件流中的偏移量
138.fseek(): 在文件指针中定位
$fp=fopen('tx.txt','r');
fseek($fp,10);
echo ftell($fp);
fread($fp,4);
echo ftell($fp);
调用: int fseek ( resource $handle , int $offset [, int $whence ] )
输出: 成功则返回 0;否则返回 -1
139.rewind(): 倒回文件指针的位置
$fp=fopen('tx.txt','r');
fseek($fp,3);
echo ftell($fp);
fread($fp,4);
rewind($fp);
echo ftell($fp);
调用: bool rewind ( resource $handle )
返回值: 如果成功则返回 TRUE,失败则返回 FALSE
140.flock(): 轻便的执行文件锁定
$fp=fopen('tx.txt','r');
flock($fp, LOCK_SH);//共享锁
//flock($fp, LOCK_EX);//独立锁,写文件时用它打开
//flock($fp, LOCK_NB);//附加锁
flock($fp, LOCK_UN);//释放锁
fclose($fp);
调用: bool flock ( int $handle , int $operation [, int &$wouldblock ] )
输出: 如果成功则返回 TRUE,失败则返回 FALSE
目录
141.basename(): 返回路径中的文件名部分
path = "/home/httpd/html/index.php";
$file = basename($path);
$file = basename($path,".php");
调用: string basename ( string $path [, string $suffix ])
输出: 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。如果文件名是以 suffix 结
束的,那这一部分也会被去掉
142.dirname(): 返回路径中的目录部分
$path = "/etc/passwd";
$file = dirname($path);
调用: string dirname ( string $path )
输出: 给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名
143.pathinfo(): 返回文件路径的信息
echo '<pre>';
print_r(pathinfo("/www/htdocs/index.html"));
echo '</pre>';
调用: mixed pathinfo ( string $path [, int $options ] )
返回一个关联数组包含有 path 的信息
144.opendir(): 打开目录句柄
$fp=opendir('E:/xampp/htdocs/php/study/19');echo readdir($fp);
closedir($fp);
调用: resource opendir ( string $path [, resource $context ] )
返回值: 如果成功则返回目录句柄的 resource,失败则返回FALSE
145.readdir(): 从目录句柄中读取条目
$fp=opendir('E:/xampp/htdocs/php/study/19');echo readdir($fp);
closedir($fp);
调用: string readdir ( resource $dir_handle )
返回值: 返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回
146.closedir(): 关闭目录句柄
$fp=opendir('E:/xampp/htdocs/php/study/19');
echo readdir($fp);
closedir($fp);
调用: void closedir ( resource $dir_handle )
关闭由 dir_handle 指定的目录流。流必须之前被opendir() 所打开
147.rewinddir() : 倒回目录句柄
$fp=opendir('E:/xampp/htdocs/php/study/19');
echo readdir($fp).'<br />';
echo readdir($fp).'<br />';
echo readdir($fp).'<br />';
rewinddir($fp);
echo readdir($fp).'<br />';
closedir($fp);
调用: void rewinddir ( resource $dir_handle )
输出: 将 dir_handle 指定的目录流重置到目录的开头
148.mkdir(): 新建目录
mkdir('123');
调用: bool mkdir ( string $pathname [, int $mode [, bool $recursive [, resource $context ]]] )
输出: 尝试新建一个由 pathname 指定的目录
149.rmdir(): 删除目录
rmdir('123');
调用: bool rmdir ( string $dirname )
输出: 尝试删除 dirname 所指定的目录。目录必须是空的,而且要有相应的权限。如果成功则返回TRUE,失败则返回 FALSE
150.unlink(): 删除文件
unlink('123/1.txt');
rmdir('123');
调用: bool unlink ( string $filename )
输出: 删除 filename 。和 Unix C 的 unlink() 函数相似。如果成功则返回 TRUE,失败则返回 FALSE
151.copy(): 拷贝文件
copy('index.php','index.php.bak');
调用: bool copy ( string $source , string $dest )
输出: 将文件从 source 拷贝到 dest. 如果成功则返回TRUE,失败则返回 FALSE
152.rename(): 重命名一个文件或目录
rename('tx.txt','txt.txt');
调用: bool rename ( string $oldname , string $newname [, resource $context ] )
输出: 如果成功则返回 TRUE,失败则返回 FALSE
文件的上传与下载
153.is_uploaded_file():判断文件是否是通过 HTTP POST上传的
if(is_uploaded_file($_FILES['bus']['tmp_name'])){
if( move_uploaded_file($_FILES['bus']['tmp_name'],
$NewPath) ){
echo '上传成功<br /><img src="'.$NewPath.'">';
}else{
exit('失败');
}
}else{
exit('不是上传文件');
}
调用: bool is_uploaded_file ( string $filename )
154.move_uploaded_file(): 将上传的文件移动到新位置
if(is_uploaded_file($_FILES['bus']['tmp_name'])){
if( move_uploaded_file($_FILES['bus']['tmp_name'],
$NewPath) ){
echo '上传成功<br /><img src="'.$NewPath.'">';
}else{
exit('失败');
}
}else{
exit('不是上传文件');
}
调用: bool move_uploaded_file ( string $filename , string
时间函数
155.time(): 返回当前的 Unix 时间戳time();
调用: int time ( void )
输出: 返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数
156.mktime(): 取得一个日期的 Unix 时间戳
mktime(0, 0, 0, 4, 25, 2012);
调用: int mktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )
156.date(): 格式化一个本地时间/日期
date('Y年m月d日 H:i:s');
调用: string date ( string $format [, int $timestamp ] )
输出: 2016年09月10日 20:45:54
157.checkdate(): 验证一个格里高里日期
调用: bool checkdate ( int $month , int $day , int $year)
输出: 如果给出的日期有效则返回 TRUE,否则返回 FALSE
if(checkdate(6,31,2012)){
echo '成立';
}else{
echo '不成立';
}
158.date_default_timezone_set(): 设定用于一个脚本中所有日期时间函数的默认时区
date_default_timezone_set('PRC');
调用: bool date_default_timezone_set ( string $timezone_identifier)
返回值: 如果 timezone_identifier 参数无效则返回 FALSE,否则返回 TRUE。
159.getdate(): 取得日期/时间信息
调用: array getdate ([ int $timestamp ] )
输出: 返回一个根据timestamp得出的包含有日期信息的关联数组。如果没有给出时间戳则认为是当前本地时间
$t=getdate();
var_dump($t);
160.strtotime(): 将任何英文文本的日期时间描述解析为 Unix 时间戳
echo strtotime("now");
int strtotime ( string $time [, int $now ] )
echo strtotime("10 September 2000");
echo strtotime("+1 day");
echo strtotime("+1 week");
echo strtotime("+1 week 2 days 4 hours 2 seconds");
echo strtotime("next Thursday");
echo strtotime("last Monday");
161.microtime(): 返回当前 Unix 时间戳和微秒数
调用: mixed microtime ([ bool $get_as_float ] )
$start=microtime(true);
sleep(3);
$stop=microtime(true);
echo $stop-$start;
其他常用:
162.intval(): 获取变量的整数值
调用: int intval ( mixed $var [, int $base = 10 ] )
通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
var: 要转换成 integer 的数量值
base: 转化所使用的进制
返回值: 成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
163.sprintf(): 函数把格式化的字符串写入一个变量中。
语法
sprintf(format,arg1,arg2,arg++)
参数 描述
format 必需。转换格式。
arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
arg++ 可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。
说明
参数 format 是转换的格式,以百分比符号 (“%”) 开始到转换字符结束。下面的可能的 format 值:
%% - 返回百分比符号
%b - 二进制数
%c - 依照 ASCII 值的字符
%d - 带符号十进制数
%e - 可续计数法(比如 1.5e+3)
%u - 无符号十进制数
%f - 浮点数(local settings aware)
%F - 浮点数(not local settings aware)
%o - 八进制数
%s - 字符串
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)
arg1, arg2, ++ 等参数将插入到主字符串中的百分号 (%) 符号处。该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
提示和注释
注释:如果 % 符号多于 arg 参数,则您必须使用占位符。占位符插到 % 符号后面,由数字和 “$” 组成。请参见例子 3。
提示:相关函数:fprintf()、printf()、vfprintf()、vprintf() 以及 vsprintf()。
例子
例子 1
<?php$str = "Hello";$number = 123;$txt = sprintf("%s world. Day number %u",$str,$number);echo $txt;?>
输出:
Hello world. Day number 123
164.PDO类的相关函数
prepare()
execute()
fetch()
<?php$driver = 'mysql';$database = "dbname=CODINGGROUND";$dsn = "$driver:host=localhost;unix_socket=/home/cg/mysql/mysql.sock;$database";
$username = 'root';$password = 'root';
try {
$conn = new PDO($dsn, $username, $password);
echo "<h2>Database CODINGGROUND Connected<h2>";
}catch(PDOException $e){
echo "<h1>" . $e->getMessage() . "</h1>";
}$sql = 'SELECT * FROM users';$stmt = $conn->prepare($sql);$stmt->execute();
echo "<table style='width:100%'>";while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
echo "<tr>";
foreach($row as $value)
{
echo sprintf("<td>%s</td>", $value);
}
echo "</tr>";
}echo "</table>";?>
165.isset(): 检测变量是否设置。
原型格式: bool isset ( mixed var [, mixed var [, ...]] )
返回值:
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”“)并不等同于 PHP 的 NULL 常数。
$userInfo=’abc’;if(isset($userInfo['account'])) {$account=$userInfo['account'];
} else {$account=$userInfo;
}
166.unset(): 销毁指定的变量。
函数原型: unset(var1,var2,...)
参数 描述
var1 要销毁的变量1
var2 要销毁的变量2
<?php
$foo = 'php unset()';
unset ($foo);
echo $foo;?>
167.preg_replace_callback: 执行一个正则表达式搜索并且使用一个回调进行替换.
原型:
mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )
这个函数的行为除了 可以指定一个 callback 替代 replacement 进行替换 字符串的计算,其他方面等同于 preg_replace()。
pattern: 要搜索的模式,可以使字符串或一个字符串数组。
callback: 一个回调函数,在每次需要替换时调用,调用时函数得到的参数是从subject 中匹配到的结果。回调函数返回真正参与替换的字符串。这是该回调函数的签名:
string handler ( array $matches )
你可能经常会需要callback函数而仅用于preg_replace_callback()一个地方的调用。在这种情况下,你可以 使用匿名函数来定义一个匿名函数作为preg_replace_callback()调用时的回调。 这样做你可以保留所有 调用信息在同一个位置并且不会因为一个不在任何其他地方使用的回调函数名称而污染函数名称空间。
subject: 要搜索替换的目标字符串或字符串数组。
limit: 对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
count: 如果指定,这个变量将被填充为替换执行的次数。
<?php/* 一个unix样式的命令行过滤器,用于将段落开始部分的大写字母转换为小写。 */$fp = fopen("php://stdin", "r") or die("can't read stdin");while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
function ($matches) {
return strtolower($matches[0]);
},
$line
);
echo $line;
}
fclose($fp);?>
返回值:
如果subject是一个数组, preg_replace_callback()返回一个数组,其他情况返回字符串。 错误发生时返回 NULL。
如果查找到了匹配,返回替换后的目标字符串(或字符串数组), 其他情况subject 将会无变化返回。
168.json_encode(): 对变量进行 JSON 编码
函数原型: json_encode(value,option)
参数 描述
value 必填。待编码的 value ,除了resource 类型之外,可以为任何数据类型。该函数只能接受 UTF-8 编码的数据
options 可选。
JSON_HEX_QUOT 把双引号转为\u0022(php 5.3)
JSON_HEX_TAG 把< > 转为 \u003C 和 \u003E(php 5.3)
JSON_HEX_AMP 把 & 转为 \u0026(php 5.3)
JSON_HEX_APOS 把单引号转为 \u0027.(php 5.3)
JSON_NUMERIC_CHECK 把数字字符串当作数字编码(php 5.3)
JSON_PRETTY_PRINT 使用空格格式化数据(php 5.4)
JSON_UNESCAPED_SLASHES 不忽略 /(php 5.4)
JSON_FORCE_OBJECT 使用非关联数组时输出一个对象而不是一个数组(php 5.3)
JSON_UNESCAPED_UNICODE 逐字编译多字节字符(php 5.4)
<?php$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);echo json_encode($arr);?>
以上例程会输出:
{"a":1,"b":2,"c":3,"d":4,"e":5}
169.iconv(): 用于按规定的字符编码转换字符串。mb_convert_encoding() 函数也可以转换编码。
如果发现中文输出乱码的时候,很可能就需要使用此函数做处理。
函数原型: iconv(in_charset ,out_charset ,str )
参数 描述
in_charset 输入的字符集。
out_charset 输出的字符集。如果你在 out_charset 后添加了字符串 //TRANSLIT,将启用转写(transliteration)功能。这个意思是,当一个字符不能被目标字符集所表示时,它可以通过一个或多个形似的字符来近似表达。 如果你添加了字符串 //IGNORE,不能以目标字符集表达的字符将被默默丢弃。 否则,str 从第一个无效字符开始截断并导致一个 E_NOTICE。
str 要转换的字符串。
<?php$text = "This is the Euro symbol '€'.";echo 'Original : ', $text, PHP_EOL;echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;echo 'IGNORE : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;echo 'Plain : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;?>
输出:
Original : This is the Euro symbol '€'.
TRANSLIT : This is the Euro symbol 'EUR'.
IGNORE : This is the Euro symbol ''.
Plain :
Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7
This is the Euro symbol '
170.exec(): 不输出结果,返回最后一行执行结果,所有结果可以保存到一个返回的数组里面。
函数原型:
exec(command,output,return_var)
参数 描述
command 必需。要执行的命令
output 可选。一个包含每行命令执行结果的数组
return_var 可选。获得命令执行的状态码
注意:dir命令适应windows系统,linux系统请使用ls命令。
<?php$l = exec("dir",$out,$stat);
print_r($l);
print_r($out);
print_r($stat);?>
171.system(): 调用命令,输出并返回最后一个执行结果。
函数原型: system(command,return_var)
参数 描述
command 必需。要执行的命令
return_var 可选。得到命令执行后的状态码
<?php$l = system("dir",$arr);
print_r($arr);
print_r($l);?>
172.serialize():作用是序列化对象、数组成一个字符串。
比如存储数组到memcache就会被序列化。使用 unserialize() 可以还原数组。
语法
serialize(param)
参数 描述
param 必需。对象或数组。
<?php$arr = array('a','b','c','serialize','怎么用');echo serialize($arr),'<br/>';// 还原序列化的数据
print_r(unserialize(serialize($arr)));?>
输出:
a:5:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";i:3;s:9:"serialize";i:4;s:9:"怎么用";}Array ( [0] => a [1] => b [2] => c [3] => serialize [4] => 怎么用 )
173.php_check_syntax
这个函数可以用来检查特定文件中的PHP语法是否正确。
使用方法:
<?php$error_message = "";$filename = "./php_script.php";if(!php_check_syntax($filename, &$error_message)) {
echo "Errors were found in the file $filename: $error_message";
} else {
echo "The file $filename contained no syntax errors";
}?>
174.highlight_string
当你想要把PHP代码显示到页面上时,highlight_string()函数就会非常有用,它可以用内置定义的语法高亮颜色把你提供的PHP代码高亮显示。这个函数有两个参数,第一个参数是要被突出显示的字符串。第二个参数如果设置成TRUE,就会把高亮后的代码返回。
使用方法:
<?php
highlight_string(' <?php phpinfo(); ?>');?>
175.show_source
这个函数的运行和highlight_file()相似,它可以显示PHP语法高亮后的文件,并且是根据HTML标签进行语法高亮的。
使用方法:
<?php
show_source("php_script.php");?>
176.php_strip_whitespace
这个函数跟上面的show_source()函数相似,但它会删除文件里的注释和空格符。
使用方法:
<?phpecho php_strip_whitespace("php_script.php");?>
177.halt_compiler
它可以中止编译器的执行,这对于在PHP脚本中嵌入数据是很有帮助的,就像安装文件一样。
使用方法:
<?php$fp = fopen(__FILE__, 'r');
fseek($fp, __COMPILER_HALT_OFFSET__);
var_dump(stream_get_contents($fp));// the end of the script execution__halt_compiler();
?>
178.highlight_file
这是一个非常有用的PHP函数,它能返回指定的PHP文件,并按照语法高亮突出显示文件内容。
使用方法:
<?php
highlight_file("php_script.php");?>
179.ignore_user_abort
利用这个函数,用户可以拒绝浏览器端终止执行脚本的请求。正常情况下客户端的退出会导致服务器端脚本的停止运行。
使用方法:
<?php
ignore_user_abort();?>
180.str_word_count
这个函数可以用来统计字符串中单词的数量。
使用方法:
<?phpecho str_word_count("Hello How Are You!");?>
181.get_defined_vars
这个函数在代码调试时十分重要,它会返回一个包括所有已定义的变量的多维数组。
使用方法:
<?php
print_r(get_defined_vars());?>
182.get_browser
这个函数检查并读取browscap.ini文件,返回浏览器兼容信息。
使用方法:
<?phpecho $_SERVER['HTTP_USER_AGENT'];$browser = get_browser();print_r($browser);?>
正则表达式-元字符
元字符及其匹配范围
\d 匹配任意一个十进制数字,等价于: [0-9]
\D 匹配除十进制数字以外的任意数字,等价于: [^0-9]
\s:匹配空白字符,等价于: [\n\f\r\t\v]
\S: 匹配除空白字符以外的任意一个字符, 等价于[^\n\f\r\t\v]
\w 匹配任意一个数字、字母和下划线,等价于: [0-9a-zA-Z_]
\W 匹配除字母、数字和下划线以外的任意字符, 等价于: [^0-9a-zA-Z_]
[] 1)用来表示范围。2)匹配任意一个中括号中定义的原子
[^]: 中括号里面的^(抑扬符):表示匹配任意一个除中括号里面定义的原子
限定次数
* 匹配0次、1次或多次其前的原子, 等价于: {0,}
+ 匹配1次或多次其前的原子, 等价于: {1,}
? 匹配0次或1次其前的原子, 等价于: {0,1}
{n} 表示其前的原子正好出现n次, 等价于: {n,}
表示其前的原子至少出现n次,最多不限制
{m,n} 表示其前的原子最少出现m次,最多出现n次
其它
. 匹配除换行符(\n)以外的任意字符【windows下还匹配\f\r】
| 两个或多个分支选择【优先级最低】
^ 匹配输入字符的开始位置
$ 匹配输入字符的结束位置
\b 匹配词边界
\B 匹配非词边界
() 1)模式单元,把多个小原子组成一个大原子。2)可以改变优先级
PHP文件系统
我们回电鼠标右键删除文件、会control_c(或右键)赋值、粘贴文件,会新建一些文件,检测这个文件是不是只读文件,在电脑里面进行的这些操作,在代码里面如果能操作就好了。
- fopen、fread、fclose操作读取文件
readfile读取文件
int readfile (string $文件名) 功能:传入一个文件路径,输出一个文件。
<?php
//linux类的读取方式
readfile("/home/paul/test.txt");
//windows类的读取方式
readfile("d:\\5-4.cpp");
上面的代码中windows的斜线是\斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。
file_get_contents打开文件
<?php
$filename='5-4.cpp';
$filestring=file_get_contents($filename);
echo $filestring;
fopen,fread,fclose操作读取文件
上面file_get_contens打开文件的方式简单、粗暴。下面的
resource fopen (string $文件名,string 模式)
string fread (resource $操作资源,int 读取长度)
bool fclose (resource $操作资源)
fopen的模式有下面几个,我们来讲一下fopen的模式:
模式 | 说明 |
r | 只读方式打开,将文件指针指向文件头 |
r+ | 读写方式打开,将文件指针指向文件头 |
w | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
w+ | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
a | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建 |
a+ | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建 |
x | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建 |
x+ | 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建 |
<?php
//创建一个123.txt,以只读模式打开
$fp=fopen('123.txt',"r");
//var_dump()操作一下$fp看看效果,输出的是不是只读类型提示的是resource
var_dump($fp);
- php创建和修改文件内容
file_put_contents写入文件
Int file_put_contens(string $文件路径,string $写入数据)
功能:向指定的文件中写入一个字符串,如果文件不存在则创建文件。返回的是写入的自己长度。
<?php
$data='在PHP中文网学好PHP,妹子票子不在话下!';
$numbytes=file_put_contents('binggete.txt',$data);
if($numbytes){
echo '成功写入,读取结果:';
echo file_get_contents('binggete.txt');
}
else{
echo '写入失败或没有权限,注意检查';
}
fwrite配合fopen进行写入操作
<?php
$filename='test.txt';
$fp=fopen($filename,"w");
$len=fwrite($fp,'我是一只来自北方的狼,却在南方冻成了狗');
fclose($fp);
print $len.'字节被写入了\n';
总结:
- 不论有没有新建都会打开文件重新写入
- 原有文件内容会被覆盖掉
- 文件不存在会创建
模式 | 说明 |
r | 只能读不能使用fwrite写 |
r+ | 可操作读、写 |
w | 只可以写功能 |
w+ | 即可读又可以写 |
x | 每次写入会干掉原有文件的内容,文件不存在会创建 |
a | 每次写入都会向文件的尾端追加内容 |
注:a+是增强的追加功能。可以读取时也可以使用。
- php创建临时文件
<?php
//创建了一个临时文件
$handle=tmpfile();
//向里面写入了数据
$numbytes=fwrite($handle,'写入临时文件');
//关闭临时文件,文件即被删除
fclose($handle);
echo '向临时文件中写入了'.$numbytes.'个字节';
- PHP移动、拷贝和删除文件
重命名文件
bool rename($旧名,$新名);
这个函数返回一个bool值,将旧的名字改为新的名字。
<?php
//旧文件名
$filename='test.txt';
//新文件名
$filename2=$filename.'.old';
//复制文件
rename($filename,$filename2);
复制文件
bool copy(源文件,目标文件)
功能:将指定路径的文件,复制一份到目标文件的位置。
<?php
//旧文件名
$filename='copy.txt';
//新文件名
$filename2=$filename.'_new';
//修改名字
copy($filename,$filename2);
?>
删除文件
bool unlink(指定路径的文件)
<?php
$filename='copy.txt';
if(unlink($filename)){
echo "删除文件成功 $filename!\n";
}
else{
echo "删除 $filename 失败!\n";
}
- 检测文件属性函数
我们假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在。
<?php
if (file_exists('install.lock')){
echo '已安装,请不要再次进行安装';
exit;
}
常用文件属性函数
file_exists($指定文件名或者文件路径)
功能:文件是否存在。
is_readable ($指定文件名或者文件路径)
功能:文件是否可读
is_writeable($指定文件名或者文件路径)
功能:文件是否可写
is_executable($指定文件名或者文件路径)
功能:文件是否可执行
is_file($指定文件名或者文件路径)
功能:是否是文件
- php目录处理函数
- 读取某个路径的时候判断是否是文件夹
- 是文件夹的话,打开指定文件夹,返回文件目录的资源变量
- 使用readdir读取一次目录中的文件,目录指针向后偏移一次
- 使用readdir读取到最后,没有可读的文件返回false
- 关闭文件目录
函数名 | 功能 |
opendir | 打开文件夹,返回操作资源 |
readdir | 读取文件夹资源 |
is_dir | 判断是否是文件夹 |
closedir | 关闭文件夹操作资源 |
filetype | 显示是文件夹还是文件,文件显示file,文件夹显示dir |
<?php
//设置打开的目录是D盘
$dir="d:/";
//判断是否是文件夹,是文件夹
if(is_dir($dir)){
if ($dh=opendir($dir)){
//读取到最后返回false,停止循环
while(($file=readdir($dh))!==false){
echo "文件名为:$file :文件的类型是:";
}
closedir($dh);
}
}
- php文件权限设置
chmod主要是修改文件的权限
<?php
//修改linux系统/var/wwwroot/某文件权限为 755
chmod("/var/wwwroot/index.html",755);
chmod("/var/wwwroot/index.html","u_rwx,go+rx");
chmod("somedir/somefile",0755);
- php文件路径函数
常用路径处理函数
pathinfo | 返回文件的各个组成部分 |
basename | 返回文件名 |
dirname | 文件目录部分 |
parse_url | 网址拆解成各部分 |
http_build_query | 生成url中的query字符串 |
http_build_url | 生成一个url |
- php实现文件留言本
index.php ----展示输入框和留言内容
write.php ----向message.txt写入数据
message.txt----存入聊天内容
PHP文件上传
配置项 | 功能说明 |
file_uploads | on为开启文件上传功能,off为关闭 |
upload_max_filesize | 系统允许的上传文件的最大值 |
post_max_size | 系统允许的POST传参的最大值 |
memory_limit | 内存使用限制 |
建议尺寸:file_size(文件大小)<upload_max_filesize<post_max_size<memory_limit>>>
另外,需要注意的是脚本执行时间。
max_execution_time,这参数的单位为秒
这个参数是设定脚本的最大执行时间。
在判断后缀和MIME类型的时候,我们会用到PHP的一个函数in_array(),该函数传入两个参数。
第一个参数是要判断的值;
第二个参数是范围数组。
我们用这个函数来判断文件的后缀名和mime类型是否在允许的范围内。
生成文件名
我们的文件上传成功了,不会让他保留原名。因为,有些人在原名中有敏感关键词会违反我国的相关法律法规。我们可以采用date()、mt_rand()或者unique()生成随机的文件名。
PHP错误处理之错误报告级别
E_ERROR | 错误,文件直接中断 |
E_WARNING | 警告,问题比较严重。但是还会继续向下运行 |
E_NOTICE | 提示,有些小问题不会影响到程序。常发生在项目未定义 |
E_PARSE | 编译时语法解析错误。解析错误仅仅由分析器产生。 |
E_ALL | 所有的错误。 |
E_STRICT | 启用PHP对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。 |
E_DEPRECATED | 启用后将会对在未来版本中可能无法正常工作的代码给出警告。 |
MYSQL数据库
数据库服务器
数据库
数据表
数据字段
数据库服务器:是指用类似运行数据库服务的一台电脑。在中小型企业通常为一台。在数据存储量计算量很大的时候可以存在多台。多台数据库服务器共同来存储或计算。由于数据安全非常重要,我们经常会对数据库服务器里面的数据进行备份。
数据库:一个数据库服务器里面可以有很多数据库。主要用来分类使用。我们可以建立交通信息数据库、游戏数据库、酒店开房数据库。。。主要用来将各个不同用途的数据,按照业务大块的划分。
数据表:例如在游戏数据库中,根据这一款游戏又分为了不同的数据表。专门用来区分游戏不同的数据。例如:用户数据(用户、密码);人物数据;所有装备和装备信息;用户的充值信息;药品、魔力药水信息等等。
数据字段:也叫数据列。就是我们日常所见表格里面的列。在表格中,我们会将一张用户表分成多个列。用户编号、用户名、性别、年龄是字段。在真正的数据库中数据字段需要换成英文:id、username、sex、age。
数据行:真正的数据存在每一个表的行里面。字段(列)划分出来了一个表应该按照什么样的格式存数据,而行是真正的数据。每一行需要遵循数据字段(列)的规范和要求进行存储数据。
Mysql连接数据库
方法一
安装后,可以在菜单的列表中找到MySQL Command Line点击操作的命令行终端操作。
方法二
如果加入了windows的环境变量中,可以在命令行下直接操作。
在命令行下,通过以下命令可以连接到数据库服务器。
mysql -h localhost -u root -p
上面的命令中,mysql表示数据库启动工具。
参数 | 说明 |
-h | 表示数据库连接地址,连接本机可不填 |
-u | 表示要登录的用户 |
-p | 表示使用密码登录 |
Mysql数据库操作
- 创建数据库
类别 | 详细解释 |
基本语法 | CREATE DATABASE 数据库名 |
示例 | CREATE DATABASE PHP |
示例说明 :创建一个数据库,名字为PHP
示例:
mysql>CREATE DATABASE PHP;
Query OK,1 row affected(0.00 sec)
“Query OK”表示上面的命令执行成功,所有的DDL和DML(不包括SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了;“1 row affected”表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。
- 查看数据库
基本语法 show dataabses
示例说明 显示当前服务器的所有数据库
注意:
show是指显示
database是指数据库
databases是数据库的复数形式,指全部数据库。
- 选中数据库
基本语法 use 库名
示例 use PHP
示例说明 使用数据库PHP
注意:
use 是指使用
库名 是存在当前数据库系统中的具体的数据库的名称;
示例:
mysql>use PHP;
Database changed
- 删除数据库
基本语法 DROP DATABASE 库名
示例 DROP DATABASE PHP
示例说明 删除一个数据库,名字叫做PHP
注意:
Drop 是汉语可以翻译为指掉下来,不要了的意思
Database 是指库
库名 是指要删除的库的名称
示例:
mysql> drop database php;
Query OK, 0 rows affected (0.01 sec)
切记:数据库删除后,下面的所有数据都会全部删除,所以删除前一定要慎重并做好相应的备份。
Mysql数据表操作
- 创建表
基本语法 CREATE TABLE 表名(字段名1 字段类型,......字段名n 字段类型n);
示例 CTREATE TABLE user(username varchar(20),password varchar(32));
示例说明 创建一个表名叫user的表,第一个字段为username、表的字段类型为varchar长度为32个长度。第二个字段为password,类型也为varchar,长度也为32个长度。
注释:
int代表整型。float代表浮点。char和varchar代表字符串即可。
mysql> create database php;
Query OK, 1 row affected (0.00 sec)
mysql> use php;
Database changed
mysql> CREATE TABLE emp(
-> ename varchar(10),
-> hiredate date,
-> sal float(10,2),
-> deptno int(2)
-> );
Query OK, 0 rows affected (0.01 sec)
- 查看表字段结构信息
基本语法 desc 表名
示例 desc emp
示例说明 查看emp表的表结构
上面表的创建SQL语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)。等信息。“G”选项的含义是使得记录能够按照字段竖着排列,对于内容比较长的记录更易于显示。
- 删除表
基本语法 DROP TABLE 表名
示例 DROP TABLE emp
示例说明 删除表 emp
注:删除表。表和数据均会丢失,请勿必删除重要表之前备份数据。
- 指定表引擎和字符集
在创建表最后,我们常用MyISAM或者InnoDB引擎。在指定引擎时,我们可以使用:ENGINE=InnoDB
指定表默认字符集:
DEFAULT CHARSET=utf8
效果如下:
CREATE TABLE emp(
username varchar(10) DEFAULT NULL,
password date DEFAULT NULL,
)ENGINE=InnoDB DEFAULT CHASET=utf8;
Mysql数据字段操作
- 修改字段类型modify
基本语法 alter table 表名 modify 字段名 varchar(20);
示例 alter table user modify username varchar(20);
示例说明 将user表的username的类型改为varchar(20)
- 增加表字段
基本语法 alter table 表名 add column 字段名 类型
示例 alter table user add column age int(3);
示例说明 添加一个字段为age,类型为整型长度为3
- 增加字段时控制字段顺序
基本语法 ALTER TABLE 表名 ADD 字段名 字段类型 AFTER 字段名;
示例 ALTER TABLE user ADD email VARCHAR(60) AFTER createip;
示例说明 user表中,在ceateip后增加一个字段为email,类型为varchar,长度为60
示例 ALTER TABLE emp ADD id int(10) FIRST;
示例说明 user表中在最开始的位置增加一个字段为id,类型为int,长度为10
- 删除表字段
基本语法 alter table 表名drop column 字段名;
示例 alter table user drop column age;
示例说明 在user表中删除字段age
- 表字段改名
基本语法 alter table 表名 change 字段原名 字段新名 字段类型;
示例 alter table user change email em varchar(60);
示例说明 在user表中将字段中的email字段名字改为em
- 修改表字段排列顺序
在前面的字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项first|after.
使用modify调整顺序
修改表名
Mysql数据类型
Mysql中存的是数据。只要是数据,我们就会规定数据的类型。在表的字段中规定了使用的是某个数据类型。那么,在插入的数据中就要使用对应的数据类型。并且,遵守数据类型的长度要求。
整型
MYSQL数据类型 | 所占字节 | 值范围 |
tinyint | 1字节 | -128~127 |
smallint | 2字节 | -32768~32767 |
mediumint | 3字节 | -8388608~8388607 |
int | 4字节 | 范围-2147483648~2147483647 |
bingint | 8字节 | +-9.22*10的18次方 |
整型的长度不同,在实际使用过程中也就不同。
浮点类型
MYSQL数据类型 | 所占字节 | 值范围 |
float(m,d) | 4字节 | 单精度浮点类型,m总个数,d小数位 |
double(m,d) | 8字节 | 双精度浮点类型,m总个数,d小数位 |
decimal(m,d) |
| decimal是存储为字符串的浮点数 |
字符类型
MYSQL数据类型 | 所占字节 | 值范围 |
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-255字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过255个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 超文本字符串 |
BLOB | 0-65535字节 | 二进制形式的长文本数据 |
TEXT | 0-65535字节 | 长文本数据 |
MEDIUMBLOB | 0-16777215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16777215字节 | 中等长度文本数据 |
LONGBLOB | 0-4294967295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4294967295字节 | 极大文本数据 |
VARBINARY(M) | 允许长度0-M个字节的定长字节符 | 值的长度+1个字节 |
BINARY(M) | M | 允许长度0-M个字节的定长字节符串 |
时间类型
MYSQL数据类型 | 所占字节 | 值范围 |
date | 3字节 | 日期,格式:2021-03-12 |
time | 3字节 | 时间,格式:23:35:42 |
datetime | 8字节 | 日期时间,格式:2021-03-12 23:35:42 |
timestamp | 4字节 | 自动存储记录修改的时间 |
year | 1字节 | 年份 |
复合类型
MYSQL数据类型 | 说明 | 举例 |
set | 集合类型 | set(“member”,”member2”,...”member64”) |
enum | 枚举类型 | enum(“member”,”member2”,...”member65535”) |
一个enum类型只允许从一个集合中取得一个值,而set类型允许从一个集合中取得任意多个值。
MYSQL字符集
英文字符集:
字符集 | 说明 | 字节长度 |
ASCII | 美国标准信息交换代码 | 单字节 |
GBK | 汉字内码扩展规范 | 双字节 |
unicode | 万国码 | 4字节 |
UTF-8 | Unicode的可变长度字符编码 | 1到6个字节 |
实际工作中要使用的编码
gbk_chinese_ci 简体中文,不区分大小写
utf+general_ci Unicode(多语言),不区分大小写
注意:mysql在写utf-8的时候写的是utf8,不加中间的中横线。
MYSQL索引
- MySQL的索引类型
普通索引:最基本的索引,他没有任何限制
唯一索引:某一行启动了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都有要求是唯一的。
主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码。
全文索引:对于需求全局搜索的数据,进行全文索引。
普通索引
基本语法 alter table 表 add index(字段)
示例 alter table user add index(username);
示例解释 为user表的username字段增加索引
唯一索引
类型 详细说明
基本语法 alter table 表 add UNIQUE(字段)
示例 alter table user add UNIQUE(email);
示例解释 为user表的email字段增加唯一索引
全文索引
基本语法 alter table 表 add FULLTEXT(字段)
示例 alter table user add FULLTEXT(content);
示例解释 为user表的content字段增加唯一索引
主键索引
基本语法 alter table 表 add PRIMARY KEY(字段)
示例 alter table user add PRIMARY KEY(id);
示例解释 为user表的id指定增加主键索引
创建表时也可以声明索引
创建表时可在创建表语句后加上对应的类型即可声明索引:
PRIMARY KEY(字段)
INDEX[索引名](字段)
FULLTEXT[索引名](字段)
UNIQUE[索引名](字段)
增删改查之插入记录
- 插入记录有两种基本语法
插入基本语法一
基本语法 insert into 表 values(值1,值2,值n);
示例 INSERT INTO user values(2,’php中文网’,’男’)
示例说明 向user表中插入值id为2,姓名为php中文网,性别为男
插入基本语法二
基本语法 insert into 表(字段1,字段2,字段n) values(值1,值2,值n);
示例 insert into user(id,username,sex) values(213,’小沈阳’,1);
示例说明 向user表中插入id为213,username为小沈阳,性别为1
说明:
基本语法1与基本语法2的区别是:
基本语法1的插入语句,表中有多少个字段就必须要插入多少个值。一个不能多,一个不能少。若有默认值,不想传,可以写上null。
基本语法2中,除非有必填字段必须要写入值外。如果有默认值的不想写可以忽略不写。mysql会自动补主默认值。
- 基础查询
创建表语句如下:
基本语法 select * from 表;
示例 select *from money;
示例说明 查询money表中所有字段中的所有结果
注:“*”是一种正则表达式的写法,表示匹配所有,上面查询语句和下面的等价。
- 查询单字段不重复记录distinct
基本语法 select distinct 字段 from 表;
示例 select distinct age deptno from money;
示例说明 查询money表中年龄唯一的所有结果
- 条件查询where
基本语法 select 字段 from 表 where 条件;
示例 select * from money where age=22;
示例说明 查询money表中年龄为22的所有结果
- where后可接的条件
比较运算符结果集中将符合条件的记录列出来。如:>、<、>=、<=、|=等运算符。
- 逻辑运算符
多个条件还可以使用or、and等逻辑运算符进行多条件联合查询
示例 select * from money where uid=1 and age=21
说明 查询所有字段 要求id=1并且age=21;
- 结果集排序
基本语法 select 字段 from 表 order by 字段 排序关键词
示例 select id,username,balance from money order by balance desc;
示例说明 查询money表中的id,username,balance字段,按照余额进行降序排序
排序用到的关键词:
asc 升序排列,从小到大(默认)
desc降序排列,从大到小
在select出来之后的结果集中排序使用 order by,其中desc和asc是排序顺序中的关键字。desc表示按照字段进行降序排列,asc表示升序排列,如果不写关键字默认升序排列。
- 结果集限制
对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,使用limit关键字结果集数量限制。
基本语法 select 字段 from 表 limit 数量;
示例 select uid,username,age from money limit 5;
示例说明 显示前五个用户
- 限制结果集并排序
基本语法 select 字段 from 表 order by 字段 关键词 limit 数量
- 函数应用
sum 求和
count 统计总数
max 最大值
min 最小值
avg 平均值
基本语法 select 函数(字段)from 表
示例 select count(uid) from money
示例说明 查询money表的id总数
还可以给字段取别名,使用as关键字。
- 分组group by
基本语法 select * from 表group by 字段
示例 select * from money group by age;
示例说明 按照年龄进行分组
完整的使用SQL
SELECT
[字段1[as 别名1],[函数(字段2),]......字段n]
FROM 表名
[WHERE 条件]
[GROUP BY 字段]
[HAVING where_contition]
[order 条件]
[limit 条件]
select 选择的列
from 表
where 查询的条件
group by 分组属性 having分组过滤的条件
order by 排序属性
limit 起始记录位置,去记录的条数
MYSQL多表联合查询
注意:在上表order_goods表中id是指student表中的id字段。上表中oid为1的数据行,id为7的用户,为student表中id为7的用户:zsx。该用户购买的商品为xiangjiao。购物时间buytime为一个unix时间戳。
外连接
基本语法 select 表1.字段 [as 别名],表n.字段 from 表1 LEFT JOIN 表n on 条件;
示例 select *from student left join order_goods on student.id=order_goods.id;
示例说明 以左边为主,查询哪些用户未购买过商品,并将用户信息显示出来外连接又分为左连接和右链接。
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录。
基本语法 select 表1.字段[as 别名],表n.字段 from 表1 right JOIN 表n on 条件;
示例 select * from student right join order_goods on student.id=order_goods.id;
示例说明 查询商品表中哪些用户购买过商品,并将用户信息显示出来
子查询
用于子查询的关键字包括in、not、on、=、!=、exists、not exists等。
基本语法 select 字段 from 表where 字段 in(条件)
示例 select * from student where id in(1,3,4);
示例说明 按照id查询指定用户
示例2 select * from student where id in (select id from order_goods);
示例说明 将购买过的商品的用户信息显示出来
使用union和union all关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。两者主要的区别是把结果直接合并在一起,而union是将union all后的结果进行一次distinct,去除重复记录后的结果。
基本语法 select 语句 1 union[all] select 语句2
示例 select * from student where id in(1,3,4);
示例说明 将商品表中的用户信息和用户表中的用户信息结果组合在一起
修改(也叫更新)语句的基本语法如下:
基本语法 update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件
示例 update money set balance=balance-500 where userid=15;
示例说明 修改money 表,将balance 余额减500,要求userid为15
同时对两个表进行更新
基本语法 update 表1,表2 set 字段1=值1,字段2=值2,字段n=值n where 条件
示例 update money m,user u m.balance=m.balance*u.age where m.userid=u.id;
示例说明 修改money,将money表的别名设置为m;user表的别名设置为u;将m表的余额改为m表的balance*用户表的age。执行条件是:m.userid=u.id
使用delete删除记录
基本语法 DELETE FROM 表[where 条件]
示例 DELETE FROM user where id>10;
示例说明 删除掉用户表中id大于10的新用户
Mysql>DELETE FROM money where uid=’1’;
MYSQL权限操作
添加权限
基本语法 grant 权限 on 库.表 to ‘用户’@’主机’ identified by ‘密码’;
示例 grant select,insert on test.*to ‘liwenkai’@’localhost’ identified by ‘4311’;
示例说明 给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限。
注:可以针对一个用户增加多条权限。
删除权限
基本语法 revoke 权限 on 库.表 from ‘用户’@’主机’;
示例 revoke select,insert on test.* to ‘liwenkai’@’localhost’ identified by ‘4311’;
示例说明 给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限。
参数说明
grant all 在grant后接all说明给予所有权限
revoke all 在revoke后接all说明删除所有权限
权限on. .所明给予所有库所有表的操作权限
‘用户’@’主机’,主机里面若为%。任意来源的主机均可以使用这个用户来访问。
PHP操作mysql数据库
在正式开始学习之前,我们需要开启mysqli扩展,使用phpinfo()你可以看到如下展示就说明开启成功。
若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开即可。
注意:
从PHP7开始默认不再支持mysql扩展,即不再支持mysql_*系列函数。请使用mysqli连接数据库。
mysqli既支持php5也支持php7.
创建表结构:
PHP会话管理和控制
$名字 必需。规定个cookie的名称。
$值 可选。规定cookie的值。
$有效期 可选。规定cookie的有效期。
$路径 可选。规定cookie的服务器路径。
$域名 可选。规定cookie的域名。
$安全 可选。规定是否通过安全的HTTPS链接来传输cookie.
$http 只读 可选。如果true,那么js就无法读取改cookie,增加安全性。
一般来说,我们其实用不到上面那么多参数,对于这个函数,我们一般这么用:
setcookie(cookie名,cookie值,cookie有效期);
可在服务器端通过$COOKIE[‘name’]来读取cookie.
WEB应用程序技术
HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是访问万维网使用的核心通信协议,也是今天所有WEB应用程序使用的通信协议。最初,HTTP只是一个为获取基本文本的静态资源而开发的简单协议,后来人们以各种形式扩展和利用它。使其能够支持如今常见的复杂分布式应用程序。
HTTP使用一种用于消息的模型:客户端送出一条请求消息,而后由服务器返回一条响应消息。该协议基本上不需要连接,虽然HTTP使用有状态的TCP协议作为它的传输机制,但每次请求与响应交换都会自动完成,并且可能使用不同的TCP链接。
HTTP请求
所有HTTP消息(请求与响应)中都包含一个或几个单行显示的消息头(header),然后是一个强制空白行,最后是消息主体(可选)。以下是一个典型的HTTP请求:
GET /auth/488/Your-Details.ashx?uid=129 HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer:https://mdsec.net/auth/488/Home.ashx.
Accept-Language:zh-cn, zh;q=0.5
User-Agent: Mozilla/4.0(compatible:MSIE 8.0;Windows NT 6.1;WDW64;
Trident/4.0:SLCC2:.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR3.0.30729;.NET4.OC;InfoPath.3;.NET4.OE;FDM;. NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: mdsec.net.
Connection: Keep-Alive
Cookie: SessionId=5870C71F3FD4968935CDB6682E545476
每个HTTP请求的第一行都由3个以空格间隔的项目组成。
GET:一个说明HTTP方法的动词。最常用的方法为GET,它的主要作用是从Web服务器获取一个资源。GET请求并没有消息主体,因此在消息头后的空白行中没有其他数据。所请求的URL,通常由所请求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成。在该URL中,查询字符串以?字符标识,上面的示例中有一个名为uid、值为129的参数。使用的HTTP版本。因特网上常用的HTTP版本为1.0和1.1,多数浏览器默认使用1.1版本。这两个版本的规范之间存在一些差异,当然,当攻击WEB应用程序时,渗透测试员可能遇到的唯一差异是1.1版本必须使用Host请求头。
Accept:浏览器支持的MIME类型分别是text/html、application/xhtml+xml、application/xml和*/*,优先顺序是它们从左到右的排列顺序(表示我当前的浏览器希望接受什么类型的文件,这是请求首部,当服务器没有客户端想要的资源的媒体类型时,会返回406 Not Acceptable响应。当然使用了*/*表示愿意接受任意类型的资源,所以应不会看到这个响应。另外,这里的q表示权重,权重在0-1之间,可以理解成客户端在这些给出的类型中,向优先接受什么类型,可以服务器就可以根据客户端的需要返回相应的资源。
如果没有,则默认为1.这里前面几个类型都没有标明,则默认都是1,表示优先这些类型,后面的0.9表示前面都没有就用这个,最后的0.8表示如果都没有,那么任意的类型都行。)
Accept表示浏览器支持的MIME类型;MIME的英文全称是Multipurpose Internet Mail Extensions (多功能Internet邮件扩充服 务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。text/html,application/xhtml+xml,application/xml都是MIME类型,也可以称为媒体类型 和内容类型,斜杠前面的是type(类型),斜杠后面的是subt.e(子类型);type指定大的范围,subtype是type中范围更明确的类型,即大类中的小类。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的; text/html表示html文档;
Application:用于传输应用程序数据或者二进制数据:
application/xhtml+xml表示xhtml文档:
application/xml表示xml文档。
Referer 消息头用于表示发出请求的原始URL(例如,因为用户单击页面上的一个链接。)
Accept-Language 浏览器支持的语言分别是中文和简体中文,优先支持简体中文。
详解:
Accept-Languege 表示浏览器所支持的语言类型;
Zh-cn 表示简体中文;zh表示中文。
q是权重系数,范围0=<q<=1,q值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定q值,则默认为1,若被赋值为0,则用于提醒服务器哪些浏览器不接受的内容类型。
User-Agent 消息头提供与浏览器或其他生成请求的客户端软件有关的信息。由于历史原因,大多数浏览器中都包含Mozilla前缀。这是因为最初占支配地位的Netscape浏览器使用了User-Agent字符串,而其他浏览器也希望让Web站点相信它们与这种标准兼容。与计算领域历史上的许多怪异现象一样,这种现象变得很普遍,即使当前版本Internet Explorer也保留了这一做法,市里的请求即由Internet Explorer提出。
Upgrade-Insecure-Requests: 1该指令用于让浏览器自动升级请求从http到https,用于大量包含http资源的http网页直接升级到https而不会报错,简洁的讲,就相当于在http和https之间起的一个过渡作用。
X_FORWARDED_FOR是用来识别通过HTTP代理或负载均衡方式连接到wab服务器的客户端最原始的IP地址的HTTP请求头字段。
Connection 表示持久的客户端与服务连接。
cookie是什么
由于http是无状态的协议,一旦客户端和服务器的数据交换完毕,就会断开连接,会重新连接,这就说明服务器单从网络连接上是没有办法知道用户身份的。那怎么办呢?那就给每次新的用户请求时,给它颁发一个身份证,下次访问时,必须带上身份证,这种服务器就会知道是谁来访问了,针对不同用户,做出不同的响应。这就是cookie的原理。
其实cookie是一个很小的文本文件,是浏览器存储在用户的机器上的。cookie是纯文本,没有可执行代码。存储一些服务器需要的信息。每次请求站点,会发送响应的cookie,这些cookie可以用来辨别用户身份信息等作用。
编码方式
URL编码
URL只允许使用US-ASCII字符集中的可打印字符(也就是ASCII代码在0x20-0x7e范围内的字符)。而且,由于URL方案或HTTP协议内具有特殊含义,这个范围内的一些字符也不能用在URL中。
URL编码方案主要用于对扩展ASCII字符集中的任何有问题的字符进行编码,使其可通过HTTP安全传输。任何URL编码的字符都以%为前缀。其后是这个字符的两位十六进制ASCII代码。
%3d 代表=;
%25 代表%;
%20 代表空格;
%0a 代表换行;
%00 代表空字节。
另一个值得注意的编码字符是加号(+)。它代表URL编码的空格(除%20。)。
Unicode编码
16位Unicode编码的工作原理与URL编码类似。为通过HTTP进行传输,16位Unicode编码的字符一u位前缀,其后是这个字符的十六进制Unicode码点。例如:
%u2215 代表/;
%u00e9 代表e
UTF-8是一种长度可变的编码标准,它使用一个或几个字节表示每个字节。为通过HTTP进行传输,UTF-8编码的多字节字符以毛为前缀,其后用十六进制表示每个字节。例如:
%c2%a9 代表c
%e2%89%a0 代表 ≠。
攻击Web应用程序时之所以要用到Unicode编码,主要在于有时可用它来破坏输入确认机制。如果输入过滤阻止了某些恶意表达式。但随后处理输入的组件识别Unicode编码,就可以使用各种标准与畸形Unicode编码避开过滤。
HTML编码
HTML编码是一种用于表示问题字符以将其安全并入HTML文档的方案。有许多具有特殊的含义(如HTML内的元字符),并被用于定义文档结构而非其内容,为了安全使用这些字符并将其用在文档内容中,就必须对其进行HTML编码。
HTML编码定义了大量HTML实体来表示特殊的字面量字符。例如:
" 代表“;
&apos 代表‘;
& 代表& ;
< 代表< ;
&g 代表> 。
此外,任何字符都可以使用它的十进制ASCII码进行HTML编码。例如:
" 代表“;
#39 代表‘;
或者使用十六进制的ASCII码(以x为前缀),例如:
" 代表“;
' 代表‘;
当攻击Web应用程序时,html编码主要在探索跨站脚本漏洞时发挥作用,如果应用程序在响应中返回未被修改的用户输入,那么他可能易于受到攻击;但是,如果它对危险字符进行HTML编码也许比较安全。