php和mysql开发笔记

学习php圣经<php和mysql Web开发>的笔记

第一章 快速入门

php两种标记

<?php ... ?>
// 取决于php.ini中'short_open_tag'选项, 默认不开启
<? ... ?>

双引号和单引号中的变量

单引号不解析php变量, 双引号则会解析变量值

$a = 1;
echo "a=$a";
//> a=1;
echo 'a=$a';
//> a=$a

heredoc语法

通过标志(theEnd)来作为关闭标记, 只需要保证不会出现在文本中

echo <<<theEnd
line 1
line 2
line 3
theEnd;
//>
line 1
line 2
line 3

php变量语法

  1. 区分大小写, 不同于函数名
  2. 可以与函数名相同 (函数则不可以与另一个函数名相同)
  3. 不需要先声明

声明常量

常量引用时不需要$

define("PI", 3.14)
echo PI;
//> 3.14

引用

引用不是指针, 而是别名, 此时$a$b都指向了内存中的相同地址

$a = 5;
$b = &$a;
$a = 7;
// a = b = 7
//此时unset a不会改变$b的值
unset($a);
//b = 7;a = undefined

操作符优先级

and or xor优先级比&& ||

类型判断

函数gettype可以用于返回类型的字符串形式, settype用于设置类型

$a = 1;
echo gettype($a);
//> int
settype($a, 'float');
echo gettype($a);
//> float

第二章 数据存储和读取

文件读写

读写模式

模式 模式名称 意义
r 从头开始读, 加上+表示读写
w 不存在文件时会创建文件, 存在时则会清空并从头开始写, 加上+表示读写
x 谨慎写 如果文件不存在则会返回false并抛出错误, 其他同w
b 二进制 win会区分二进制文件和文本文件, linux则不会区分, 推荐使用
a 追加 不存在文件时会创建文件, 存在时则从文件尾部开始写, 加上+表示读写
t 文本 win下的一个选项, 不推荐使用

分隔符

//win
fopen("c:\\flag","r");
//win and linux, 推荐
fopen("../flag","r");

写文件

$fp = fopen("log.txt", "ab");
fwrite($fp, "aaa");
file_put_contents("log.txt", "aaa");
fputs($fp, "aaa");
fclose($fp);

读文件

// 判断文件末尾, file end of file
while(!feof($fp)){...};
// 读字符
while(!feof($fp)){
$char = fgetc($fp);
if(!feof($fp)){
echo ($char == "\n" ? "<br/>":$char);
}
}
// 读一行
fgets/fgetss/fgetcsv
// 读任意长
fread()
// 读文件
readfile($filename);
fpassthru($fp);
file($filename);//返回数组, 按行分割
file_get_contents($filename);//返回文件内容, 不输出

其他文件操作

// 判断文件存在
file_exists($filename);
// 获取文件大小
filesize($filename);
// 删除文件
unlink($filename);
// 文件指针定位
rewind()/fseek()/ftell();
// 文件锁
flock();

第三章 数组

创建数组

数组支持在结尾添加元素

// array
$pro = array('Tires', 'Oil', 'Spark');
$pro = array('Tires' => 100, 'key' => value);
// since php5.4
$pro = ['Tires', 'Oil', 'Spark'];
$pro[3] = 'Plugs';
// 多维数组
$multi_pro = array(array('tires', 100),
array('Spark', 99)
);

访问数组

$pro[0];
$pro{1};

循环

for($i = 0; $i < 3; $i++){..}
foreach($pro => $value){...} //
foreach($pro as $key => $value){...} //

数组排序

// 字典序,区分大小写
sort()
asort() ksort()
// 反序
rsort()
arsort() krsort()
// 自定义序
usort($array, $func)
// 数组随机
shuffle()
// 数组逆序
array_reverse()

数组操作

进出数组

array_push($array, $item);
array_pop($array);//删除末尾

数组浏览

// 返回当前元素并指向下一个元素
each()
// 指向下一个元素并返回新的元素
next()
// 返回当前元素
current()
// 返回指向第一个元素的指针
reset
// 返回指向最后一个元素的指针
end()
// 指向上一个元素并返回新的元素
prev()

统计数组

// 返回元素个数
count()/sizeof()
// 返回每个特定值在数组中出现的次数, 返回值为数组
array_count_values()

其他操作

// map
array_walk($array, $func, [userdata]);
// 其中func定义为
func($value, $key, $userdata);

// 解析数组为变量, 不安全
extract($array);

第四章 字符串

字符串截断

// 除去开始和结束的空格
trim()
// 除去开始的空格
ltrim()
// 除去结束的空格
rtrim()/chop()

html转换

// html字符过滤
htmlspecialchars();
// /n => <br/>
n2br();

大小写

strtoupper()
strtolower();
// 每个字符串首字母大写
ucfirst();
// 每个单词首字母大写
ucwords()

格式化输出

