文章目录
MySQL是一个小型关系型数据库管理系统,与其他大型数据库管理系统:Oracle、DB2、SQL Server等相比,MySQL规模小、功能有限,但是它的体积小、速度快、成本低,最重要的是它是免费的开源的,而MySQL几乎也已经成为了PHP的标配。关于MySQL的使用,包含的内容很多,这里还是以PHP与MySQL的交互为主,无法涉及到MySQL的方方面面,有关MySQL的知识,推荐一本书《MySQL必知必会》,有兴趣的可以去看看。
MySQL数据库基础
首先,MySQL是关系型数据库,它将数据以表格的形式表现,每行为各种记录的名称,每列为记录名称所对应的数据域。行和列构成一张数据表,许多的表组成一个数据库。MySQL把数据存储在表格中,使用结构化查询语言SQL来访问数据库。
MySQL的特点:
- 开源
- 支持大型数据库,可以处理千万级数据。
- 使用标准的SQL数据语言形式。
- 跨平台,并支持多语言。如:C、C++、Python、Java、Perl、Efffel、Ruby等。
- 对PHP有很好的支持。
- 运行速度快。
MySQL的安装
- windows安装
访问MySQL官网,根据操作系统选择合适的版本下载。
双击下载得到的安装包,然后一路next,知道安装完成。 - Linux安装(以Ubuntu为例)
依次执行以下命令:
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
登陆MySQL
关于环境变量配置之类的在此不再累述,请自行百度。
如果没有配置环境变量,请cd到MySQL的安装目录,然后输入以下命令:
mysql -u root -p 你的密码
MySQL默认用户名为root,密码为空。如果在安装过程中修改了账号密码,请输入设置的账号和密码。
MySQL数据库的基本操作
在使用MySQL数据库时,经常会涉及到创建、展示、选择和删除MySQL数据库的操作,建议熟记这些命令的格式及使用方法。
-
创建数据库
语法格式:CREATE DATABASE database_name;
其中database_name为要创建的数据库的名称,该名称不能与已经存在的数据库重名。
SQL语句不区分大小写,创建数据库的语句也可以使用小写的
create database database_name
,数据库名称可以由任意字母、数字、下划线或者$
组成,但不能使用纯数字作为数据库的名称,也不能使用mysql关键字作为数据库名。【示例】
使用命令创建一个名为db_test的数据库:CREATE DATABASE db_test;
运行结果:
-
显示数据库
数据库创建好之后,可以使用SHOW CREATE DATABASE
声明查看数据库的定义。
可以使用SHOW DATABASES;
查询当前所有存在的数据库。 -
选择数据库
在对一个数据库操作之前,需要先选择数据库,MySQL中使用use选择数据库,语法如下:
USE db_name;
-
删除数据库
删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一同被删除。语法如下:
DROP DATABASE db_name;
MySQL数据类型
在MySQL中定义数据字段的类型对数据库的优化非常重要,MySQL支持三种类型:数值、日期/时间和字符串(字符)类型。
-
数值类型
MySQL支持所有标准SQL数值数据类型。如下表:类型 大小 范围(有符号) 范围(无符号) 说明 TINYINT 1字节 (-128, 127) (0,255) 小整数值 SMALLINT 2字节 (-32768,32767) (0,65535) 大整数值 MEDIUMINT 3字节 (-8388608, 8388607) (0,16777215) 大整数值 INT或INTEGER 4字节 (-2147483648,2147483647) (0,4294967295) 大整数值 BIGINT 8字节 (-2^63, -2^63 - 1) (0,2^64 - 1) 极大整数值 FLOAT 4字节 (-3.402823466 E+38, 1.175494351 E-38) (0,1.175494351E-38, 3.402823466 E+38) 单精度浮点数值 DOUBLE 8字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308) (0, (2.2250738585072014 E-308, 1.7976931348623157E+308) 双精度浮点数值 DECIMAL 对DECIMAL(M,D),如果M>D,就为M+2,否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值 -
日期和时间类型
每个时间类型都有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。类型 大小 范围 格式 说明 DATE 3字节 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3字节 -838:59:59’/'838:59:59 HH:MM:SS 时间值或持续时间 YEAR 1字节 1901/2155 YYYY 年份值 DATETIME 8字节 1000-01-01 00:00:00 / 9999-12-31 23:59:59 YYYY-MM-DD H:MM:SS 混合日期和时间值 TIMESTAMP 8字节 1970-01-01 00:00:00/2037年某时 YYYYMMDDHMMSS 混合日期和时间值时间戳 -
字符串类型
类型 大小/字节 说明 CHAR 0-255 定长字符串 VARCHAR 0-65535 变长字符串 TINYBLOB 0-255 不超过255个字符的二进制字符串 TINYTEXT 0-255 短文本字符串 BLOB 0-65535 二进制形式的长文本数据 TEXT 0-65535 长文本数据 MEDIUMBLOB 0-16777215 二进制形式的中毒长度文本数据 MEDIUMTEXT 0-16777215 中等长度文本数据 LONGBLOB 0-4294967295 二进制形式的极大文本数据 LONGTEXT 0-4294967295 极大文本数据 CHAR和VARCHAR类型相似,但它们保存和检索的方式不同,它们的最大长度和是否尾部空格被保留等也不同。在存储或检索过程中不进行大小写转换。
BINARY和VARBINARY类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串,而不是字符字节串。这说明它们没有字符集,并且排序和比较基于列值字节的数值。
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4中BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同,支持任何数据,如文本、声音和图像等。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4中BLOB类型,有相同的长度和存储需求,但不能存储二进制文件。
MySQL数据表的基本操作
-
创建数据表
CREATE [TEMPRARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options][select_statement]
参数 说明 TEMPORARY 创建一个临时表 IF NOT EXISTS 检查表明是否已存在 create_definition 表的列属性 table_options 表的一些特性参数 select_statement select 语句描述部分,可以快速创建表 其中,create_definition部分是经常使用到的部分,每一列的具体定义格式如下:
col_name type [NOT NULL| NULL][DEFAULT default_value][AUTO_INCREMENT][UNIQUE [KEY]|[PRIMARY] KEY][COMMENT 'string'][reference_definition]
关于create_definition参数的说明如下表:
参数 说明 col_name 字段名 type 字段类型 NOT NULL|NULL NOT NULL表示该列不允许为空值,系统默认可为空值 DEFAULT default_value 设置字段默认值 AUTO_INCREMENT 设置该列为自动增长,一个表中只能有一个字段设置该属性 UNIQUE KEY|PRIMARY KEY QNIQUE KEY表示唯一性索引,PRIMARY KEY表示设置该列为主键 COMMENT ‘string’ 字段注释 下面演示创建一个名为test_table的表,该表包含id、title、anthor、content、submit_time、click字段。
CREATE TABLE `db_test`.`test_table`( `id` INT NOT NULL AUTO_INCREMENT, `title` VARCHAR(40) CHARACTER SET 'utf8' NOT NULL, `author` CHAR(10) NULL, `content` VARCHAR(45) NOT NULL COMMENT '文章内容', `submit_time` VARCHAR(45) NOT NULL, `click` INT(4) NULL DEFAULT 0, PRIMARY KEY(`id`)) ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COMMENT='文章内容表'
注意:数据库名、表名、字段名都是用反引号包裹起来的,不是单引号。
-
查看数据表结构
创建完一个表后,可以使用show columns
或者describe
语句查看指定数据表的结构。语法如下:
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name][LIKE 'pattern']
show columns显示在一个给定表中各列的信息,也可以使用describe
语句查看表结构,语法如下:
DESCRIBE table_name [column_name]
其中DESCRIBE可以简写为desc,在查看表结构时也可以只列出某一列的信息。 -
更改数据表结构
当我们需要修改数据表名或数据表字段名时,需要使用alter命令。其语法如下:ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification]...
其中,alter_specification定义的内容如下:
alter_spercification: // 添加新字段 ADD [COLUMN] create_definition [FIRST|AFTER column_name] // 添加索引名称 | ADD INDEX [index_name] (index_col_name,...) // 添加主键名称 |ADD PRIMARY KEY (index_col_name,...) // 添加唯一索引 |ADD UNIQUE[index_name](index_col_name,...) // 修改字段名称 |ALTER [COLUMN] col_name(SET DEFAULT literal | DROP DEFAULT) // 修改字段类型 |CHANGE [COLUMN] old_col_name create_definition // 添加子句定义类型 |MODIFY [COLUMN] create_definition // 删除字段 |DROP [COLUMN] col_name // 删除主键 |DROP PRIMARY KEY // 删除索引 |DROP INDEX index_name // 更改表名 |RENAME [AS] new_tbl_name |table_options |partition_options
alter table用于更改原有表的结构,可以增加或删减列、创建或取消索引、更改原有列的类型、重命名列或表,还可以更改表的评注和表的类型。alter table运行时会对原表机型临时复制,在副本上进行更改,然后删除原表,再对新表进行重命名。在执行alter table时,其他用户可以阅读原表,但是对标的更新和修改的操作将被延迟,知道新表生成为止。新表生成后,这些更新和修改信息会自动转移到新表行。
-
删除字段
alter table test_table drop click
以上命令将删除test_table表中的click字段。如果数据表中只剩余一个字段则无法用drop来删除字段。
-
添加字段
alter table test_table add click_times int(4)
以上命令将给表test_table添加字段click_times,其类型为int。
新增字段会自动添加到数据表字段的末尾。如果你需要制定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。举例如下:// 将字段i添加到数据表的第一列 alter table test_table add i int first; // 将字段click_times添加到click之后 alter table test_table add click_times int(4) after click;
first和after关键字只作用于add子句,如果想重置字段的位置,需要先drop字段后,使用add添加字段到特定的位置。
-
修改字段类型
alter table test_table modify submit_time datetime
以上命令将修改表test_table中submit_time字段类型为datetime。
修改字段还可以使用change子句:
alter table test_table change submit_time submit_time datetime
使用change子句,在change关键字后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。 -
重命名表名
alter table test_table rename to table_test
以上命令将修改表test_table表名为table_test。 -
修改数据表类型
alter table test_table type = innobdb
以上命令将修改表test_table的类型为innobdb。
-
-
删除数据表
删除数据表使用drop table语句,语法如下:
drop table table_name[if exists]
其中if exists检查表是否存在,因为在删除一个不存在的表的情况下会报错。
操作MySQL数据
也就是我们通常说增删改查。
-
插入数据
插入数据有两种方法:
insert into table_name(column_1, column_2,...) values (value_1, value_2,...)
另一种:
insert into table_name set column_1=value_1, column_2=value_2,...
【示例】
使用第一种方法向test_table中插入数据。insert into test_table(title, author, content, submit_time, click) values ('hello', 'ib-top', 'hello mysql', now(), 10), ('hello1', 'ib-top', 'hello mysql', now(), 1);
以上代码中,now()是mysql函数,用于获取当前系统时间。
在MySQL中,可以一次性插入多行记录,各行记录之间用逗号隔开即可。
-
更新数据
更新数据使用update语句,语法如下:
update table_name set col_name1=expr1[, col_name2=expr2...][where where_definition]
其中set重新设定指定列的值,where子句指定记录中哪些行需要被更改,如果不设置where子句或where子句的值恒成立(如1=1),就将更新素有记录行的数据。
【示例】
一下命令将test_table中id=1的行中click列值更新为200。
update test_table set click=200 where id=1
-
删除数据
删除表中的数据使用delete语句,语法如下:
delete from tbl_name [where where_definition]
其中,where子句指定哪些行被删除,如果没有设置where子句或其恒成立,将会删除所有记录。
【示例】
delete from test_table where id=1
以上命令将删除test_table中id为1的行。
另外,MySQL还提供了一个可以清空数据表中所有数据的函数truncate,语法如下:
truncate table_name
-
查询数据
MySQL中提供的查询数据的语句非常强大,比如可以限定查询数量和查询起始位置、对查询结果进行分组排序、使用函数和表达式查询数据等。
select语法如下:SELECT [ALL|DISTINCT|DISTINCTROW] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT][SQL_BIG_RESULT[SQL_BUFFER_RESULT] [SQL_CACHE|SQL_NO_CACHE][SQL_CALC_FOUND_ROWS] select_expr,... [INTO OUTFILE 'file_name' export_options |INTO DUMPFILE 'file_name'] [FROM table_references] [WHERE where_definition] [GROUP BY {col_name|expr|position} [ASC|DESC],...[WITH ROLLUP]] [HAVING where_definition] [ORDER BY {col_name|expr|position} [ASC|DESC],...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [FOR UPDATE|LOCK IN SHARE MODE]
关于select语句参数说明如下:
参数 说明 all|distinct|distinctrow 使用DISTINCT可去除结果中重复的行 into outfile 将查询结果导出到文件 from 被查询的表 where 查询条件 group by 将查询结果分到不同的组中 having 可筛选成组后的各种数据 order by 对结果进行排序 limit 限定查询结果行数 like 模糊查询
MySQL数据库的备份与还原
数据备份与还原是数据库管理员非常重要的工作。
数据备份
-
使用mysqldump命令备份
该命令可以将数据库备份成一个文本文件,该文件中实际上包含多个CREATE和INSERT语句,使用这些语句可以重新创建表和插入数据。
语法格式:
mysqldump -u user -h host -password dbname[tbname, [taname...]] > filename.sql
其中user表示数据库用户名,host表示主机名称,password是登陆密码,dbname为需要备份的数据库名称,tbname为需要备份的数据表,可以指定多个需要备份的表,filename.sql为备份文件的名称。
mysqldump命令还有一些其他选项可以用来制定备份过程:参数名 说明 使用格式(默认值) –add-drop-database 在 CREATE DATABLE
前添加DROP DATABASE
语句–add-drop-table 在 CREATE TABLE
前添加DROP TABLE
语句默认开启 –add-drop-user 在 CREATE USER
前添加DROP USER
语句–add-drop-trigger 在 CREATE TRIGGER
前添加DROP TRIGGER
语句–add-locks 在每个表导出时添加 LOCK TABLES
并且之后进行UNLOCK TABLES
默认开启 –all-databases 导出所有数据库 –allow-keywords 允许创建以关键字为列名的列 –apply-slave-statements 在 CHANGE MASTER
前添加STOP SLAVE
语句,在导出最后START SLAVE
–bind-address 使用指定的网络接口连接MySQL数据库 –character-sets-dir 指定安装字符集的目录 –comments 将注释导入到dump文件中 默认开启 –compact 产生更少的输出信息 –compatible 导出的数据将与其它类型数据库或旧版本的MySQL兼容,值可以为ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等 –complete-insert 使用完整的包含列名的插入语句 –compress 在客户端与服务器间压缩传递所有的信息 –create-options 在CREATE TABLE语句中包含所有MySQL表特性选项 默认打开 –databases 输入后的所有参数都作为数据库名 –debug 输出debug日志 –debug-check 当程序退出时,打印debug信息 –debug-info 当程序退出时输出debug信息、内存和CPU信息 –default-auth 使用认证插件 –default-character-set 指定默认字符集 默认值为utf8 –defaults-extra-file 读取配置文件 –defaults-file 只读命名文件 –defaults-group-suffix Option group suffix value –delete-master-logs 在master备份后删除日志 –disable-keys For each table, surround INSERT statements with statements to disable and enable keys –dump-date Include dump date as “Dump completed on” comment if --comments is given –dump-slave 该选项将导致主的binlog位置和文件名追加到导出数据的文件中 –enable-cleartext-plugin Enable cleartext authentication plugin 5.7.10启用 –events 从数据库导出event –extended-insert 使用多行插入语句 –fields-enclosed-by 输出文件中的各个字段用给定字符包裹。与 --tab
选项一起使用–fields-escaped-by 输出文件中的各个字段忽略给定字符。与–tab选项一起使用 –fields-optionally-enclosed-by 输出文件中的各个字段用给定字符选择性包裹。与–tab选项一起使用 –fields-terminated-by 导出文件中忽略的指定字段,与 --tab
一起使用–flush-logs 在开始导出前刷新日志 –flush-privileges 在导出数据库后,执行 FLUSH PRIVILEGES
–force 在导出表的过程中忽略出现的SQL错误 –get-server-public-key 从服务获取RSA公共key 5.7.23 –help 展示帮助信息并退出 –hex-blob 使用十六进制格式导出二进制字符串字段 –host 要连接的远程主机IP –ignore-error 忽略指定错误 5.7.1启用 –ignore-table 不导出指定表 –include-master-host-port 在 --dump-slave
产生的CHANGE MASTER TO..
语句中增加MASTER_HOST=,MASTER_PORT=
–insert-ignore 用 INSERT IGNORE
替代INSERT
–lines-terminated-by 输出文件的每行用给定字符串划分。与–tab选项一起使用 –lock-all-tables 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 –lock-tables 在dump表之前锁表 –log-error-file 导出警告和错误信息到指定文件 –login-path Read login path options from .mylogin.cnf –master-data 该选项将binlog的位置和文件名追加到输出文件中 –max-allowed-packet 设置从服务接收或发送到服务的最大包长度 –net-buffer-length 设置TCP/IP 和socket连接的缓存大小 –no-autocommit 使用autocommit/commit 语句包裹表。 –no-create-db 不导出建库语句 –no-create-info 不导出建表语句 –no-data 不导出表数据 –no-defaults Read no option files –no-set-names 等同于 --skip-set-charset
–no-tablespaces 不导入表空间信息 –opt 等同于–add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 该选项默认开启, 可以用–skip-opt禁用. –order-by-primary 导出每个表的数据行时按照表的主键或者第一个唯一字段排序 –password 连接数据库的密码 –pipe 在Windows,使用命名管道连接mysql –plugin-dir 指定插件安装的目录 –port 数据库连接的端口 –print-defaults 输出默认参数 –protocol 连接所用的协议 –quick 不缓冲查询,直接导出到标准输出 默认打开 –quote-names 使用(`)引起表和列名 默认开启 –replace 用 REPLACE
取代INSERT
语句–result-file 直接输出到指定文件中 –routines 导出保存的routine(存储过程和函数) –secure-auth 不以旧形式向服务发送密码 5.7.4启用,5.7.5弃用 –server-public-key-path Path name to file containing RSA public key 5.7.23 –set-charset 添加 SET NAMES default_character_set
到输出文件默认开启 –set-gtid-purged Whether to add SET @@GLOBAL.GTID_PURGED to output –shared-memory-base-name The name of shared memory to use for shared-memory connections –single-transaction 选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和–lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用–quick 选项。 –skip-add-drop-table 不在 CREATE TABLE
前添加DROP TABLE
语句–skip-add-locks 导出时不加锁 –skip-comments 不导出注释 –skip-compact 不减少输出信息 –skip-disable-keys 不disable key –skip-extended-insert 关闭extended-insert –skip-opt 关闭 --opt
设定的–skip-quick 进行数据缓冲Do not retrieve rows for a table from the server a row at a time –skip-quote-names 取消1–quote-names` –skip-set-charset 不设置字符集 –skip-triggers 不导出触发器 –skip-tz-utc 关闭时区设置 –socket 指定连接mysql的socket文件位置 –ssl Enable encrypted connection –ssl-ca File that contains list of trusted SSL Certificate Authorities –ssl-capath Directory that contains trusted SSL Certificate Authority certificate files –ssl-cert File that contains X.509 certificate –ssl-cipher List of permitted ciphers for connection encryption –ssl-crl File that contains certificate revocation lists –ssl-crlpath Directory that contains certificate revocation list files –ssl-key File that contains X.509 key –ssl-mode Security state of connection to server 5.7.11 –ssl-verify-server-cert Verify host name against server certificate Common Name identity –tab为每个表在给定路径创建tab分割的文本文件 –tables 覆盖–databases (-B)参数,指定需要导出的表名。 –tls-version Protocols permitted for encrypted connections 5.7.10 –triggers 导出触发器 –tz-utc 添加 SET TIME_ZONE='+00:00'
到导出的文件中,保证导出数据的时区正确性–user 指定连接MySQL的用户名 ----verbose 输出多种平台信息。 –version 显示mysqldump的版本信息并退出 5.7.9 –where 只导出符合where条件的数据 –xml 导出XML格式. -
直接复制整个数据库目录
这是一种简单、快速、有效的备份方式。要想保持备份的一致性,备份前需要对相关表执行LOCK TABLES操作,然后对表执行FLUSH TABLES。这样当复制数据库目录中的文件时,允许其他客户继续查询表。需要FLUSH TABLES语句来确保开始备份前将所有激活的索引页写入硬盘。当然,也可以停止MYSQL服务再进行备份操作。 -
使用mysqlhotcopy工具快速备份
mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。它是备份数据库或单个表的最快途径,但它只能运行在数据库目录所在的机器上,并且只能备份MYISAM类型的表。
数据还原
- 使用mysql命令还原
对于已经备份的包含CREATE、INSERT语句的文本文件,可以使用mysql命令导入到数据库中。其命令语法如下:
mysql -u user -p [dbname] < filename.sql;
user是用户名,-p表示输入用户密码,dbname是数据库名。如果filename.sql文件为mysqldump工具创建的包含创建数据库语句的文件,执行的时候不需要制定数据库名。 - 直接赋值到数据库目录
如果数据库通过复制数据库文件备份,可以直接复制备份文件到MYSQL数据目录下实现还原。通过这种方式还原时,必须保证备份数据局的数据库和待还原的数据库服务器的主版本号相同。而且这种方式只对MYISAM引擎的表有效,对于InnoDB引擎的表不可用。
执行还原前需要关闭MYSQL服务,然后将备份文件和目录覆盖MySQL的data目录,然后启动MySQL服务。对于Linux/UNIX操作系统来说,还需要将文件的用户和组更改为MySQL运行的用户和组,通常用户是MySQL,组也是MySQL。 - mysqlhotcopy快速恢复
使用mysqlhotcopy备份后的文件可以用来恢复数据库,在MySQL服务器停止运行时,将备份的数据库文件复制到MySQL存放数据的位置(MySQL的data文件夹),重新启动MySQL服务即可。
PHP操作MySQL数据库
PHP与MySQL是在编程中经常搭配使用的。在一般的网站架构模式中经常采用LAMP的形式,即Linux、Apache、MySQL、PHP,还有一种就是非常流行的LNMP,其中N代表Nginx服务器。
在PHP5.x的版本中支持三种PHP扩展方式连接数据库:mysql、mysqli和PDO。在PHP7中去掉了纯面向过程的mysql连接数据库的方式。
从PHP5开始,默认情况下不再自动开启对MySQL的支持,而是放到扩展函数库中,所以,需要首先打开php.ini中的相关扩展,找到";extension=php_mysqli.dll",并去掉前面的分号。
mysqli连接操作数据库
mysqli支持面向过程和面向对象两种风格的操作数据库的形式。操作数据库分3个步骤:
- 连接数据库和选择数据库。
- 执行SQL语句。
- 关闭结果集。
连接和选择数据库
-
面向过程风格的连接数据库语法如下:
mysqli_connect([string $host[, string $username[, string $passwd=[, stirng $dbname=""[, int $port[, string $socket]]]]]])
【示例】
$db = mysqli_connect('localhost', 'root', '123456', 'db_test');
-
面向对象化风格的连接语法如下:
mysqli::connect([string $host[, string $username[, string $passwd=[, string $dbname=""[, int $port[, string $socket]]]]]])
【示例】
$db = new mysqli('localhost', 'root', '123456', 'db_test');
更改默认的数据库
连接到数据库以后,如果需要更改默认的数据库,就使用函数mysqli_select_db()
。语法为:
-
面向过程风格
mysqli_select_db(mysqli $link, string $dbname):bool
-
面向对象风格
mysqli::select_db(string $dbname):bool
关闭数据库连接
在完成了一次对服务器的使用的情况下,需要关闭此连接,以免对MySQL服务器中的数据进行误操作并对资源进行释放。
-
面向过程风格
mysqli_close(mysql $link):bool
-
面向对象风格
mysqli::close(void):bool
执行SQL语句
-
面向过程风格
mysqli_query(mysqli $link, string $query[, int $resultmode=MYSQLI_STORE_RESULT]):mixed
-
面向对象风格
mysqli::query(string $query[, int $resultmode=MYSQLI_STORE_RESULT]):mixed
示例
通过myslqi向表test_table中插入一行数据,代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "insert into test_table (title, author, content, submit_time, click) values(?,?,?,?,?)";
// 预设的SQL语句,表示需要绑定的参数
$title = 'titlemysqli';
$author = 'ib-top';
$content = 'test insert';
$submit_time = '2020-03-22 22:22:22';
$click = 100;
$stmt = $db->prepare($sql); // 预执行SQL语句
$stmt->bind_param("sssss", $title, $author, $content, $submit_time, $click);
// 绑定参数到SQL语句,注意第一个参数的字符数量要和后面的参数数量保持一致
if($stmt->execute()) { // 执行SQL语句
echo "数据插入成功!";
}
$db->close(); // 关闭连接
使用mysqli更新数据的示例代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "update test_table set title=? where id=1";
$title = 'mysqllititle';
$stmt = $db->prepare($sql);
$stmt->bind_param("s", $title);
if($stmt->execute()) {
echo "数据更新成功!";
}
$db->close();
使用mysqli删除表中的数据也很简单,示例代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "delete from test_table where id=?";
$id = 1;
$stmt = $db->prepare($sql);
$stmt->bind_param("s", $id);
if($stmt->execute()) {
echo "数据删除成功!";
}
$db->close();
对于查询数据表中的内容,mysqli也提供了多种传方式。示例代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
$db = new mysqli('localhost', 'root', '123456789', 'db_test');
$sql = "select * from test_table where click>99";
$res = $db->query($sql);
echo "<pre>";
while($arr=$res->fetch_assoc()) {
var_dump($arr);
}
echo "</pre>";
$res->free(); // 释放结果集
$db->close(); // 关闭连接
从以上代码的结果可以看到,结果数组中的索引是字段名称,值是字段的值。这是通过fetch_assoc
方式得到的结果,如果将fetch_assoc
换成fetch_array
,那么查询到的结果将同时包含索引数组和关联数组,其中索引数组的值为表中字段的值,如果换成row()
就只会得到索引数组。
PDO连接操作数据库
PDO扩展为PHP访问数据库定义了一个轻量级、一致性的接口。它提供了一个数据访问抽象层,无聊使用什么数据库,都可以通过一致的函数执行查询和获取数据。
PDO连接数据库
使用PDO创建一个数据库连接语法如下:
PDO::__construct(string $dsn[, string $username[, string $password[, array $driver_options]]])
其中,数据源名称或叫做DSN包含了请求连接到数据库的信息。连接成功就返回一个PDO对象,如果试图连接到请求的数据库失败就抛出一个PDO异常。
使用PDO连接数据库的示例代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:dbname=db_test;host=127.0.0.1';
$user = 'root';
$password = '123456789';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo '连接失败:'.$e->getMessage();
}
执行SQL语句
向test_table中插入数据的代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', '123456789');
$author = ['张三', '李四', '王五', '赵六', '孙七', '吴八'];
for ($i = 0; $i < 100; $i++) {
$sql = "insert into test_table(title, author, content, submit_time, click) values ('title" . $i . "','" . $author[rand(0, 5)] . "', 'content" . $i . "', '" . date('Y-m-d H:i:s') . "', " . rand(100, 1000) . ")";
// echo $sql;
if ($db->exec($sql)) { // 执行SQL语句
echo "插入成功<br />";
} else {
var_dump($db->errorInfo()); // 错误信息
exit();
}
}
使用PDO更新表中的内容与mysqli差不多,也很简单,代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', '12346789');
$sql = "update test_table set title='titlepdo' where id>50";
if ($db->exec($sql)) {
echo "更新成功!";
} else {
var_dump($db->errorInfo());
exit();
}
删除操作也类似于mysqli,再次不在累述。
使用PDO查询数据表代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', 'zy801124@1980');
$sql = "select content from test_table where click>950";
echo "<pre>";
$res = $db->prepare($sql); // 预处理SQL语句
$res->execute();
$arr = $res->fetchAll(); // 获取所有查询结果
var_dump($arr);
echo "</pre>";
在以上代码中,除了使用fetchAll()
以外还可以使用fetch
,语法如下:
PDOStatement::fetch([int $fetch_style[, int $cursor_orientation=PDO::FETCH_ORI_NEXT[, int $cursor_offset=0]]]):mixed
其作用是从一个PDOStatement对象相关的结果集中获取下一行。fetch_style
参数决定PDO如何返回行。该参数的说明如下:
参数 | 说明 |
---|---|
PDO::FETCH_ASSOC | 返回一个索引为结果集列名的数组 |
PDO::FETCH_BOTH(默认) | 返回一个索引为结果集列名和以0开始的列号的数组 |
PDO::FETCH_BOUND | 返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量。 |
PDO::FETCH_CLASS | 返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS|PDO::FETCH_CLASSTYPE),则类名由第一列的值决定 |
PDO::FETCH_INTO | 更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性 |
PDO::FETCH_LAZY | 结合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,创建供用来访问的对象变量名 |
PDO::FETCH_NUM | 返回一个索引为以0开始的结果集列号的数组 |
PDO::FETCH_OBJ | 返回一个属性名对应结果集列名的匿名对象 |
【示例】
<?php
header("Content-type:text/html;charset=utf-8");
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:host=localhost;dbname=db_test';
@$db = new PDO($dsn, 'root', 'zy801124@1980');
$sql = "select content from test_table where click>950";
echo "<pre>";
$res = $db->prepare($sql); // 预处理SQL语句
$res->execute();
while ($arr=$res->fetch(PDO::FETCH_OBJ)) {
// 将结果集以匿名对象形式返回
var_dump($arr);
}