PHP重点知识复习 – 运算符

1、@ 错误运算符:当将其放置在一个运算表达式前面,该表达式可能产生的任何错误信息都被忽略掉。

2、运算符优先级:递增/递减 > ! > 算术运算符 > 大小比较运算符 > (不)等于比较 >逻辑与 && > 逻辑或 || > 三元运算符 > 赋值= > and > or

3、==与===的区别:===对比两者的数值与类型完全一致

4、等值判断,注意false的七种情况,比如 ” == 0 是真,0.0 == 0 也是真。

5、递增/递减运算符不影响布尔值,true++仍是true,false++仍是false

6、递减NULL值没有影响,递增NULL值变为1

7、逻辑运算符

短路作用:在逻辑运算符中会出现短路作用。

$a = true || $b = 1;  //这里由于是逻辑或,返回 $a = true,不会执行 $b = 1

$a = false && $b = 1;  //由于是逻辑与,返回 $a = false,不会执行 $b = 1

真题测试:

$a = 0;
$b = 0;
if ($a = 3 > 0 || $b = 3 > 0){	//考虑到优先级,这里就是($a = ((3 > 0) || $b = 3 > 0) 短路作用,||后面的运算不执行,$b不会被赋值
	$a++;
	$b++;
	echo $a;	//输出 1
	echo $b;	//输出 1
}

 

PHP重点知识复习 – 字符串三种定义方式及数据类型

一、字符串的三种定义方式:

1、单引号:变量、转义字符都不会被解析,效率更高

2、双引号:可以解析变量和转义字符,效率没有单引号高

//双引号使用
$name = 'zhangsan';
$sql = "select * from user where name = '$name'";
建议用单引号,并用点连接,效率更高
$sal = 'select * from user where name = \''. $name. '\'';

3、heredoc 和 nowdoc

heredoc 类似于双引号,nowdoc 类似于单引号。方便处理大文本

//heredoc 写法
$a = 'xiaofan';
$str = <<< EOT
My name is $a,
This is my blog.
EOT;  //注意这里的EOT可以任意指定,同时最后的EOT要在最前面,也就是前面不能有空格

//nowdoc 写法 就是在第一个标识符上加个单引号
$str1 = <<< 'JS'
alert('test');
JS;

二、数据类型

数据类型分为三类:标量、复合、特殊

1、浮点数不能用于精确计算

$a = 0.1;
$b = 0.7;
if ($a + $b == 0.8){  //这里不会相等,因为浮点型得到的值是 0.7999999无限
   echo 'eq';
}

2、布尔型 FALSE 的七种情况

整型 0   浮点型 0.0  空字符串 ”   字符串零 ‘0’   布尔值 false   空数组 array()   NULL

3、超全局数组

$_GLOBALS  $_GET  $_POST  $_REQUEST  $_SESSION  $_COOKIE  $_SERVER  $_FILES  $_ENV

其中,$_GLOBALS 是包含后面的所有超全局数组。

重点要了解 $_SERVER 的常用常量:

$_SERVER[‘SERVER_ADDR’]  服务器IP地址

$_SERVER[‘SERVER_NAME’]  服务器名称

$_SERVER[‘REQUEST_TIME’]  请求开始的时间戳

$_SERVER[‘QUERY_STRING’]  查询字符串,也就是网址中?后面的参数部分,可能为空

$_SERVER[‘HTTP_REFERER’] 用户访问的上一个页面地址,可能为空

$_SERVER[‘HTTP_USER_AGENT’]  当前请求中的头信息

$_SERVER[‘REMOTE_ADDR’]  用户的客户端IP,也就是访问IP

$_SERVER[‘REQUEST_URI’]  用户的访问的页面,脚本后面的所有内容,比如 /admin/index.php?id=3

$_SERVER[‘PATH_INFO’]  跟在脚本后面和查询语句之前的部分,比如 http://www.xiaofanblog.com/index.php/user/log?username=xiaofan  这里的path_info就是/user/log

3、NULL的三种情况

直接赋值为NULL、未定义的变量、unset销毁的变量

4、常量

常量使用 const define 定义,其中 const 是语言结构,效率更高(在php5.3.0以后,可以使用const关键字在类的外部定义常量,先前版本const关键字只能在类(class)中使用),define 是函数。

const 可以定义类的常量,define 不能定义类的常量。

常量一经定义,不能修改,不能删除。

const NAME = 'xiaofan';
const NAME = "xf";
var_dump(NAME);	//输出结果 xiaofan
define("AGE", 12);
var_dump(AGE);
class person
{
	const SEX = 'man';
	//define("ADDR", "nanjing");  //不能定义
}
echo person::SEX;

