获取参数
GET请求:PHP $_GET 变量
在 PHP 中,预定义的 $_GET 变量用于收集来自 method=”get” 的表单中的值。
比如
URL:http://127.0.0.1/test.php?id=122&fname=ericzeng&gender=male
那么可以通过一下方式调用获得的参数
1
2
3
欢迎 <?php echo $_GET["fname"]; ?>!<br>
ID为<?php echo $_GET["122"]; ?><br>
你的性别是 <?php echo $_GET["gender"]; ?> 岁。
何时使用 method=”get”? 在 HTML 表单中使用 method=”get” 时,所有的变量名和值都会显示在 URL 中。 注释:所以在发送密码或其他敏感信息时,不应该使用这个方法!
然而,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。
注释:HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。
POST请求:PHP $_POST 变量
在 PHP 中,预定义的 $_POST 变量用于收集来自 method=”post” 的表单中的值。
预定义的 $_POST 变量用于收集来自 method=”post” 的表单中的值。
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
注释:然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。
比如:form.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
<meta charset="utf-8">
<title>Document</title>
</head>
<body>
<form action="http://127.0.0.1/welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>
</body>
</html>
此时跳转的URL地址为:127.0.0.1/welcome.php
,请求的信息不会含在URL中。
与$_GET
类似,可以通过$_POST["fname"]
的方式访问请求参数。
welcome.php代码如下:
1
2
欢迎 <?php echo $_POST["fname"]; ?>!<br>
你的年龄是 <?php echo $_POST["age"]; ?> 岁。
通杀神器:PHP $_REQUEST 变量
预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。
$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。
实例
你可以将 “welcome.php” 文件修改为如下代码,它可以接受 $_GET、$_POST
等数据。
1
2
欢迎 <?php echo $_REQUEST["fname"]; ?>!<br>
你的年龄是 <?php echo $_REQUEST["age"]; ?> 岁。
连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
创建数据表
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
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "test";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 使用 sql 创建数据表
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
//NOT NULL - 每一行都必须含有值(不能为空),null 值是不允许的。
//DEFAULT value - 设置默认值
//UNSIGNED - 使用无符号数值类型,0 及正数
//AUTO INCREMENT - 设置 MySQL 字段的值在新增记录时每次自动增长 1
//PRIMARY KEY - 设置数据表中每条记录的唯一标识。 通常列的 PRIMARY KEY 设置为 ID 数值,与 AUTO_INCREMENT 一起使用。
//每个表都应该有一个主键(本列为 "id" 列),主键必须包含唯一的值。
if (mysqli_query($conn, $sql)) {
echo "数据表 MyGuests 创建成功";
} else {
echo "创建数据表错误: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
连接数据表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "test";
// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
添加记录
单个添加记录
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)
批量添加记录
不断叠加SQL语句,请求一次
1
2
3
4
5
6
7
8
9
10
11
12
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
if (mysqli_multi_query($conn, $sql)) {
echo "新记录插入成功";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
使用预处理语句
mysqli 扩展提供了第二种方式用于插入语句。
我们可以预处理语句及绑定参数。
mysql 扩展可以不带数据发送语句或查询到mysql数据库。 你可以向列关联或 “绑定” 变量。
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
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
} else {
$sql = "INSERT INTO MyGuests(firstname, lastname, email) VALUES(?, ?, ?)";
// 为 mysqli_stmt_prepare() 初始化 statement 对象
//初始化statement
$stmt = mysqli_stmt_init($conn);
//预处理语句
if (mysqli_stmt_prepare($stmt, $sql)) {
// 绑定参数
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
//第二个参数‘sss'定义了参数的类型,可以是以下四种类型
//i - 整数
//d - 双精度浮点数
//s - 字符串
//b - 布尔值
// !如果是要添加其他类型数据(如timestamp),则不可用预处理语句
// 设置参数并执行
$firstname = 'John';
$lastname = 'Doe';
$email = 'john@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Mary';
$lastname = 'Moe';
$email = 'mary@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Julie';
$lastname = 'Dooley';
$email = 'julie@example.com';
mysqli_stmt_execute($stmt);
}
}
预处理大致分为三步:
-
预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 “?” 标记 。例如:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
-
数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
-
执行:最后,将应用绑定的值传递给参数(”?” 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
预处理的优点
- 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
- 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
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
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 预处理及绑定
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "新记录插入成功";
$stmt->close();
$conn->close();
?>
读取数据
从MySQL读取数据
SELECT column_name(s) FROM table_name
我们可以使用 * 号来读取所有数据表中的字段:
SELECT * FROM table_name
mysql_query()的返回值
mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。
对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。
非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。这并不说明任何有关影响到的或返回的行数。很有可能一条查询执行成功了但并未影响到或并未返回任何行。
link:https://www.w3school.com.cn/php/func_mysql_query.asp
PHP使用SELECT返回结果集
mysql_num_rows($result) 从结果集中获取数据记录的个数
mysql_num_fields($result) 从结果集中获取数据记录列的个数
mysql_fetch_row() 该函数将一条结果记录返回,并以一个普通索引数组的形式保存
mysql_fetch_assoc() 该函数将一条结果记录返回,并以一个普通关联数组形式保存
mysql_fetch_array() 默认同时以索引数组和关联数组保存,三个参数MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
mysql_fetch_object() 以一个对象的形式返回一条结果记录,他的各个字段需要以对象的形式进行访问
查询符合条件的数据
WHERE 子句:用于提取满足指定标准的的记录。
SELECT column_name(s)
FROM table_name
WHERE column_name operator value
下面的实例将从 “Persons” 表中选取所有 FirstName=’Peter’ 的行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$con=mysqli_connect("localhost","username","password","database");
// 检测连接
if (mysqli_connect_errno())
{
echo "连接失败: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT * FROM Persons
WHERE FirstName='Peter'");
while($row = mysqli_fetch_array($result))
{
echo $row['FirstName'] . " " . $row['LastName'];
echo "<br>";
}
?>