PHP入门到入土
PHP
基础知识
- var_dump() 函数返回变量的数据类型和值:print var_dump($x);
- gettype($a):也是可以获取数据类型
- 设置 PHP 常量
设置常量,使用 define() 函数,函数语法如下: bool define ( string $name , mixed $value [, bool $case_insensitive = false ] ) constant_name:必选参数,常量名称,即标志符。 value:必选参数,常量的值。 case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。 define("CONSTANT","value",false); echo CONSTANT;
- 拼接字符串,PHP 并置运算符
并置运算符 (.) 用于把两个字符串值连接起来。$a="hello";$b="word"; echo $a."".$b;(或echo $a.$b;)
- strlen() 函数返回字符串的长度(字符数)。
- PHP strpos() 函数:strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。 - 运算符优先级中,or 和 ||,&& 和 and 都是逻辑运算符,效果一样,但是其优先级却不一样。
// 优先级: && > = > and // 优先级: || > = > or $a = 3; $b = false; $c = $a or $b; var_dump($c); // 这里的 $c 为 int 值3,而不是 boolean 值 true $d = $a || $b; var_dump($d); //这里的 $d 就是 boolean 值 true 解释:第一个由于=>or 优先级,所以先执行$c=$a=3 or $b 所以$c的值为3 第二个||>= 先执行$a||$b=true $d=true
数组
数组遍历
-
在 PHP 中,array() 函数用于创建数组array();获取数组的长度 - count() 函数
-
PHP 数值数组,自动分配 ID 键(ID 键总是从 0 开始)$cars=array(“Volvo”,“BMW”,“Toyota”);
-
PHP 关联数组:关联数组是使用您分配给数组的指定的键的数组 a g e = a r r a y ( " P e t e r " = > " 35 " , " B e n " = > " 37 " , " J o e " = > " 43 " ) ; 或者 age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");或者 age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");或者age[‘Peter’]=“35”; $age[‘Ben’]=“37”; $age[‘Joe’]=“43”;
-
遍历关联数组:foreach (array_expression as $value){ statement}
foreach (array_expression as $key => $value){statement}
key和value变量分别代表键值,名称无所谓
break
- break 后面接数字表示可以跳出几层循环,continue同理 break 2;
数组排序
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据数组的值,对数组进行升序排列,根据数组的value值进行排序
- ksort() - 根据数组的键,对数组进行升序排列 ,根据key来排序
- arsort() - 根据数组的值,对数组进行降序排列 krsort() - 根据数组的键,对数组进行降序排列
数组加号
- 当两个数组相加+,只会保留第一个数组相同的键值,如果想要替换,可以使用array_merge()函数,这个有点想hash了
空合并运算和组合比较运算
- ??: $name??"测试”:如果变量不存在或者为空,有个测试默认数据,反之就是本身数据
- <=>: a < = > a<=> a<=>b : a<b 返回-1 ==:0 大于:1
变量,函数,对象
PHP 变量
- 什么是 PHP 超级全局变量?超级全局变量是在全部作用域中始终可用的内置变量。
- PHP$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
<?php $a=1;function test(){$GLOBALS['z']=$GLOBALS['a'];} test();echo $z?>
- PHP $_SERVER:是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。具体常量含义点击这里
isset(),is_null(),empty()
- isset:判断变量是否被定义,或者为空
- is_null:判断变量是否为空
- empty:都可以,像false,空数组…
设置php环境变量
- 在phpstudy_pro中找到设置->找到文件php文件所在地,复制php.exe目录的路径,然后添加到环境变量中即可。cmd 执行命令:php -v 执行文件命令: php D:\index.php
魔术常量
- print LINE; 返回所在行
- print FILE; 返回文件的绝对路径
- print DIR; 返回文件所在目录
- print FUNCTION; 返回当前语句所在函数名字
- return print CLASS; 返回类名
- NAMESPACE 命名空间
变量函数
-
变量函数是指在 PHP 中,将一个变量作为函数名来调用的函数,变量函数可以让我们在运行时动态地决定调用哪个函数。
<!-- 变量函数 --> <?php function add($a,$b){ echo "in add() a=$a,\$b=$b<br>"; } function printName($name="张三"){ echo "in printName() \$name=$name<br>"; } $fun='add';//函数赋值 $fun(1,2); $fun='printName'; $fun(); ?> <?php class Car{ public $color; public function run(){ $this->start(); } public function start(){ echo "车子启动了"; } } $car=new Car(); $fun = "run"; $car->$fun(); ?>
命名空间
-
PHP 命名空间(namespace)是在 PHP 5.3 中加入的,目的是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。
-
将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来
-
命名空间必须是程序脚本的第一条语句
<html> <?php namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
命名空间的使用
-
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
-
限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
-
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
-
第三种比较明了
<?php namespace comm; class User { const NAME = "张三"; //定义常量 public static function say() { echo self::NAME . "说话了<br>"; } public function visit() { $a = "我是张三"; // 注意访问任意全局类、函数或常量,都可以使用完全限定名称, // 例如 \strlen() 或 \Exception 或 \INI_ALL。 echo "长度为:" . strlen($a) . "<br>"; } } namespace mycomm; class User { const NAME = "李四"; //定义常量 public static function say() { echo self::NAME . "说话了<br>"; } } // 定义两个命名空间 ?> <!-- 使用命名空间 --> <?php // 调用comm命名空间里的 $user = new \comm\User(); $user->visit(); \comm\User::say(); echo "<br>"; // 调用mycomm命名空间里的 \mycomm\User::say(); echo "<br>"; ?>
使用命名空间别名
-
这里就给一段示例吧
<?php namespace n2; class User{ public int $age; public function getAge(){ return $this->age; } } function say(){ echo "我是命名空间2<br>"; } include "../common/5_namespace_file.php"; //起别名 use \n1\User as u1; use \n2 as nn; $user = new u1(); echo "命名空间1age:".$user->getAge(); echo "<br>"; nn\say(); ?>
命令行的使用
- <?php $input = readline("请输入字符串"); echo $input; ?> 提示输入
不需要转义的输出
- 使用EOF
<?php $a=10; echo <<<EOF <div>$a</div> EOF; ?>
- 这种格式循环可以使代码有颜色,最后一个}不要加分号;
<?php foreach($arr as $key=>$value){ ?> <h1><?php echo $key ?></h1> <?php } ?>
函数
内置函数
- count():计算数组长度和print_r()格式化输出都是内置函数
- 获取当前时间:time(),date(‘Y-m-d H:i:s’);
严格格式函数
- 在代码最顶端加声明就行了declare(strict_types=1);
删除/检验变量
- unset():删除变量,但是删除不了全局变量
- isset():判断变量是否存在
时间函数
- time():获取当前时间戳 <?php echo time() ?>
- date(格式,时间戳)日期格式化 <?php $time=time();echo date("Y-m-d H:i:s",$time)?>
- strtotime(string):他可以根据string更新时间,例如加一天,当前时间的下个星期1
<?php $time = strtotime("2023/12/31");//定位时间 $m = strtotime("next Tuesday", $time);//下个星期二 $d= strtotime("+1 day", $time);//加一天 echo date("Y-m-d",$m); echo date("Y-m-d",$d); //结果 2024-01-02 2024-01-01 ?>
- mktime()和date_create()都是用来创建一个时间对象
- date_format($date,格式):日期格式化 $date用mktime()和date_create()这两个创建
…查手册
include和require语句
- 都是引入代码,相当于原封不动的将代码引入
- 区别:require遇到错误会停止执行,而 include不会 require(“aa.php”)
require_onece()只会引入一次,不管你写了多少require_one()
类
- 修饰符protected :只有父类,子类可以享用,也就是亲人可以。private:只有自己
- __construct 构造函数
- __destruct 析构函数:对象自毁执行
- 例子:
class Animal { private $name; public function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } } $animal = new Animal("小狗"); echo $animal->getName();
- 静态变量无需实例化 public static
c
a
t
=
"
毛
"
可以通过类名
:
:
cat="毛" 可以通过类名::
cat="毛"可以通过类名::cat 或 self::$cat来获取
self在类外是不能用的 - const 常量 和静态相似 但是常量不能更改 静态调用非静态
class Animal { .... public function eat(){ echo $this->name; } //可以这样理解,new self 就是实例一个静态的类,这样就和静态函数同级了; public static function aa(){ echo (new self)->eat(); } }
- final最终,不能被继承修改,不能用在属性上
- 调用父类 parent::
- 方法重载:需要使用这两个函数,因为php是允许函数重名的。func_get_args():获取所有参数,func_num_args():获取参数数量
class Animal{ public static function a(){ $num = func_num_args(); switch ($num) { case 1: echo"11111"; break; case 2: echo "22222"; break; default:break; } } } Animal::a(1); echo "<br>"; Animal::a("aa","bb");
- 抽象类abstract ,接口interface,代码复用trait
代码复用可以解决类单一继承的问题 trait A{} class B{use A;} 如果class C{use A;useB;} 如果A,B有同名冲突 ,use B{B::eat insteadof A}; 用B的eat方法替换A的eat,或者起别名 B::eat as Beat;属性的命名冲突解决不了
表单和请求
-
<input type="checkbox" name="c[]" value="c1"> 可以将name定义一个数组
-
var_dump($_GET); var_dump($_POST); 表单提交的数据都封装到这里面了,echo $_GET[‘username’];自己可以打印变量取看看
-
var_dump($_REQUEST);同时可以包含$_GET,$_POST,$_COOKIE中的数据
$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。<form action="./aa.php?id=1" method="post"> username: <input type="text" name="username"> <select name="select"> <option value="1">选项1</option> <option value="2">选项2</option> <option value="3">选项3</option> </select> <input type="radio" name="r1" value="r1">单选 <input type="checkbox" name="c[]" value="c1"> <input type="checkbox" name="c[]" value="c2"> <input type="submit"> </form>
-
aa.php中 <?php var_dump($_REQUEST); ?>
array(5) {
[“id”]=>
string(1) “1”
[“username”]=>
string(6) “微软”
[“select”]=>
string(1) “1”
[“r1”]=>
string(2) “r1”
[“c”]=>
array(2) {
[0]=>
string(2) “c1”
[1]=>
string(2) “c2”
}
}
可以看到id也取到了,但是$_POST是取不到的,值得注意的是如果cookie中有同名,假如cookie中有id=2;那么id会被cookie替换 -
htmlspecialchars():将特殊字符转换为html实体,避免解析错误和安全漏洞,预定义特殊字符有:&=>&;"=>"'=>'<=><>=>>
例如:username输入这个:<script>alert(“你中招了”)</script> ,那么aa.php就会弹出提示框,造成各种问题。
示例
-
通过选择,来动态决定p标签的内容 ,$_SEVER[‘PHP_SELF’]:当前执行脚本文件名, $_SERVER[“PHP_SELF”] 会发送表单数据到当前页面,而不是跳转到不同的页面。
当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER[“PHP_SELF”]服务器变量也会被植入脚本。原因就是跨网站脚本是附在执行文件的路径后面的,因此$_SERVER[“PHP_SELF”]的字符串就会包含HTTP链接后面的JavaScript程序代码。
XSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
如何避免:加上htmlspecialchars()
除此之外当用户提交表单时,我们将做以下两件事情:
使用 PHP trim() 函数去除用户输入数据中不必要的字符 (如:空格,tab,换行)。
使用PHP stripslashes()函数去除用户输入数据中的反斜杠 ()
因此我们可以定义一个函数专门处理:<?php // 定义变量并默认设置为空值 $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = test_input($_POST["name"]); $email = test_input($_POST["email"]); $website = test_input($_POST["website"]); $comment = test_input($_POST["comment"]); $gender = test_input($_POST["gender"]); } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>"> <select name="choose"> <option value="beijing">beijing</option> <option value="shanghai">shanghai</option> </select> <input type="submit"> <p> <?php $value = isset($_GET['choose'])?htmlspecialchars($_GET['choose']):'无'; echo $value; ?> </p> <?php echo $_SERVER['PHP_SELF'] ?> </form>
php高级教程
php文件
- fopen() 函数用于在 PHP 中打开文件。此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件
- fclose() 函数用于关闭打开的文件
- feof() 函数检测是否已到达文件末尾(EOF)。if (feof($file)) echo “End of file”;
- fgets() 函数用于从文件中逐行读取文件。在调用该函数之后,文件指针会移动到下一行。
- fgetc() 函数用于从文件中逐字符地读取文件。注释:在调用该函数之后,文件指针会移动到下一个字符。
Cookie,Session
- setcookie(name, value, expire, path, domain); 设置cookie
- 获取 : echo $_COOKIE[“user”];
- setcookie(“user”, “”, time()-3600); // set the expiration date to one hour ago当删除 cookie 时,您应当使过期日期变更为过去的时间点。
- 在您把用户信息存储到 PHP session 中之前,首先必须启动会话。注释:session_start() 函数必须位于 标签之前:<?php session_start(); ?> 开启session放在首行即可
- 存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:
- 销毁 Session 如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。session_destroy() 将重置 session,您将失去所有已存储的 session 数据。
PHP 错误处理
- 简单的 “die()” 语句 可以终止程序运行
- 创建自定义错误处理器该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context):
- 触发错误 在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。在 PHP 中,这个任务由 trigger_error() 函数完成。
- 异常捕获:try{}catch(Exception $e){}
MySql
-
MySqlLi 面向对象连接
<?php $servername = "localhost"; $username = "root1"; $password = "123456"; $dbname = "zby"; $conn = new mysqli($servername, $username, $password,$dbname); // 检测连接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } echo "Connected successfully"; ?> \\关闭连接 $conn->close();
-
PDO 连接(切换数据库语言比较方便)
<?php $servername = "localhost"; $username = "username"; $password = "password"; try { $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password); echo "Connected successfully"; } catch(PDOException $e) { echo $e->getMessage(); } //关闭连接 $conn = null; ?>
-
更新,删除, 插入,创建都是$conn->query($sql);
-
多条插入
事务:$conn->beginTransaction() $conn->commit() $conn->rollback()
$conn = new mysqli($servername, $username, $password, $dbname); $arr=['a','b']; $sql=""; foreach ($arr as $value) { $sql.="insert into user(name)values('$value');"; } print_r($sql); $conn->multi_query($sql);
-
读取数据,fetch_row():以索引形式拿行[0]=>13 [1]=>张三 fetch_array():fetch_row()和fetch_assoc()的结合体 fetch_all():以上三种都是一行一行的读取,这个可以一次性读取,里面可以传参(MYSQL_ASSOC,…),改变读取的形式。$result->free_result():释放结果集。
$sql="select * from user;"; $result = $conn->query($sql); if ($result->num_rows > 0) {//如果有数据 while($row = $result->fetch_assoc()) {//从结果中拿取每一条数据,并赋值给row变量 echo $row['id'].' '.$row['name']; } }```
预处理语句
-
php 8有简写
$conn = new mysqli($servername, $username, $password, $dbname); $sql="select * from user where name like concat('%',?,'%')"; $stmt = $conn->prepare($sql); $name="王"; $stmt->bind_param("s",$name); $stmt->execute(); $result = $stmt->get_result(); print "<pre>";//用于格式化的 print_r($result->fetch_all());