%[+]['padding_character][-][width][.precision]type

  • + 表示正数输出 +
  • padding_character 表示输出前缀, 除0外都需要添加`
  • -表示左对齐
  • width表示宽度
  • .precision表示小数点后位数
类型 意义
b 解释为整数并作为二进制输出
c 解释为整数并作为字符输出
d 解释为整数并作为小数输出
e 解释为双精度并以科学计数法打印, 精度是小数点后的数字个数
E 同e, 打印为大写E
f 解释为双精度并作为浮点数输出
F 解释为浮点数并打印与locale无关的浮点数
g 转换规范类型e或f的简短输出
G 转换规范类型E或F的简短输出
o 解释为整数并作为8进制输出
s 解释为字符串输出
u 解释为整数并作为非指定小数输出
x 解释为整数并作为16进制小写输出
X 解释为整数并作为16进制大写输出

字符串连接切分

// 切分
explode($separator, $string);
// 连接
implode($separator, $array)/join();

子串

// strtok

// start和length都可以是负数, 当length为负数时表示结束位置(end)
substr($strings, start, [length]);

比较

// 区分大小写
strcmp()
// 不区分大小写
strcasecmp()
// 自然序, 2<12
strnatcmp()

查找

strpos函数如果不存在会返回false, 在弱类型比较中等同于0, 建议使用===作比较

// 查找子串, 返回从第一次子串出现到结束
strstr($string, $substring)/strchr();
// 忽略大小写
stristr($string, $substring);
// 返回最后一次匹配
strrchr($string, $substring);
// 查找, 返回第一次匹配位置
strpos($string, $substring, [$offset]);
// 返回最后一次匹配
strrpos($string, $substring, [$offset]);

替换

str_replace($old, $new, $string);
substr_replace($string, $new, $start, [$length]);

回溯引用

模式的回溯引用通过一个反斜杠\加一个数字或多个来表示, 用来匹配多次出现在一个字符串中的相同子表达式

/^([a-z]+) \1 black sheep/
$a = "baa baa black sheep";
//> 匹配
$b = "blah baa black sheep";
//> 不匹配

正则分割

print_r(preg_split("/\.|@/", "user@admin.cn"));
//> user
admin
cn

第五章 代码重用和函数

auto_prepend_file

// php.ini
auto_prepend_file = "/path/to/header.php";
auto_append_file = "/path/to/footer.php";
// .htaccess, 目录中每次每个文件都要进行处理, 性能较低
php_value auto_prepend_file "/path/to/header.php"
php_value auto_append_file "/path/to/footer.php"
// 考虑安全问题可以使用readfile读入而不会自动解析代码

闭包

闭包函数具有对全局作用域变量的访问, 但必须在闭包函数定义中使用use关键字显式定义

第六章 面向对象

类属性修饰符

默认为public

private不可被继承, protected可以被继承

final关键字

用于禁止类被继承或者函数被覆盖

不支持多重继承

单一继承, 但是可以支持类似java的interface

interface Displayable{
function display();
}
class Test implements Displayable{
function display(){
...
}
}

或者使用Trait, 注意Trait会覆盖类继承的同名方法, 而类中自定义的方法可以覆盖Trait的方法
trait logger{
public function logmessage($message){
...
}
}
class Test{
use logger;
// this->logmessage();
}

如果使用了多个同名的Trait, 需要用insteadof声明所使用的函数

灵活的使用标记

当程序中需要大段的打印html代码时, 可以使用如下的方法

<?php if(){...}
else{
?> html...
<?php
}

常量和静态方法

常量用const定义, 静态方法用static修饰, 可以在未初始化前调用

魔术方法

// 方法重载
__call($method, $p)
// 访问不可访问方法时, since php5.3
__callStatic()
// 实例化还没有被声明的类时可以调用
__autoload()
// ex:
function __autoload($name){
include_once $name.".php";
}

迭代器和生成器

名称空间

如果在文件中声明名称空间, 文件的第一行代码必须是名称空间声明

当没有指定完整的名称空间时, 都会认为在当前名称空间, 如果找不到则会在全局名称空间中寻找, 全局名称空间为\

// 声明名称空间
namespace bob\html\page;
//使用名称空间
use bob\html\page;
// 别名
use bob\html\page as www;

第七章 错误和异常处理

抛出异常

在php中, 异常必须手动抛出

throw new Exception($message, $code);

注意如果异常没有匹配到catch块将报Error

异常类

Exception

  • getCode(): 返回错误代码
  • getMessage(): 返回错误信息
  • getFile(): 返回产生异常的文件完整路径
  • getLine(): 返回错误代码行号
  • getTrace(): 返回异常代码回溯路径的数组
  • getTraceAsString(): 返回回溯路径数组的格式化形式
  • __toString(): string输出异常

<?php
class myException extends Exception{
function __toString(){
return "<strong>".$this->getMessage()."</strong>";
}
}
try{
throw new myException("error");
}catch(myException $m){
echo $m;
}catch(Exception $m){
echo $m;
}
?>

第八章 web数据库设计

避免保存冗余数据, 当冗余数据过多会出现修改, 插入和删除异常

避免出现大量空值

第九章 Web数据库创建

安装步骤

  1. 安装文件
  2. 如果需要, 创建并设置MySQL的运行用户
  3. 设置路径
  4. 如果需要, 运行mysql_install_db
  5. 设置root用户密码
  6. 删除匿名用户和测试数据库
  7. 启动MySQL并设置为自动运行

大小写

sql语句不区分大小写, 数据库名称和表名称区分大小写(linux下)

创建用户

创建用户可以使用

create user user_info identified by password;

或者使用grant自动创建用户

-- since mysql 5.5.7
grant privileges on item to user_info identified by password;

权限

大部分情况下, php脚本只需要select, insert, update, delete操作

可以通过grant授予和revoke取回, 部分权限如file具有极大的安全问题

如果所运行的grant语句已经执行, 但是尝试登陆时被拒绝, 通常是因为安装中的匿名用户没有被删除

查看数据库

-- 查看所有数据库
show databases;
-- 显示数据库结构
describe database_name;

部分类型

当读取char类型或者写入varchar数据时, mysql将过去结尾处多余的空格

blob, 二进制大对象, 可以用来存储图像声音数据等


作者: cjm00n
地址: https://cjm00n.top/Web/php-and-mysql-book-report.html
版权声明: 除特别说明外,所有文章均采用 CC BY 4.0 许可协议,转载请先取得同意。

HTB-Hack之旅 Config文档

评论