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。

  1. 设置my.cnf: MySQL在启动时加载名为my.cnf的配置文件。在/etc目录中有一些示例的my.cnf文件,如my-small.cnf、my-large.cnf等。选择所需的版本创建一个my.cnf文件,例如:

    cp /etc/my-small.cnf /etc/my.cnf
    
  2. 安装所需的数据库: MySQL有一组所需的数据库,用于用户识别等。使用mysql用户作为超级用户,并使用以下命令安装初始所需的数据库。

    mysql_install_db
    
  3. 设置所需的系统权限: 该步骤确保mysql用户对mysql系统拥有所有权。

    chown -R mysql.mysql /var/lib/mysql
    
  4. 使/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)

DESCRIBEDESC命令显示表格格式和列属性。

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主机上,但为方便起见,我们将假设它们在同一台计算机上,即相同的本地主机。以下讨论假设以下情况。

  1. 读者的Linux机器上同时运行HTTPD和MySQL服务器,并且HTTPD服务器已配置为支持PHP。读者可以参考第13章中如何为PHP配置HTTPD。

  2. 读者有一个用户帐户,并可以托管Web页面,可以通过http://localhost/~user_name访问。

  3. 一个能够访问互联网上的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>

连接到MySQL服务器的结果

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>
    姓名 &emsp;&emsp;:<input name="name" type="text" id="name"><br>
    分数 &emsp;&emsp;:<input name="score" type="text"
                           id="score"><br><br>
    <input name=" submit " type="submit" id="submit" value="Submit">
</form>
</body>
</html>

PHP生成的用户输入数据和提交请求的表单

如果操作成功,图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);

苏格拉底挑战

MySQL索引的重要性

posted @ 2023-12-01 18:53  20211120  阅读(4)  评论(0编辑  收藏  举报