在线php手册:https://www.php.net/manualwww.php.net/manual
[TOC]
1、php标签
<?php
phpinfo(); #列举安装在特定服务器上的PHP的具体细节
?>
php每一行后都要有分号“;”
2、注释
单行注释://或#
多行注释:/* */
HTML注释:<– –>
3、变量
$开头,区分大小写
4、引号
双引号引用的变量名将被它的值所替代,单引号则不会
$name2 = "$first_name $last_name";
#在双引号中使用单引号引用键时,将引发解析错误
5、错误提示和日志记录
(1)代码中加入 ini_set (‘display_errors’, 1); 或者PHP的配置文件(php.ini)中调整error_ reporting()参数使脚本出错时浏览器能显示错误。
(2)php.ini中的error_reporting参数可用于定制错误显示:、
显示所有信息: error_reporting = E_ALL
显示除提示外的所有信息: error_reporting = E_ALL & -E_NOTICE #符号&指的是“与”,减号“-”指的是取反
显示除提示、兼容性外的所有信息: error_reporting = E_ALL & -E_NOTICE & -E_STRICT
或者 error_reporting (E_ALL)函数
(3)php日志:php.ini 中 log_errors = on,默认是on。
日志位置存储在error_log参数里,若参数为syslog则在操作系统日志中。
3.1.windows在事件查看器 -> 应用程序日志中;
3.2.linux存放在/etc/syslog.conf 中;
3.3.手动搭建apache默认日志路径:
linux:/etc/httpd/logs/access_log
windows: /Apache/logs/access_log
3.4.ningix默认日志记录:/var/log/nginx/access.log 和 error.log
6、表单传值
表单通过get、post方法传值,可用’$_GET’、’$_POST’变量接收传值。’$_POST’变量中的键来自于html表单中的“name”属性。
7、字符串
(1)连接字符串:$greeting = $s1 . $s2;
(2)php换行:在表单元素中用输入多行文本,每次Return或者Enter在字符串中产生的换行符只会在表单中起作用,但PHP文件中没法识别并换行,因此使用nl2br()将换行符自动转换成为<br>标签
(3)3个PHP函数来处理PHP字符串变量中的HTML标签:
htmlspecialchars()将特定的HTML标签转换为实体版本。
htmlentities()将所有的HTML标签转换为实体版本。html_entity_decode()函数同htmlentities()函数正好相反,它将HTML实体转换为相应的HTML代码。
strip_tags()移除所有的HTML和PHP标签。
8、结构语句
(1)if语句:
if (条件) { 执行语句 }
elseif(条件){执行语句}
else{执行语句}
验证函数:empty( $变量 )函数:变量无值或为0或空时返回True;
isset( )函数:变量拥有值时(包括0、FALSE或者空字符串)返回True;
is_numeric()函数:变量是一个有效的数字类型的值时返回TRUE
判断相等:==
(2)switch语句:
switch ($var) {
case value1:
执行语句1;
break;
case value2:
执行语句2;
break;
default:
执行语句3;
break;
}
(3)for语句:
for ($v = 1; $v <= 10; $v++) {
print $v;
}
9、数组
(1)创建数组:array()函数
$list = array ('apples', 'bananas', 'oranges');
$list = array (1 => 'apples', 2 => 'bananas', 3 => 'oranges');#键也可以为字符、字符串(类似python字典)
$ten = range (1, 10);
(2)添加元素:
$list[ ] = 'pears'; (务必带上[],否则数组会被赋值为字符串)
$list[4] = 'tomatoes';
(3)implode( ):将数组转换为字符串
explode( ):将字符串转换为数组
$array = explode(',', $string);#以逗号为标志分割字符串
$string = implode(',', $array);
(4)遍历数组:
foreach ($_POST['days'] as $day) {
print "$day<br/>\n";
}
(5)list()函数用来将数组元素的值赋给单独的变量,通常用来从数据库中检索值。
$date = array('Thursday', 23, 'October');
list($weekday, $day, $month) = $date; #$weekday变量有了Thursday这个值,$day变量的值则为23,$month变量的值为October
10、引用外部文件
include ('file.php'); #失败会生成警告
require ('file.html');#失败会终止执行
11、使用常量
define('常量名', *value*);
12、检测表单是否已经被提交
是在表单中加入一个隐藏文本框来进行检测
<input type="hidden" name="submitted" value="true" />
该隐藏输入框的唯一目的就是可靠地指出表单已经被提交。为了检测这一点,用于处理表单
的PHP代码可以使用下面的条件语句:
if (isset($_POST['submitted'])) { ... }
13、发email
mail()函数
mail(发送的地址(可以是多个地址,使用逗号分隔), 消息的主题, 消息的内容,发送的地址(可以是多个地址,使用逗号分隔));
14、输出缓冲
在页面的最顶端使用ob_start()函数:则每个print和类似的函数都会将数据发送到内存缓冲中,而不是发送到Web浏览器,而HTTP调用(如header()和setcookie())不会缓冲。
在脚本的结尾处调用ob_end_flush()函数,将积累下来的缓冲发送到Web浏览器。或者,可以使用ob_end_clean()函数删除缓冲的数据而不进行传输。这两个函数都会为当前脚本关闭输出缓冲。
15、处理HTTP头
header( )函数:将用户从一个页面重定向到另一个页面
header('重定向的地址');
exit();
16 、Cookie
(1)函数setcookie()发送cookie:setcookie()将cookie数据存放在数组$_COOKIE中
setcookie('CookieName', 'This is the cookie value.');
setcookie(name, value, 设定持续的时间(默认为直到关闭浏览器), path(限制仅当用户在域path中user文件夹中时cookie才存在), domain(限定子域), secure(指明一个cookie应当只能通过安全HTTPS连接传送,值为1则为安全传输), httponly(限制对cookie的访问如防止用JavaScript读取cookie));
(2)访问coookie:通过访问数组$_COOKIE中的键值对来访问,注意cookie在未被发送前不能立即被脚本访问。
(3)删除cookie:删除名为username的cookie,可以编写代码setcookie(‘username’, ‘’); 或setcookie(‘username’, FALSE); 注意:必须使用同首次设置cookie时相同的参数值(除了值和
过期时间)。例如,如果在创建cookie时提供了domain值,那么在删除该cookie的时候也应该提
供同样的值:
setcookie('user', 'larry', time() + 3600, '', 'forums.example.com');
setcookie('user', '', time() - 600, '', 'forums.example.com');
17、session
通过session_start()创建、访问或删除session
(1)创建session:注意session_start()必须在任何HTML或空白被发送至Web浏览器之前调用。因此,在使用session的页面中,必须在脚本的起始行调用函数session_start()。只要脚本首先使用session_start(),就可以通过使用数组$_SESSION来访问已保存的session值
(2)启用session后,可以通过向数组$_SESSION赋值的方式记录数据:#这个数组必须是关联数组
$_SESSION['first_name'] = 'Sam';
$_SESSION['age'] = 4;
(3)设置数组$_SESSION来删除session的值:
session_start();
$_SESSION = array(); #设置session键值对
最后从服务器上删除session数据(保存在临时文件中):
session_destroy();
18、函数
创建一个自定义函数:
function function_name*() { 函数内容; return ...}
查看变量属性函数:var_dump( ),返回一个数组
19、文件
(1)文件权限:
0777允许各种类型的用户具备读(4)、写(2)和执行(1)(4+2+1,开头0为前缀,后三位分别为目录所有者、组、其他用户)
0666允许各种类型的用户具备读(4)、写(2)
(2)写入文件:file_put_contents($file, $data); 如果文件不存在,函数会创建。如果文件存在,文件的内容会被新的数据取代。如果需要将新内容追加到文件中,加入FILE_APPEND常量作为第三个参数:
file_put_contents($file, $data, FILE_APPEND);
注意内容中的换行符: \n —— Unix和Mac OS X; \r\n —— Windows。
is_writable():返回布尔值,表示指定文件是否可被写入
(3)锁定文件:PHP脚本试图在同一时刻写入同一个文件时,文件会损坏,file_put_contents()函数中加入第三个参数LOCK_EX常量锁定文件。如果要同时使用LOCK_EX和FILE_APPEND常量,可以使用二元OR运算符(|):
file_put_contents($file, $data, FILE_APPEND | LOCK_EX);
(4)读取文件:file_get_contents( ):将文件中的所有内容按照一个字符串来读取。
file( ):读取文件中的所有内容并将这些信息放置在一个数组中。数组的每个元素 都包含了文件中的一行,这些行是用换行符(\n或\r\n)分隔的。
pathinfo( )函数:返回文件路径的各个组成部分,包括basename、dirname、extension(拓展名)
(5)上传文件:注意:须在php.ini文件中修改参数file_upload为on,并且Web服务器必须对临时目录和最终的目标目录具有写权限。
[1] 初始form标签必须包含代码enctype=“multipart/form-data”,让浏览器知道表单数据将具备不同的类型(表单必须使用POST方法):
<form action="script.php" enctype="multipart/form-data" method="post">
[2] 其次,必须添加一个特殊的隐藏输入框,用来建议浏览器最大能够上传多大的文件(以字节计):
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
[3] 使用file元素创建所需的表单字段(参见图11-15和图11-16)。
<input type="file" name="picture" />
[4] 在PHP脚本中,可以引用$_FILES变量来引用上传的文件,包含五个元素name、type、size、tmp_name(存放在服务器上的临时文件名)、error。当文件上传后,服务器会将其放置在一个临时目录中。使用move_uploaded_ file()函数将文件存放在其最终目标位置:
move_uploaded_file(服务器中文件的临时名, 要移动到的路径);
[5]临时文件默认存放目录:C:\users\用户名\AppData\Local\Temp 目录中。上传文件时也会在默认目录创建一个临时文件直到上传完毕复制到磁盘中,该临时文件自动删除。修改临时目录位置:在php.ini中修改参数upload_tmp_dir
(6)通过php获取webserver配置信息:
header("Centent-type: text/html; charset = UTF-8")
$a = $_SERVER['HTTP_HOST']
20、目录
(1)scandir( ):列出指定路径中的文件和目录
$stuff = scandir($dir);
(2)mkdir( ):创建目录
mkdir('directory_name', permissions(windows上为非必须参数));
(3)opendir( ): 打开文件夹,返回操作资源
(4)readdir( ): 读取文件夹资源
(5)is_dir( ): 判断是否是文件夹
(6)closedir( ): 关闭文件夹资源
(7)filetype( ): 显示是文件还是文件夹,文件显示file,文件夹显示dir
21、数据库
(1)连接数据库:
$conn = new mysqli($servername, $username, $password);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
关闭数据库:
$conn->close();
(2)执行数据库语句:
if ($conn->query($sql) === TRUE) { echo "Table MyGuests created successfully"; }
else { echo "创建数据表错误: " . $conn->error; }
22、面向对象
(1)类定义:
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
方法内容
}
}
(2)$this表示自身的对象:
class Site {
var $url;
var $title;
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
(3)创建对象:使用new运算符创造对象
$memecat = new Cat ;
(4)调用成员方法:
$memecat -> miaomiao( )
" -> “符号意为取对象的方法或者属性
(5)继承:
使用关键字 extends 来继承一个类,PHP 不支持多继承:
class Child extends Parent {
代码部分
}
(6)访问控制:在属性或方法前添加关键字 public,protected或 private来实现。
public function MyPublic() { }
(7)调用父类构造方法:
class BaseClass {
function __construct() {
print "BaseClass 类中构造方法" . PHP_EOL;
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct(); // 子类构造方法不能自动调用父类的构造方法
print "SubClass 类中构造方法" . PHP_EOL;
}
}
23、php执行系统命令函数
(1)exec(“命令”) #这个函数回显不太好,但能执行命令
(2)system(“命令”)
$a = system ( 'ipconfig' )
echo $a
24、php序列化和反序列化
php之间序列化:serialize()方法,可以序列化任何数据,包括数组、对象类型。
反序列化:unserialize()方法,反序列化对象相当于直接new了一个新对象,该对象直接可以调佣其内置方法、属性。其中的一些魔术方法例如 __destruct()销毁对象,会在对象生命周期的某一时刻自动执行,其中如果内置了一些恶意代码也会一并被执行(php框架反序列化漏洞)。