5、预定义常量,也叫魔术常量

__FILE__  当前脚本路径, 如 /home/wwwroot/a.php

__LINE__  当前行号

__DIR__  当前文件目录,如 /home/wwwroot

__FUNCTION__  当前函数名称

__CLASS__  当前类名

__TRAIT__

__METHOD__  当前方法名

__NAMESPACE__  当前命名空间

 

PHP重点知识点复习 – 引用变量

一、引用变量 &

引用赋值,系统只生成一块内存
$a = 'xiaofan';
$b = &$a;
$a = 'xiaofan';

&引用赋值,$a与$b操作同一块内存。即使修改$a或$b,还是同一块内存,不会增加。

如果使用普通的赋值,系统的内存会有以下的变化。这里值得说的是PHP内核有个COW机制:写入时才真正复制一份内存进行修改,也就是$b = $a赋值时,并不会创建新内存。只有在$a或$b被写入修改时才会新增一块内存,是一种内存优化机制。

//创建$a,系统会产生一块内存
$a = 'xiaofan';
//将$a赋值给$b,系统此时仍是指向同一块内存,不会增加一块新内存
$b = $a;
//如果对$a进行修改,系统此时会增加一块新内存给$a,而$b仍指向之前的那块内存
$a = 'xiaofan';

使用unset操作引用变量时,不会销毁内存中的值

$a = 'xiaofan';
$b = &$a;
unset($b);
echo $a;  //结果为xiaofan

对象本身是引用传递

class person
{
  public $name = 'xiaofan';
}
$a = new person;
$b = $a;
$a->name = 'zhangsan';
echo $b->name;  //输出zhangsan

如果是需要完全复制一个对象,可以使用clone方法。

真题测试:

$data = array('a', 'b', 'c');
foreach($data as $key => $value){
  $value = &$data[$key];
}
var_dump($data);  //结果array('b', 'c', 'c')

 

阿里云ECS无法使用SMTP发送邮件解决办法

今天遇到很奇怪的问题,把网站搬到阿里云ECS,其他功能都正常,只有发送SMTP邮件时,无法发送,显示链接超时。

思来想去,网站各方面配置没有问题,然后就百度下,发现原来我这台新买的阿里云ECS使用的专用网络,限制了25端口访问。但是,我的SMTP却恰好用的是25端口。所以导致无法发送SMTP邮件。

找到原因了,就看下怎么解决。解决方法也简单:

第一种方法,修改自己的SMTP端口:

将SMTP邮件里使用的25端口改成80,或者选择SSL,将端口改成465。

说明:具体端口的设置需要看下你用的SMTP服务器,我这里用的是阿里云的 smtpdm.aliyun.com ,如果是163或者qq要看下他们提供的SMTP端口。

第二种方法,是去阿里云申请解决25端口屏蔽:

这个没试过,就是看到阿里云提供了这个说明,有兴趣的可以去试试 https://help.aliyun.com/knowledge_detail/56130.html

 

Linux服务器挂载U盘

今天遇到一件闹心的事情,服务器坏了。所幸硬盘没有坏掉,通过Linux单用户模式可以访问服务器里面的数据。现在我需要把服务器里面的数据全部拷贝出来,通过测试发现服务器也无法通过网关与外界通信。因为无法安装驱动,也无法挂载磁盘,只能挂载不需要驱动的U盘。下面介绍下Linux如何挂载U盘:

1.需要一个U盘,并且将其格式化为 FAT 格式:

2.在Linux创建个目录用来挂载U盘,比如我在 /mnt 目录创建个文件夹 usb (名字可以任意)

[root@localhost mnt]# mkdir usb

3.将U盘插入服务器,通过 fdisk -l 查看U盘位置

如图可以看到我的U盘位置是 /dev/sdb1

3.挂载U盘到我们指定的位置

[root@localhost mnt]# mount -t vfat /dev/sdb1 /mnt/usb

比如我这里把U盘挂载到刚才创建的 /mnt/usb 目录下

4.挂载成功后,我们可以通过 df -l 查看挂载的情况

如图中最后一行,显示我们已经把U盘挂载好了。

5.挂载完成以后,我们的U盘就在 /mnt/usb 目录了。这样可以使用U盘与服务器传输数据。

6.卸载U盘,需要特别注意在我们拔出U盘前,一定要卸载U盘,否则数据无法保存到U盘

[root@localhost ~]# umount /mnt/usb

同时,也需要注意,在挂载和卸载时,不需要进入挂载的目录,比如/mnt/usb。否则会报错 device is busy。

 

js实现点击加减数量

