用户交互
基本结构
核心架构和输出操作
php的基本结构是这样的:
1
2
3
|
<?php
echo "Hello World!";
?>
|
此处echo就相当于Python里的print输出
且中间部分每行结尾一定一定要加;(因为真的很容易忘)
变量
此外,再输出内容中如果有多个部分组成请用英文句号.隔开(相当于python中print里的逗号全部换成句号,仅此而已)例如:
1
2
3
4
|
<?php
$a = "Hi!";
echo $a."Hello!";
?>
|
if 判断
Quickstart:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
// 定义一个简单的变量
$age = 18;
// if判断:如果$age大于等于18,执行花括号里的代码
if ($age >= 18) {
echo "你已经成年啦!";
}
// 再补一个if-else的简单例子
$score = 59;
if ($score >= 60) {
echo "考试及格啦!";
} else {
echo "考试不及格,继续加油!";
}
?>
|
由此可见,它的基本结构是这样的:
1
2
3
4
5
6
7
|
if (判断条件) {
语句块1;
语句块2;
} else {
语句块1;
语句块2;
}
|
while 循环
Quickstart:
1
2
3
4
5
6
7
8
9
10
11
|
<?php
// 初始化计数器
$i = 1;
// while循环:只要$i小于等于5,就执行循环体
while ($i <= 5) {
echo "当前数字是:{$i}<br/>";
// 计数器自增(必须写,否则会无限循环!)
$i++;
}
?>
|
由此可见,它的基本结构应该是这样的:
1
2
3
4
|
while (循环判断条件) {
语句块1;
语句块2;
}
|
变量格式
php中的变量没有数据类型,一律在变量名前面加上$,例如
1
2
3
4
|
<?php
$a = "Hi!";
echo $a;
?>
|
GET 命令
使用GET命令可以获取用户输入的信息并赋值给变量,例如:
1
2
3
4
|
<?php
$a = $_GET['name'];
echo $a;
?>
|
然后php可以通过地址(url)获取变量值,例如:
http://localhost/index.php?name=example
那如果有多个变量呢?
1
2
3
4
5
6
|
<?php
$a = $_GET['name'];
$b = $_GET['job'];
echo $a;
echo "你的工作是".$b;
?>
|
http://localhost/index.php?name=example&job=xxx即可
尤其注意: 在php文件后加上?变量名1=变量值1&变量名2=变量值2的格式
POST 命令
很简单,把上面的GET全改为POST就行了
1
2
3
4
|
<?php
$a = $_POST['name'];
echo $a;
?>
|
不过这时候需要我们手动去提交POST,像这样:

