Linux系统第十四章学习笔记
前言
本章介绍了MySQL关系型数据库系统,介绍了MySQL并强调其重要性。提供了在Linux机器上安装和运行MySQL的指导,演示了如何在命令模式和批处理模式下使用SQL脚本创建和管理数据库。该章节还探讨了如何将MySQL与C编程进行接口,并与PHP集成,通过动态网页创建和管理数据库。
14.1 MySQL简介
MySQL(MySQL 2018)是一个关系型数据库系统(Codd 1970),其中数据存储在具有行和列的表中。表及其数据相关联,允许使用SQL(结构化查询语言)进行查询和数据修改,包括MySQL。
MySQL是一个开源数据库管理系统,包括服务器和客户端。用户连接客户端到服务器后,可以输入SQL命令来创建、删除和操作数据库。除了提供标准数据库服务外,MySQL与PHP(PHP 2018)结合在一起,成为许多网站进行数据管理和在线商务的支柱。本章介绍了MySQL的基础知识,包括在Linux中的安装/配置、创建和管理数据库以及如何在C和PHP环境中与MySQL进行接口。
14.2 安装MySQL
14.2.1 Ubuntu Linux
对于Ubuntu 16.04及更高版本,请通过以下命令安装MySQL:
sudo apt-get install mysql-server
mysql-server包含MySQL服务器和客户端。在安装MySQL时,系统将要求设置root用户密码。您可以使用Ubuntu的相同登录密码。安装完成后,可以通过运行以下脚本为MySQL配置更好的安全性:
mysql_secure_installation
对于简单和标准的安全设置,读者可以按Y,然后按ENTER接受所有问题的默认值。
14.2.2 Slackware Linux
Slackware Linux预装了MySQL,但仍然需要进行配置。否则,Slackware在启动时将显示有关mysql数据库的错误消息。在Slackware 14.0或更早版本中,按照以下步骤配置MySQL。
-
设置my.cnf: MySQL在启动时加载名为my.cnf的配置文件。在/etc目录中有一些示例的my.cnf文件,如my-small.cnf、my-large.cnf等。选择所需的版本创建一个my.cnf文件,例如:
cp /etc/my-small.cnf /etc/my.cnf
-
安装所需的数据库: MySQL有一组所需的数据库,用于用户识别等。使用mysql用户作为超级用户,并使用以下命令安装初始所需的数据库。
mysql_install_db
-
设置所需的系统权限: 该步骤确保mysql用户对mysql系统拥有所有权。
chown -R mysql.mysql /var/lib/mysql
-
使/etc/rc.d/rc.mysqld可执行:
chmod 755 /etc/rc.d/rc.mysqld
这将在后续系统启动时自动启动MySQL守护程序mysqld。
在Slackware 14.2中,使用MariaDB代替MySQL。MariaDB基本上与MySQL相同,只是不与Oracle绑定。实际上,它仍然使用mysqld作为其守护程序名称。在Slackware 14.2中,MySQL已经有一个默认的.cnf文件,因此不再需要步骤1。按照上述步骤(2)到(4)配置MySQL。配置完成后,通过以下命令手动启动MySQL守护程序mysqld:
/etc/rc.d/rc.mysqld -start
14.3 使用MySQL
假设MySQL服务器已在Ubuntu或Slackware Linux机器上设置并运行。MySQL服务器可以配置为支持不同的用户。为简单起见,我们将仅假设root用户。为了使用MySQL,用户必须运行MySQL客户端以连接到服务器。MySQL支持来自远程IP主机的客户端连接。为简单起见,我们将在同一台机器上运行服务器和客户端,即默认的localhost。以下部分展示如何使用MySQL管理数据库。
14.3.1 连接到MySQL服务器
使用MySQL的第一步是运行MySQL客户端程序。从X-Window终端输入MySQL客户端命令mysql
,它连接到同一台计算机上默认localhost上的MySQL服务器。
mysql -u root –p # 指定带密码的root用户
Enter password: # 输入MySQL root用户密码
mysql> # MySQL提示符
连接到MySQL服务器后,您将访问MySQL shell,由mysql>提示符表示。MySQL shell的行为类似于常规shell。它显示mysql prompt >,要求用户输入用于MySQL服务器执行的SQL命令。与常规sh一样,它还维护一个命令历史记录,允许用户通过箭头键调用和修改以前的命令。然而,它只接受mysql命令或mysql脚本,而不是常规sh命令。在输入MySQL命令时,读者应注意以下事项:
- 所有MySQL命令行必须以分号结束。对于较长的命令,您可以在不同的行上输入命令短语(通过按ENTER键)。MySQL将继续通过->符号提示更多的输入,直到看到结束分号为止。
- MySQL命令行不区分大小写。虽然不是必需的,但通常习惯以大写编写MySQL命令,并以小写编写数据库、表、用户名或文本,以便清晰易识别。
14.3.2 显示数据库
SHOW DATABASES
命令显示MySQL中当前的数据库。
示例:
mysql> SHOW DATABASES;
+---------------------+
| Database |
+---------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+---------------------+
4 rows in set (0.01 sec)
14.3.3 创建新数据库
CREATE DATABASE dbname
命令如果尚不存在,将创建一个名为dbname的新数据库。可以使用可选的IF NOT EXISTS子句,以避免在数据库已经存在时出现错误消息。
示例:
mysql> CREATE DATABASE testdb;
Query OK; 1 row affected (0.02 sec) # MySQL响应
创建新数据库后,输入SHOW DATABASES
查看结果。
mysql> SHOW DATABASES;
+---------------------+
| Database |
+---------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+---------------------+
5 rows in set (0.00 sec)
14.3.4 删除数据库
DROP DATABASE dbname
命令如果存在则删除指定的数据库。该命令可以带有可选的IF EXISTS子句。请注意,DROP操作是不可逆的。一旦删除数据库,就无法撤销或恢复。因此,在使用时要小心。
示例:
mysql> DROP DATABASE testdb;
Query OK; one row affected (0.04 sec)
mysql> SHOW DATABASES;
+---------------------+
| Database |
+---------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+---------------------+
4 rows in set (0.01 sec)
14.3.5 选择数据库
假设MySQL已经有多个数据库。为了在特定数据库上操作,用户必须使用USE dbname
命令选择数据库。
示例:
mysql> CREATE DATABASE cs360;
Query OK, 1 row affected (0.00 sec)
mysql> USE cs360;
Database changed
14.3.6 创建表
本节展示如何在MySQL数据库中创建表。假设一个cs360数据库包含以下学生记录。
struct students {
int student_id; # 必须存在的整数ID号
char name[20]; # 20个字符的名字字符串
int score; # 整数考试分数,可能不存在
}
CREATE TABLE table_name
命令在当前数据库中创建表。该命令的语法形式是
CREATE TABLE [IF NOT EXISTS] tableName (
columnName columnType columnAttribute, ...
PRIMARY KEY(columnName),
FOREIGN KEY (columnNmae) REFERENCES tableName (columnNmae)
)
对于单个表的情况,不需要FOREIGN KEY子句。
示例:
mysql> CREATE TABLE students (
student_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name CHAR(20),
score INT
);
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW TABLES;
+---------------------+
| Tables_in_cs360 |
+---------------------+
| students |
+---------------------+
1 row in set (0.00 sec)
DESCRIBE
或DESC
命令显示表格格式和列属性。
mysql> DESCRIBE students;
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| student_id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
显示students表具有3个字段或列,其中
- "student_id"是一个整数,不能为空,用作主键,并且在添加新行时将自动递增其值。
- "name"是一个20个字符长的固定长度字符串,可以为NULL。
- "score"是一个整数。
在表中
,主键是用于唯一标识行的列或一组列。主键默认是唯一的。如上所示,name列可以为NULL,这可能导致具有有效student_id但没有name的行。为了避免这种情况,应将其声明为not null属性。
14.3.7 删除表
DROP TABLE table_name
命令删除指定的表。
示例:
mysql> CREATE TABLE dummy (
id INT PRIMARY KEY,
name CHAR(20)
);
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW TABLES;
+---------------------+
| Tables_in_cs360 |
+---------------------+
| students |
+---------------------+
| dummy |
+---------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE dummy;
mysql> SHOW TABLES;
+---------------------+
| Table_in_cs360 |
+---------------------+
| students |
+---------------------+
1 rows in set (0.01 sec)
14.3.8 MySQL中的数据类型
在继续之前,有必要了解MySQL中使用的基本数据类型,主要包括3个类别:数值、字符串、日期和时间。我们只展示每个类别中常用的一些数据类型。
-
数值类型:
- INT:整数(4字节)
- TINYINT:(1字节)
- SMALLINT:(2字节)
- FLOAT:浮点数
-
字符串类型:
- CHAR(size):固定长度字符串,1-255个字符。
- VARCHAR(size):可变长度字符串,但可能未使用所有空间。
- TEXT:可变长度字符串
-
日期和时间类型:
- DATE:YYYY-MM-DD格式的日期
- TIME:HH:MM:SS格式的时间
14.3.9 插入行
要向表中添加行,使用INSERT命令,其语法形式为
INSERT INTO table_name VALUES (columnValue1, columnValue2, … .);
示例:
mysql> INSERT INTO students VALUES (1001, 'Baker', 50);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM students;
+------------+-------+-------+
| student_id | name | score |
+------------+-------+-------+
| 1001 | Baker | 50 |
+------------+-------+-------+
1 row in set (0.00 sec)
类似地,我们可以将更多的学生记录插入表中。由于通过手动单个命令行插入许多条目很繁琐,我们可以创建一个包含许多INSERT命令行的MySQL脚本文件,并将其用作mysql的输入源文件。假设我们已经编辑了一个.sql脚本文件,如下所示。
/********* insert.sql脚本文件 **********/
INSERT INTO students VALUES (NULL, "Miller", 65);
INSERT INTO students VALUES (2001, "Smith", 76);
INSERT INTO students VALUES (NULL, "Walton", 85);
输入SOURCE insert.sql
让mysql使用sql脚本作为输入文件,如下所示
mysql> SOURCE insert.sql; # 使用insert.sql作为输入源文件
(Query OK, rows affected, etc)
mysql> SELECT * FROM students;
+------------+---------+-------+
| student_id | name | score |
+------------+---------+-------+
| 1001 | Baker | 50 |
| 1002 | Miller | 65 |
| 2001 | Smith | 76 |
| 2002 | Walton | 85 |
+------------+---------+-------+
4 rows in set (0.00 sec)
请注意,在插入新行时,如果ID号为NULL,则将按auto_increment从最后输入的ID值分配下一个值。
14.3.10 删除行
使用DELETE
命令从表中删除行,其语法形式为:
DELETE FROM table_name; -- 删除表中的所有行
DELETE FROM table_name WHERE condition; -- 根据条件删除行
示例:
为了演示删除操作,我们首先添加一行新记录,然后从表中删除它。
mysql> INSERT INTO students VALUES (NULL, 'Zach', '45');
mysql> SELECT * FROM students;
+------------+---------+-------+
| student_id | name | score |
+------------+---------+-------+
| 1001 | Baker | 50 |
| 1002 | Miller | 65 |
| 2001 | Smith | 76 |
| 2002 | Walton | 85 |
| 2003 | Zach | 45 |
+------------+---------+-------+
5 rows in set (0.00 sec)
mysql> DELETE FROM students WHERE name = 'Zach';
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM students;
+------------+---------+-------+
| student_id | name | score |
+------------+---------+-------+
| 1001 | Baker | 50 |
| 1002 | Miller | 65 |
| 2001 | Smith | 76 |
| 2002 | Walton | 85 |
+------------+---------+-------+
4 rows in set (0.00 sec)
14.3.11 更新表
UPDATE
命令用于修改表中现有的记录(列)。它的语法形式为:
UPDATE table_name SET col1 = value1, col2 = value2, ... WHERE condition;
示例:
假设我们想将Walton的分数更改为92。
mysql> UPDATE students SET score = 92 WHERE name = 'Walton';
mysql> SELECT * FROM students;
+------------+---------+-------+
| student_id | name | score |
+------------+---------+-------+
| 1001 | Baker | 50 |
| 1002 | Miller | 65 |
| 2001 | Smith | 76 |
| 2002 | Walton | 92 |
+------------+---------+-------+
4 rows in set (0.00 sec)
类似地,我们可以通过更改WHERE
条件来更新其他列的值。
14.3.12 修改表
ALTER TABLE
命令用于在现有表中添加、删除或修改列。它还用于在现有表上添加和删除各种约束。
(1) 更改表名
ALTER TABLE table_name RENAME TO new_name;
(2) 添加列
要在表中添加列,请使用以下命令:
ALTER TABLE table_name ADD column_name datatype;
(3) 删除列
要删除列,请使用以下命令:
ALTER TABLE table_name DROP column_name datatype;
(4) 修改列
要更改表中列的数据类型,请使用以下命令:
ALTER TABLE table_name ALTER COLUMN column_name datatype;
示例:
假设我们要在students表中添加一个名为grade的列,然后根据考试成绩为学生分配字母等级。
mysql> ALTER TABLE students ADD grade CHAR(2); -- 为'A'、'B+'等添加列
mysql> SELECT * FROM students;
+------------+---------+-------+-------+
| student_id | name | score | grade |
+------------+---------+-------+-------+
| 1001 | Baker | 50 | NULL |
| 1002 | Miller | 65 | NULL |
| 2001 | Smith | 76 | NULL |
| 2002 | Walton | 92 | NULL |
+------------+---------+-------+-------+
4 rows in set (0.00 sec)
添加grade列后,所有条目值最初为NULL。我们可以使用UPDATE
命令为学生分配字母等级。
mysql> UPDATE students SET grade = 'A' WHERE name = 'Walton';
mysql> SELECT * FROM students;
+------------+---------+-------+-------+
| student_id | name | score | grade |
+------------+---------+-------+-------+
| 1001 | Baker | 50 | NULL |
| 1002 | Miller | 65 | NULL |
| 2001 | Smith | 76 | NULL |
| 2002 | Walton | 92 | A |
+------------+---------+-------+-------+
4 rows in set (0.00 sec)
此外,我们还可以通过在WHERE
条件子句中使用分数范围来分配字母等级。
mysql> UPDATE students SET grade = 'A' WHERE score > 80;
mysql> SELECT * FROM students;
+------------+---------+-------+-------+
| student_id | name | score | grade |
+------------+---------+-------+-------+
| 1001 | Baker | 50 | NULL |
| 1002 | Miller | 65 | NULL |
| 2001 | Smith | 76 | NULL |
| 2002 | Walton | 92 | A |
+------------+---------+-------+-------+
4 rows in set (0.00 sec)
假设我们已经执行了以下命令:
mysql> UPDATE students SET grade = 'B' WHERE score >= 70 AND score < 80;
mysql> UPDATE students SET grade = 'C' WHERE score >= 60 AND score < 70;
mysql> UPDATE students SET grade = 'D' WHERE score < 60;
mysql> SELECT * FROM students;
+------------+---------+-------+-------+
| student_id | name | score | grade |
+------------+---------+-------+-------+
| 1001 | Baker | 50 | D |
| 1002 | Miller | 65 | C |
| 2001 | Smith | 76 | B |
| 2002 | Walton | 92 | A |
+------------+---------+-------+-------+
4 rows in set (0.00 sec)
14.3.13 相关表
到目前为止,我们展示的数据库只包含一个表。实际的数据库可能包含许多表,它们之间存在关联。在MySQL中,表
之间的关系通过使用主键-外键约束来定义。创建两个表之间的链接,其中一个表的主键与另一个表的外键关联。在MySQL中,表可以以多种方式相关,包括:
(1) 一对一(1-1)关系
一对一关系是指两个表之间的关系,这两个表基于仅有一个匹配行相互关联。可以使用主键-唯一外键约束创建这种关系。假设在cs360数据库中,每个学生都有一个唯一的电子邮件地址。我们可以在students表中包含每个学生的电子邮件地址,但这将需要在students表中添加一个额外的列。相反,我们可以创建一个单独的电子邮件表,其中仅包含学生电子邮件地址,并通过电子邮件表中的唯一外键在两个表之间定义1-1关系,该外键引用students表中的主键。
示例:
mysql> CREATE TABLE email (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT UNIQUE NOT NULL,
email CHAR(40),
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
接下来,我们将学生的电子邮件地址插入到电子邮件表中,然后查询电子邮件表并显示表内容。
mysql> INSERT INTO email VALUES (NULL, 2002, 'walton@wsu.edu');
mysql> INSERT INTO email VALUES (NULL, 2001, 'smith@gmail.com');
mysql> INSERT INTO email VALUES (NULL, 1002, 'miller@hotmail.com');
mysql> INSERT INTO email VALUES (NULL, 1001, 'baker@gmail.com');
mysql> SELECT * FROM email;
+----+------------+---------------------+
| id | student_id | email |
+----+------------+---------------------+
| 1 | 2002 | walton@wsu.edu |
| 2 | 2001 | smith@gmail.com |
| 3 | 1002 | miller@hotmail.com |
| 4 | 1001 | baker@gmail.com |
+----+------------+---------------------+
请注意,在电子邮件表中,student_id可以按任何顺序,只要它们都是唯一的。每个student_id都是一个外键,引用students表中的主键。
mysql> SELECT a.name, b.email FROM students a, email b WHERE
a.student_id = b.student_id;
+---------+---------------------+
| name | email |
+---------+---------------------+
| Walton | walton@wsu.edu |
| Smith | smith@gmail.com |
| Miller | miller@hotmail.com |
| Baker | baker@gmail.com |
+---------+---------------------+
(2) 一对多(1-M)关系
在数据库中,一对多或1-M关系比1-1关系更常见且更有用。一对多关系被定义为两个表之间的关系,其中一个表的一行可以在另一个表中具有多个匹配行。这种关系可以通过主键-外键关系创建。假设cs360课程有一本必修教材和一本参考书。学生可以通过书店订购这些书籍,并且书店使用book_order表来跟踪学生的书籍订单。每个书单都属于唯一的学生,但每个学生可能订购一本或多本书,也可能一个都不订购。因此,学生表和book_order表之间的关系是一对多的。与一对一关系的情况一样,我们可以使用book_order表中的外键引用students表中的主键来创建这种关系。有了两个表之间的关联,我们可以对表进行查询,以查看哪些学生没有订购必修教材等。
示例:
在此示例中,我们首先创建一个book_order表,向其添加外键并用来自学生的书籍订单填充该表。
mysql> CREATE TABLE book_order (
order_no INT PRIMARY KEY AUTO_INCREMENT,
student_id INT NOT NULL,
book_name CHAR(20),
date DATE
);
mysql> DESC book_order;
+------------+----------+------+------+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+------+---------+----------------+
| order_no | int(11) | NO | PRI | NULL | auto_increment |
| student_id | int(11) | NO | | NULL | |
| book_name | char(20) | YES | | NULL | |
| date | date | YES | | NULL | |
+------------+----------+------+------+---------+----------------+
4 rows in set (0.00 sec)
mysql> ALTER TABLE book_order ADD FOREIGN KEY (student_id)
REFERENCES students(student_id);
mysql> DESC book_order;
+------------+----------+------+------+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+------+---------+----------------+
| order_no | int(11) | NO | PRI | NULL | auto_increment |
| student_id | int(11) | NO | MUL | NULL | |
| book_name | char(20) | YES | | NULL | |
| date | date | YES | | NULL | |
+------------+----------+------+------+---------+----------------+
4 rows in set (0.00 sec)
mysql> INSERT INTO book_order VALUES ( 1, 1001, 'reference', '2018-04-16');
mysql> INSERT INTO book_order VALUES (NULL, 1001, 'textbook', '2018-04-16');
mysql> INSERT INTO book_order VALUES (NULL, 1002, 'textbook', '2018-04-18');
mysql> INSERT INTO book_order VALUES (NULL, 1002, 'reference', '2018-04-18');
mysql> INSERT INTO book_order VALUES (NULL, 2001, 'textbookd', '2018-04-20');
mysql> INSERT INTO book_order VALUES (NULL, 2002, 'reference', '2018-04-21');
14.5 PHP中的MySQL编程
PHP(PHP 2018)经常用作网站的前端,与数据库引擎(例如MySQL)在后端交互,通过动态Web页面存储和检索数据。PHP和MySQL的组合提供了广泛的选择,可创建从小型个人联系表单到大型企业门户的各种Web页面。本节涵盖了在PHP中进行MySQL基本编程的内容。
要通过PHP进行MySQL编程,读者必须能够访问既能与MySQL服务器进行接口交互的HTTPD服务器。对于Linux用户来说,这并不是问题,因为HTTPD和MySQL都可用于同一台Linux机器上。虽然HTTPD服务器和MySQL服务器不必在同一个IP主机上,但为方便起见,我们将假设它们在同一台计算机上,即相同的本地主机。以下讨论假设以下情况。
-
读者的Linux机器上同时运行HTTPD和MySQL服务器,并且HTTPD服务器已配置为支持PHP。读者可以参考第13章中如何为PHP配置HTTPD。
-
读者有一个用户帐户,并可以托管Web页面,可以通过http://localhost/~user_name访问。
-
一个能够访问互联网上的Web页面的Web浏览器。
14.5.1 在PHP中连接到MySQL服务器
在使用PHP进行MySQL编程时,第一步是连接到MySQL服务器。为方便起见,我们将假设MySQL服务器在同一台Linux机器上。以下是一个显示PHP脚本的示例,该脚本连接到MySQL服务器以创建一个名为cs362的新数据库。
<html>
<head>
<title>创建MySQL数据库</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = '替换为您的MySQL根密码';
$con = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$con) {
die('无法连接:' . mysql_error());
}
echo '连接成功<br />';
$sql = 'DROP DATABASE IF EXISTS cs362';
$retval = mysql_query($sql, $con);
if ($retval)
echo "已删除数据库cs362<br>";
$sql = 'CREATE DATABASE cs362';
$retval = mysql_query($sql, $con);
if (!$retval) {
die('无法创建数据库:' . mysql_error());
}
echo "成功创建数据库cs362\n";
mysql_close($con);
?>
</body>
</html>
像C一样,PHP和MySQL之间的接口由一组MySQL PHP API函数支持。PHP API函数的语法通常比其C对应物更简单。在调用PHP中的mysql函数时,习惯上使用具有值的PHP变量,而不是使用硬编码的字符串或数字作为参数。如上所示,该程序使用mysql_connect()连接到MySQL服务器。由于在MySQL中创建/删除数据库需要root用户权限,该程序将作为root用户连接到MySQL服务器。与C编程一样,标准的PHP查询函数也是mysql_query()。程序结束时,它发出mysql_close()以关闭连接。
14.5.2 在PHP中创建数据库表
下一个程序显示了如何在现有数据库中使用PHP创建表。为了便于识别,突出显示了用于删除表(如果存在)并创建新表的PHP代码。
<html>
<head>
<title>创建MySQL表</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = '替换为您的MySQL根密码';
$con = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$con) {
die('无法连接:' . mysql_error());
}
echo '连接到MySQL服务器成功<br>';
mysql_select_db('cs362'); // 使用之前创建的cs362
$sql = "DROP TABLE IF EXISTS students";
$retval = mysql_query($sql, $conn);
echo "在cs362中创建表<br>";
$sql = "CREATE TABLE students( ".
"student_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, ".
"name CHAR(20) NOT NULL, ".
"score INT, ".
"grade CHAR(2)); ";
$retval = mysql_query($sql, $conn);
if (!$retval) {
die('无法创建表:' . mysql_error());
}
echo "成功创建表\n";
mysql_close($conn);
?>
</body>
</html>
14.5.3 在PHP中插入表记录
下面的程序显示了如何使用PHP向数据库表中插入记录。
<html>
<head>
<title>向MySQL数据库插入记录</title>
</head>
<body>
<?php
if (isset($_POST['submit'])) { // 如果用户提交了数据
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = '替换为您的MySQL根密码';
$con = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$con) {
die('无法连接:' . mysql_error());
}
echo "成功连接到服务器<br>";
mysql_select_db('cs362'); // 使用cs362数据库
$student_id = $_POST['student_id'];
$name = $_POST['name'];
$score = $_POST['score'];
echo "ID=" . $student_id . " name=" . $name .
" score=".$score."<br>";
if ($student_id == NULL || $name == NULL || $score == NULL){
echo "ID、名称或分数不能为空<br>";
} else {
$sql = "INSERT INTO students ".
"(student_id, name, score) "."VALUES ".
"('$student_id','$name','$score')";
$retval = mysql_query($sql, $con);
if (!$retval) {
echo "错误:" . mysql_error() . "<br>";
} else {
echo "输入数据成功\n";
mysql_close($con);
}
}
}
?>
<br>
<!-- 一个用于用户输入和提交数据的表单 -->
<form method="post" action="<?php $_PHP_SELF ?>">
学号:<input name="student_id" type="text" id=student_id"><br>
姓名   :<input name="name" type="text" id="name"><br>
分数   :<input name="score" type="text"
id="score"><br><br>
<input name=" submit " type="submit" id="submit" value="Submit">
</form>
</body>
</html>
如果操作成功,图14.3显示了插入操作的结果。如果成功,它返回另一个表单,供用户输入和提交更多插入请求。
14.5.4 在PHP中检索MySQL查询结果
下面的程序P14.3显示了如何在PHP中检索和显示查询结果。
<html>
<head>
<title>从MySQL数据库选择记录</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = '替换为您的MySQL根密码';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$con) {
die('无法连接:' . mysql_error());
}
mysql_select_db('cs362');
echo "选择1行<br>";
$sql = 'SELECT student_id, name, score FROM students
WHERE name="Baker"';
$retval = mysql_query($sql, $con);
if (!$retval) {
die('无法检索数据:' . mysql_error());
}
while ($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "student_id = {$row['student_id']} ".
"name = {$row['name']} ".
"score = {$row['score']} <br> ".
"--------------------------------<br>";
}
echo "选择所有行<br>";
$sql = 'SELECT * FROM students';
$retval = mysql_query($sql, $con);
if (!$retval) {
die('无法检索数据:' . mysql_error());
}
while ($row = mysql_fetch_assoc($retval)) {
echo "student_id = {$row['student_id']} ".
"name = {$row['name']} ".
"score = {$row['score']}<br> ";
}
echo "--------------------------------<br>";
echo "成功选择数据\n";
mysql_close($con);
?>
</body>
</html>
程序P14.3显示了如何从数据库中选择一行。它通过mysql_fetch_assoc()函数将行作为关联数组\(row检索,并按名称显示\)row的内容。它还显示了如何选择所有行,并通过相同的mysql_fetch_assoc()函数检索行,并将每行的内容显示为关联数组。关联数组是PHP和Perl中的标准功能,但在C中不可用。
14.5.5 在PHP中进行更新操作
下一个程序P14.4显示了如何在PHP中更新MySQL表。
<html>
<head> <title>在NySQL数据库中更新表</title></head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = '替换为您的MySQL根密码';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$con) {
die('无法连接:' . mysql_error());
}
echo '连接到服务器成功<br>';
mysql_select_db('cs362');
$sql = 'UPDATE students SET grade = \'A\'
WHERE score >= 90';
$retval = mysql_query($sql, $conn);
if (!$retval) {
die('无法更新数据:' . mysql_error());
}
echo "成功更新数据\n";
mysql_close($conn);
?>
</body>
</html>
练习: 修改C14.4程序,根据学生分数范围分配字母等级‘B’到‘F’。更新等级后,运行PHP程序P14.3以验证结果。
14.5.6 在PHP中删除行
下面的PHP程序P14.5从MySQL表中删除一行。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = '替换为您的MySQL根密码';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$con) {
die('无法连接:' . mysql_error());
}
mysql_select_db('cs362');
$sql = 'DELETE FROM students WHERE name=\'Zach\'';
$retval = mysql_query($sql, $con);
if (!$retval) {
die('无法删除数据:' . mysql_error());
}
echo "已成功删除数据\n";
mysql_close($conn);