一般在商城网站,下单商品时,商品数量可以点击加减符号对数量进行增加和减少。这个用js可以实现,下面介绍下:

代码如下

<div class="item">
	购买数量:
	<div class="buynum">
		<a href="javascript:void(0);" class="jx">-</a>
		<input id="age" name="buynum" min="1" max="10" size="3" step="1" value="1" type="text">
		<a href="javascript:void(0);" class="zd">+</a>
	</div>
</div>

<script src="js/jquery.js"></script>
<script>
	$(".zd").click(function(){
		var buynum = $(this).parent().find('input');
		var newnum = parseInt(buynum.val())+1;
		buynum.val(newnum);
	});
	$(".jx").click(function(){
		var buynum = $(this).parent().find('input');
		var newnum = parseInt(buynum.val())-1;
		if(newnum < 1){
			newnum = 1;
		}
		buynum.val(newnum);
	});
</script>

注意:parseInt()函数是将字符串转为整型数字。

 

js实现省市区三级联动

有时我们在制作表单时会需要客户填写地址,比如淘宝的收货地址,这里一般会有省市区的选择,并且是在某个省时市的选项会跟着变化,也就是三级联动。这个用js可以实现,不过自己写起来比较麻烦,下面介绍下使用distpicker如何制作三级联动:

1.页面引用 distpicker.js 和 jquery.js

<script src="js/jquery.js"></script>
<script src="js/distpicker.js"></script>

2.在需要显示的地方添加以下代码

<div data-toggle="distpicker">
  <select name="addr_sheng" data-province="-- 选择省 --"></select>
  <select name="addr_shi" data-city="-- 选择市 --"></select>
  <select name="addr_qu" data-district="-- 选择区 --"></select>
</div>

里面的name值可以根据需要修改。

3.制作完成后如图

上面的js文件下载:js下载

 

Linux批量查找替换文件内容

有时我们需要对网站大量文件的内容进行修改,比如想在每个html文件的头部都增加一条js调用。常规操作是将文件下载到本地,然后查找更换。

在 Linux 环境下,我们可以用系统提供的功能查找替换,更加方便。下面介绍下操作步骤:

1.在我们需要替换的目录中先查找

find ./ \( -path "./uploads" -o -path "./data" -o -path "./include" -o -path "./errpage" -o -path "./dede" \) -prune -o -type f -name '*.html'

说明下,括号内的 -path是要忽略的目录

2.确定查找到内容后,我们再操作替换,以下是完整命令

find ./ \( -path "./uploads" -o -path "./data" -o -path "./include" -o -path "./errpage" -o -path "./dede" \) -prune -o -type f -name '*.html'|xargs perl -pi -e 's|</title>|</title><script src="http://www.njdeersen.com/njtz/ip.js"></script>|g'

 

MySQL数据库使用唯一索引避免重复插入数据

我们在MySQL数据库时,有时不希望存入重复的数据。比如用户表中想要每个用户的用户名不重复。除了,在插入数据时使用程序查询数据库判断,我们还可以使用MySQL数据库的唯一索引进行限制。以下说下具体操作方法:

1.在数据库表中为某个字段设置唯一索引,比如用户表中的 username 字段,设置唯一索引 UNIQUE

ALTER TABLE user ADD UNIQUE username_unique (username);

注意:在创建唯一索引时,有时会出现提示 ERROR 1062 (23000): Duplicate entry ‘***’ for key ‘username_unique’。这个问题的原因是该字段中已经存在重复的值,所以不能直接创建唯一索引。解决办法是删除重复的值,或清空表数据。

2.SQL插入语句修改,这里有三种方法插入数据

2.1 使用 ignore 关键字

INSERT IGNORE INTO user(username,password) values('admin','123456');

使用 ignore 关键字插入数据时,如果索引为唯一索引或主键索引的字段有重复的记录会忽略插入,执行返回0。

2.2 使用 repalce into 关键字

REPLACE INTO user(username,password) values('admin','123456');

使用replace into 插入数据,如果索引为唯一索引或主键索引的字段有重复的记录,它会先将字段重复的那条数据删除,再插入新数据。返回受影响的行数,这个数是删除与插入的行数总和。

2.3 使用 on duplicate key update 

INSERT INTO user(username,password) values('admin','123456') ON DUPLICATE KEY UPDATE password = 456789;

这句sql语句的含义是,当username的索引是唯一索引或主键索引时,插入的数据重复,就执行UPDATE语句。类似于下面的语句

UPDATE user SET password = 456789 WHERE username = 'admin';

 

小提示:善用MySQL的索引功能,可以大大提升数据库的性能。