数据库交互之增删改查
登录phpmyadmin(http://localhost/phpmyadmin)创建一个示例数据库并随便写几条示例数据进去,过程略
连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
// 1. 配置连接
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "test"; //数据库库名
// 2. 创建链接
$conn = new mysqli($servername,$username,$password,$dbname);
// 3. 检测连接
if($conn->connect_error){
die("连接失败".$conn->connect_error);
}
?>
|
操作:查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?php
// 1. 配置连接
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "test"; //数据库库名
// 2. 创建链接(使用mysqli函数按格式填写所需参数)
$conn = new mysqli($servername,$username,$password,$dbname);
// 3. 检测连接
if($conn->connect_error){
die("连接失败".$conn->connect_error);
}
// 数据库查询语句================================================================
//准备一条数据库语句
$sql = "select * from db1 where id < 3"; // 这里相当于把查询指令赋值给$sql
// 执行sql语句并返回给变量
$result = $conn->query($sql);
// 判断result里是否有东西
if($result->num_rows>0){ // $result->num_rows获取结果集中的行数
// 输出数据
while($row = $result->fetch_assoc()){ // 每次从结果集中读取一行数据,并以关联数组形式返回
echo $row['id'].'-----'.$row['uid'].'-----'.$row['job'].'<br/>';
}
}else{
echo "无结果";
}
$conn->close(); // 关闭数据库
?>
|
特别的,这里使用的sql语句格式为"select * from 数据表名 where 筛选条件"
操作:增
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?php
// 1. 配置连接
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "test"; //数据库库名
// 2. 创建链接(使用mysqli函数按格式填写所需参数)
$conn = new mysqli($servername,$username,$password,$dbname);
// 3. 检测连接
if($conn->connect_error){
die("连接失败".$conn->connect_error);
}
// 数据库增语句==============================================================
//准备一条数据库语句
$sql = "insert into db1(uid,pwd,job) values('u5','666','driver')"; // 这里相当于把增加指令赋值给$sql
if($conn->query($sql)===true){
echo "新纪录插入成功"
}else{
echo "插入失败".$conn->error;
}
$conn->close(); // 关闭数据库
?>
|
特别的,这里使用的sql语句格式为:
"insert into 数据表名(关键字1,关键字2,关键字3) values('值1','值2','值3')"
操作:改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?php
// 1. 配置连接
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "test"; //数据库库名
// 2. 创建链接(使用mysqli函数按格式填写所需参数)
$conn = new mysqli($servername,$username,$password,$dbname);
// 3. 检测连接
if($conn->connect_error){
die("连接失败".$conn->connect_error);
}
// 数据库修改语句==============================================================
//准备一条数据库语句
$sql = "update db1 set pwd='mima' where uid='u2'";
if($conn->query($sql)===true){
echo "修改成功"
}else{
echo "修改失败".$conn->error;
}
$conn->close(); // 关闭数据库
?>
|
特别的,这里使用的sql语句格式为:
$sql = "update 数据表名 set 关键字1=值1 where 关键字2=值2"
此处关键字1是实际修改内容,关键字2是用来定位要修改的条目
操作:删
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?php
// 1. 配置连接
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "test"; //数据库库名
// 2. 创建链接(使用mysqli函数按格式填写所需参数)
$conn = new mysqli($servername,$username,$password,$dbname);
// 3. 检测连接
if($conn->connect_error){
die("连接失败".$conn->connect_error);
}
// 数据库删除语句==============================================================
//准备一条数据库语句
$sql = "delete from db1 where uid=u4";
if($conn->query($sql)===true){
echo "删除成功"
}else{
echo "删除失败".$conn->error;
}
$conn->close(); // 关闭数据库
?>
|
特别的,这里使用的sql语句格式为:
$sql = "delete from 数据表名 where 关键字1=值1"
问题排查
数据库连接相关错误(最基础也最常见)
- 连接参数配置错误
- 触发方式:修改
$servername / $username / $password / $dbname 中的任意值,与数据库实际配置不匹配。
例:把 $dbname = "test" 改成 $dbname = "test123" (数据库不存在);把 $password = "root" 改成 $password = "123456" (密码错误)。
-
问题表现:页面直接输出“连接失败”+ 具体错误信息(如 Unknown database ’test123’ 或 Access denied for user ‘root’@’localhost’ (using password: YES) )。
-
问题根源:数据库连接的核心参数(地址、账号、密码、库名)必须与目标数据库完全一致,一旦 mismatch 就会连接失败。初学者常因“本地环境与服务器环境配置不同”“手误输错库名”踩坑。
- 未设置字符编码导致中文乱码
-
触发方式:数据库表/字段包含中文字符,且代码中未添加字符集设置。
-
问题表现:查询结果中的中文显示为 ??? 或乱码。
-
问题根源:MySQL 数据库默认字符集可能为 latin1 ,而 PHP 页面通常用 UTF-8 ,两者编码不匹配导致中文无法正常解析。代码中缺少字符集设置语句,是初学者最容易忽略的点。
-
如何触发:在数据库 db1 表的 job 字段中存入“程序员”“设计师”等中文字符,直接运行原代码,会发现中文乱码。
SQL 执行相关错误(隐性且易导致后续逻辑崩溃)
- SQL 语法/表名/字段名错误,导致 query() 返回 false
- 触发方式:修改 SQL 语句中的关键字、表名或字段名,导致 SQL 语法无效。
例1:把select * from db1 where id < 4 改成 selec * from db1 where id < 4( select 拼写错误);
例2:把 db1 改成 db1_not_exist (表不存在);
例3:把 id < 4 改成 id <(语法不完整)。
-
问题表现:页面报错 Trying to get property ’num_rows’ of non-object (试图访问非对象的 num_rows 属性)。
-
问题根源: $conn->query($sql) 执行失败时(SQL 语法错、表/字段不存在等),会返回 false (而非结果集对象)。原代码直接用 $result->num_rows ,相当于给 false 加 -> ,违反 PHP 语法(只有对象才能用 -> )。
- SQL 注入漏洞(安全层面的严重错误)
- 触发方式:将 SQL 中的硬编码条件(如 id < 4 )改为拼接用户输入的变量。
例:把 $sql = "select * from db1 where id < 4" 改成:
1
2
|
$user_input = $_GET['id']; // 假设用户输入:4 or 1=1
$sql = "select * from db1 where id < $user_input";
|
结果处理相关错误(逻辑疏忽导致)
- 字段名与代码访问名不匹配
- 触发方式:修改
$row['id'] / $row['uid'] / $row['job'] 中的字段名,或修改数据库表的字段名。
例:数据库表中字段名是 uid 而非 uid ,但代码中仍写 $row[‘userid’] ;或把 $row[‘job’] 改成 $row[‘work’] 。
- 循环中变量覆盖或未处理空结果集的边界情况
- 触发方式:在循环外定义了同名变量 $row ,或修改 num_rows 的判断逻辑。
例:在 while 循环前添加 $row = [‘id’ => 100]; ,会导致第一次循环覆盖初始值;或把 if($result->num_rows>0) 改成 if($result->num_rows) (看似等价,但如果 num_rows 为 0 时没问题,若 result 为 false 则报错,与前面 SQL 执行错误叠加)。
php和html混写实现网页美化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<html>
<head>
<title>测试网页</title>
<body>
<?php
// 1. 配置连接
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "test"; //数据库库名
// 2. 创建链接(使用mysqli函数按格式填写所需参数)
$conn = new mysqli($servername,$username,$password,$dbname);
// 3. 检测连接
if($conn->connect_error){
die("连接失败".$conn->connect_error);
}
// 数据库查询语句
$userinput = $_GET['num'];
//准备一条数据库语句
$sql = "select * from db1 where id <= $userinput"; // 这里相当于把查询指令赋值给$sql
// 执行sql语句并返回给变量
$result = $conn->query($sql);
// 判断result里是否有东西
if($result->num_rows>0){ // $result->num_rows获取结果集中的行数
// 输出数据====================================================================
echo "<table border='1'>";
echo "<tr><th>id</th> <th>uid</th> <th>job</th></tr>";
while($row = $result->fetch_assoc()){ // 每次从结果集中读取一行数据,并以关联数组形式返回
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['uid']."</td>";
echo "<td>".$row['job']."</td>";
echo "</tr>";
}
echo "</table>";
}else{ //=======================================================================
echo "无结果";
}
$conn->close(); // 关闭数据库
?>
</body>
</html>
|
分割线之间及代码头尾处有改动,分割线见主要实现了数据放置在表格中
命令行连接数据库
打开C:\phpstudy_pro\Extensions\MySQL5.7.26\bin
在此处启动CMD
下面是一些常用命令:
mysql -uroot -proot 登录数据库
show databases; 查看所有的库名
use xxx 使用(定位)xxx这个库名
show tables; 查看库中有什么表
select * from xxx 查看xxx这张表里的所有数据
此外所有php里的sql语句都可以在命令行之间使用