1.4 php基础:用户交互与数据库交互

学习php的基础语法,如何与用户及数据库交互,以及命令行直接操作数据库。

用户交互

基本结构

核心架构和输出操作

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"

问题排查

数据库连接相关错误(最基础也最常见)

  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 就会连接失败。初学者常因“本地环境与服务器环境配置不同”“手误输错库名”踩坑。

  1. 未设置字符编码导致中文乱码
  • 触发方式:数据库表/字段包含中文字符,且代码中未添加字符集设置。

  • 问题表现:查询结果中的中文显示为  ???  或乱码。

  • 问题根源:MySQL 数据库默认字符集可能为  latin1 ,而 PHP 页面通常用  UTF-8 ,两者编码不匹配导致中文无法正常解析。代码中缺少字符集设置语句,是初学者最容易忽略的点。

  • 如何触发:在数据库  db1  表的  job  字段中存入“程序员”“设计师”等中文字符,直接运行原代码,会发现中文乱码。

SQL 执行相关错误(隐性且易导致后续逻辑崩溃)

  1. 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 语法(只有对象才能用  -> )。


  1. 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";
  • 问题表现:恶意用户可通过输入  4 or 1=1  等语句,查询表中所有数据(甚至修改/删除数据),导致数据泄露。

  • 问题根源:原代码用“字符串拼接”方式构造 SQL(虽然当前是硬编码,无风险,但一旦接入用户输入就会触发注入),未使用 MySQLi 的预处理语句(参数化查询),无法过滤恶意输入。

结果处理相关错误(逻辑疏忽导致)

  1. 字段名与代码访问名不匹配
  • 触发方式:修改  $row['id'] / $row['uid'] / $row['job']  中的字段名,或修改数据库表的字段名。

例:数据库表中字段名是  uid  而非  uid ,但代码中仍写  $row[‘userid’] ;或把  $row[‘job’]  改成  $row[‘work’] 。

  • 问题表现:页面输出空值( ’’ )或报错  Undefined index: uid (未定义索引  uid )。

  • 问题根源: fetch_assoc()  返回的关联数组,键名必须与数据库表的实际字段名完全一致(大小写敏感,取决于数据库配置),一旦拼写错误或字段名修改后未同步代码,就会出现索引不存在的错误。

  1. 循环中变量覆盖或未处理空结果集的边界情况
  • 触发方式:在循环外定义了同名变量  $row ,或修改  num_rows  的判断逻辑。

例:在  while  循环前添加  $row = [‘id’ => 100]; ,会导致第一次循环覆盖初始值;或把 if($result->num_rows>0) 改成  if($result->num_rows) (看似等价,但如果  num_rows  为  0  时没问题,若  result  为  false  则报错,与前面 SQL 执行错误叠加)。

  • 问题表现:数据输出异常(首行数据错误)或报错(如前面提到的非对象访问)。

  • 问题根源:变量作用域未隔离(同名变量覆盖),或对  $result  的合法性判断不完整(只判断了行数,未判断  $result  是否为对象)。

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语句都可以在命令行之间使用

Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS