《PHP和MySQL Web 开发》 第9章 创建Web数据库
时间:2023-07-10 04:36:01 | 来源:网站运营
时间:2023-07-10 04:36:01 来源:网站运营
《PHP和MySQL Web 开发》 第9章 创建Web数据库:
封面人物
刘承羽
前言
这是我学习《PHP和MySQL Web 开发》的读书笔记,一些重要的知识点我会记录下来,当然只会写我觉得重要的。- 如果有幸有人看到这个学习笔记了,你要结合着书看,不要光看这个笔记。
- 在笔记里我会记录一些我学习中遇到的问题和解决办法与注意事项。
- 为了方便管理和查找,文章或者说笔记的目录我就按照书里的排了,方便对比着看。
- 不是教学!重要的事说一遍!我是PHP和MySQL 的初学者,我本身是个前端,为了面向工资编程,拓宽知识面才学的。
- 其实还是有一些私心得,因为都说教学相长 和 小黄鸭调试法,我这个是小老虎学习法,对着小老虎讲知识点,保证自己学的扎实,能挣钱。
- 欢迎探讨和指教,须知一山更比一山高,但是拒绝杠精!
本章主要是介绍了:
- 创建一个数据库
- 设置用户权限
- 权限系统介绍
- 创建数据库表
- 创建索引
- 选择MySQL中的列类型
开篇说了介绍了数据库安装的一部分,你可能会遇到很多错误,网上太多的安装教程了,我就不贴了,如果你整不明白这一块呢。
我有俩办法,一个呢,是安装个 xammp集合,php,mysql都有,傻瓜式的,还是中文的,你看看教程应该能搞懂。
另一个呢,是,自己按照书里研究去,安上在接着看。
到这里我默认你是安装完毕了啊~
刚说了,你可能会遇到各种问题,报错啥的。很正常,编程也就这点难度了,再难得没有了,你要克服!要坚持!想想你喜欢的姑娘,想想你微薄的收入!
好,下面我们来看这一题。
有个错误是你在启用命令行时(微软键+R 键 ,弹出运行框,输入CMD你就能看见这个黑框了),输入MySQL 命令它会提示错误:'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
当然,这句错误是英文,你自己复制出错误到在线翻译中翻译成中文,和我这个错误对一下。(这里说一下,英语不好没关系,你得学知道不,不认识的你就复制出来翻译成中文,多复制几遍,错误见多了,那几个单词你也就认识了,大致一看也就能明白是大概是哪的问题了,不要一看一大段的英文就懵逼,就烦躁,就不想看,你复制出来,翻译呗,就当学英语了,是不是?)
解决办法如下:
1.打开我的电脑(我的是win10系统),右键属性,点击左侧“高级系统设置”。
2.点击“高级”标签,“环境变量”。
3.从李重楼(此处是电脑的用户名,我的用户名就叫李重楼,你找你的) 的用户变量中单击 PATH 。
4.点 浏览,选择 mysql安装目录中的bin 文件,然后确定保存。重启命令行工具输入mysql ,显示welcome。
9.1使用MySQL监视程序
俩重点:
1.SQL语句不区分大小写,但数据库和表名是区分大小写。
我个人是用小写的,因为不知道为啥,大写的单词我就不认识了,233333。
2.每个命令都用分号(;)分开。
9.2登录到MySQL
mysql -h hostname -u username -p
-h 命令选项用于指定所希望连接的主机,即运行mySQL服务器的机器。
如果正在该MySQL服务器所运行的机器上运行该命令,可以忽略该选项和hostname参数。
如果不是,必须用运行mySQL服务器的主机名称来代替主机名称参数。
你如果你使用的MySQL在你电脑上,(你先粗浅的这么理解着)你可以省略 -h 命令变成如下命令也可以,一样能登录上的,因为默认就是访问你本地的MySQL服务器了。
mysql -u username -p
-u 命令用于指定链接数据库时使用的用户名。
-p 命令告诉服务器要使用一个密码来链接它。
这里有个注意事项:-p 后面不加分号!!!直接回车输入密码就行!加分号提示 ERROR 1045 (28000): Access denied for user 'username '@'hostname ' (using password: YES) 的错误!!!!别问咋知道,我还按照这个错误去解决呢!根本不是错误的事,是命令打错了!!打错了!!!不加分号!!!
再说一下,一般情况下,你是第一次安装,用户和密码可能都是 root。
正常登陆了之后,你会看见下方这个提示,证明你链接成功了,此时请输入 ( quit;)然后回车。
Welcome to the MySQL monitor. Commands end with ; or /g.Your MySQL connection id is 98267Server version: 5.6.25 MySQL Community Server (GPL)Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '/h' for help. Type '/c' to clear the current input statement.
你会发现你退出了...
我是为了让你熟悉一下,再敲一遍命令行登陆MySQL。
我当时学的时候,我是敲了大概十来遍,只多不少的,不带骗你的。
我都有肌肉记忆了。
这样能保证你睡一觉起来,还能想起来这个命令,当然以后敲多了自然就不会忘了。
9.3创建数据库和用户
create database dbname;
书中的 mysql> 表示是运行在MYSQL监视程序下的命令,也就是你已经登陆了。
create(创建) database (数据库) 创建数据库 dbname ,其中 dbname 是你希望创建数据库的名称。
这里说一下:创建的是数据库!库 就是能包含 表 的库!!!!我接触这里的时候产生了疑惑,就是我链接了数据库,我已然是在数据库里了,为啥还要创建数据库,我直接创建表不就行了吗?
通俗的解释一下,MySQL就是一块地,你登录链接MySQL,就是把地买了,而刚才这步创建数据库,就是在MySQL这块地上盖数据库,你可以在这块地上盖N多个数据库。
9.3设置用户与权限
一个MySQL系统可能有多个用户。为了安全起见,root 用户通常只用作管理目的。对于每个需要使用该系统的用户,应该为他们创建一个账号和密码。
一个MySQL系统可能有多个用户。
还说回来你买了MySQL这块地的事,你是一个公司老板,买了MySQL这一亩三分地,盖仓库,蔬菜大棚啥的。
你肯定不能自己去看仓库,搬货吧?
所以进出仓库的就有了门房赵大爷和搬运工小刘。
算上你,这个仓库一共三个可以进出的人,也就是用户,所以一个MySQL系统可能有多个用户。(只不过目前看来,这三个人都是你扮演的,你缓一会儿,理解一下。)
root 用户通常只用作管理目的。
你这个公司,买了地,盖了仓库,牛逼的不行,公司老板是你,你有权安排赵大爷和小刘的工作,让他们干啥和不许干啥,你都给规定的明白儿的。
你,就是 root 用户。
做管理滴,牛皮不?
具体的活都是赵大爷和小刘的!
对于每个需要使用该系统的用户,应该为他们创建一个账号和密码。
你公司盖这个仓库吧,引进了高科技,指纹识别!你得给小刘和赵大爷录个信息啊。
小刘的指纹能刷开仓库门,以便进出搬卸货物。
赵大爷指纹能刷开大门和拦车杆让送货拉货的车进来,不能给小刘这个权限,是因为怕小刘自己开了仓库门,拉上货物,开了大门,把货偷跑了。
当然赵大爷也打不开仓库的门。
而你的指纹能全干!
这个小例子介绍了为啥要单独创建账号和什么是权限。
9.5MySQL权限系统介绍
权限是对特定对象执行特定操作的权力,它与特定用户相关。
想想你的门房赵大爷。
9.5.1最少权限原则
一个用户(或者进程)应该拥有能够执行分配给他的任务的最低级别的权限。
再想想搬运工小刘。
9.5.2创建用户:GRANT命令
grant 和 revoke 命令分别用来授予和取消 MySQL用户的权限。
这里呢,说一下这一节,这一节内容挺多的,足足一页多的书上内容,不要烦躁好好的看,这个很重要的!在你看书的时候,我讲讲其他的非知识点,开心一下。
grant 授予、准许 的意思,读快了就是“干它!”,开玩笑的,读 [grɑ:nt] 。
revoke 废除、撤销、取消 的意思,读 [rɪˈvəʊk]] 。
方括号里的是音标,我百度翻译来的。
为啥此处单独标了他俩的读音?
因为这俩单词我在以前开发中没接触过,在MySQL中,第一次,哎呀呀脸红的不行。
这些命令啦,方法啦,这啦,那啦,反正就是书中出现的关键的英文,你最好都要看到了知道他中文意思,和会读。
因为,怎么说呢,程序员英语发音,都很迷~有的时候聊技术方案,对方说个词,说是能干啥干啥,或者你问他某某怎么弄啊?他就回你一个发音贼迷的单词,你根本听不懂!但是大家一把这个词打出来,都一脸的哦~恍然大悟。
别觉得不可能,你想,你是自学的MySQL,也没人教过你这些单词都咋读,都是凭感觉去蒙着读,而且你还都学会了还贼6,去了大公司当老大,有一天你告诉你的小弟:“大数据分析部的夏禾需要使用数据库,账号密码按照工号初始化,你 干她 一下!”。你的小老弟儿一脸通红的告诉你:老哥你是不是傻B!那读[grɑ:nt]!你心里话说出声的毛病该改改了!
知识点来了!grant命令的常见形式如下:
GRANT
privileges [columns]
ON
itemTO
uesr_name [IDENTIFIED by '
password '] ;
和书上不太一样,因为我偷懒了,这都是我手敲的啊!敲的我手都是血啊!
下面我用我沾满鲜血的双手来给你解释一下:(其实你好好看书的话,这节你都可以跳过的。)
上面形式中,红色的都是可选的,既然是可选就是非必填的,这个你懂,稍后再说。
privileges 特权的意思。话说看到这个绿色有没有让你想起,你某个醉酒的,痛哭流涕的夜?
这是一个占位符,此处应该被替换为一组由逗号分隔开的权限,如:select,insert,update,delete,index,alter,create,drop;这个下一节会详细说的。
item 占位符是新权限所应用于的数据库或表。
注意:书中说可以将项目指定为 *.*,而将权限赋予所有数据库,叫做全局权限!
这个 *.* 是 “星号 点 星号”,不是给你特意标出点来!我就敲错了!
更常见的是以 dbname.* 的形式指定数据库中所有的表。
以 dbname.tablename 的形式指定单个表。
[columns] 是可选的,可以用它对每一个列指定权限。
可以看出,可以用的权限包含了:数据库,表,列。
uesr_name 是用户登录MySQL的用户名,它还可以包含一个主机名,用来区分用户。(先忽略create user 这块。)
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %
CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';CREATE USER 'pig'@'%' IDENTIFIED BY '123456';CREATE USER 'pig'@'%' IDENTIFIED BY '';CREATE USER 'pig'@'%';
这些例子中,都包含了带有主机名的用户名。
[IDENTIFIED by '
password '] 是可选的,但是呢,我推荐密码是要求必须的,出于安全考虑。
这一节其他的部分,我就不说了,自己看吧。我是搞懂了,我还分别查看了mysql.host,mysql.db.mysql.user等等,这里靠你了。
最后,献上一个中文的授权格式:
grant 权限 on 数据库 .* to 用户名@登录主机 identified by “密码”;小思考:用你理解的语言,复述一遍授权格式。
9.6创建一个WEB用户
是不是好奇953,954和955哪去了?我没写,主要内容都是陈述,操作的,我就没有写。我可以不写,因我学会了,你不能不敲不看啊,也是好好好看书学习的。
9.6内容开始。
这一节到了真正开始要敲命令的时候了,而我呢,为了学习,为了体验错误,我把之前按照书中授予的权限全部删除了重新做人啦~
有个小注意,我输入的命令是第二段的命令,就是特权挺多的那个。
grant select,insert,update,delete,index,alter,create,dropon books.*to bookorama identified by 'bookorama123';
如果你没有敲错的话,你会看见 Query OK, 0 rows affected (0.00 sec) 这句话的。
而此时,数据库mysql.db 和mysql.user 中都会有 bookorama这个User了。
如果出现错误呢,就看看错误在哪一行,看看是不是哪个单词敲错了,或者没加分号?
大部分错误都是单词敲错了,因为我经常犯这个毛病。实在不行的话,把我这段复制进命令行回车。
然后请输入 quit;(这个是不是很眼熟?)退出登录状态。
然后以bookorama 的身份登录MySQL。密码是 'bookorama123';
如果一切顺利的话,你就以新身份(门房赵大爷?)登录数据库了~
9.7使用正确的数据库
我承认我从来没看过附录A,咋地吧。所以我没有写附录A的有关笔记,而且短时间也不打算写...
到这一节的时候,检验你看书仔细不仔细的时候到了,其实在9.6的时候你在 on books.* 的时候可能就遇到问题。
你没建立名为 books的数据库,而这一块在哪写了呢?在9.3节创建数据库和用户中有一句“我们要创建一个名为books的数据库 ”。
如果你没建立,那么开动你的小脑瓜,怎么才能建立呢?
好,到这里已经是完成全部准备工作了,现在说使用数据库的事。
use dbname;
没了,就这一句,书里还有一种方法,在登录的时候就指定要使用的数据库,你也可以试一下。
注意:在登录时就指定数据库,不能省略 hostname。我试了一下会报错的。
成功了的话,会显示 Database changed 提示的。
而此时你输入如下命令。会显示你已有的数据库列表。databases 要加S!!!!
show databases;+--------------------+| Database |+--------------------+| books |+--------------------+
9.8创建数据库表
create table tablename;
创建表的常见形式(命令)就是这样的,翻译成中文就是 创建表 表名。呃,好像翻译不翻译没啥大区别。
create table tablename (columns);
这段代码是和书中一模一样的,其中 columns 就是你在创建数据库时同时创建的列,看例子是怎么用的。
(创建数据库大致分两种,一是先创建数据库,然后向数据库内插入列,另一种就是创建数据库时同时指定数据库的列,这个看个人喜好吧)
书中给了bookorama.sql 的程序清单,我推荐你手动输入敲一遍。
熟悉下码感。我学到这的时候真的敲的错误百出~所以你也敲敲看,我最近才顿悟,作为一个程序员,要拥抱错误,漠视警告。
(敲的时候仔细看,首先看表的模式,看着表模式,能够知道哪个是主键,外键,列名字段吗?是不是都忘了?忘了回去翻书,再看一遍。然后对应的着代码敲,敲的时候你会发现有好多不认识的,没关系,你就按照书中代码敲,别怀疑,一直敲,敲完后面会讲你不认识的都是啥的。
我决定了,以后啰嗦的话用绿色标出来,重点才用红色。话说,看到这个颜色,你有没有想起你的前女友?)
如果你成功创建了一个数据表,你可以输入如下命令,查看数据表,注意:tables 要加S!!!!
show tables;
输出的数据表是这样的:
+-----------------+| Tables_in_books |+-----------------+| customers |+-----------------+
这个是第一个数据表,customers 顾客表, 注意表头,写的是 Tables_in_books 意思是 在books 数据库中的表,不是书在桌子上!
9.8.1理解其他关键字的意思
其实你在敲命令,创建数据表的时候,应该看完这一节的才对,包括下一节。没看也没关系,现在看,然后结合着前面理解。
NOT NULL 的意思是表中所有行的此属性必须有一个值。
这里是从行(记录)角度说的,其实从列角度说就是此列对应的输入不得为 NULL,结合后面一句看“如果没指定,该列可以为空(NULL)”。
有点懵逼?没关系,我给你解释。
先理解一个概念,空值,它也是值。只不过该值为空。(var a=''; var b=null; a!=b//true; js代码,看明白没?)
NOT NULL 的意思是表中所有行的此属性必须有一个值,这个值可以是你主动输入的123,什么的,也可以是空。
但不能是NULL,因为NULL这个值,是没有主动指定NOT NULL时填充进去的。
妈蛋,我写完了,也搜到解释了,如果我上述表述不清晰,可查看:MySQL null与not null和null与空值''的区别 。
AUTO_INCREMENT 书中已经说的很明白了,我介绍一下课外知识吧。
increment 读作 [ˈɪnkrəmənt, ˈɪŋ-] 增量 的意思,auto_increment 是自动增量的意思,也可叫自增量。
还有一条是:指定 AUTO_INCREMENT 的列必须是索引列。
(书中貌似对什么是索引没有解释,这是我搜索到的索引解释:索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。
例如:有一张person表,其中有2W条记录,记录着2W个人的信息。有一个Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息。
如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。
如果有了索引,那么会将该Phone字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。其中MySQL中的索引的存储类型有两种:BTREE、HASH。 也就是用树或者Hash值来存储该字段,要知道其中详细是如何查找的,就需要会算法的知识了。我们现在只需要知道索引的作用,功能是什么就行。全文请查看:MySQL中的索引详讲)
9.8.2理解列类型
(现在是2018年7月30日13:27 我收回之前吹牛B说七月底写完笔记的的话,上手写的时候我才发现自己的无知,之前很多觉得会了的,当要写笔记的时候,才发现模棱两可,表述不清,所以一直在阅读展开相关知识带你,还有就是我懒...我争取8月份写完笔记。。。)
主要写的是列数据类型,整节的数据类型如下:
- unsigned 无符号的
- char 字符串数据类型。是指使用指定固定长度表示的字符串,比如char(8),则数据库会使用固定的1个字节(八位)来存储数据,不足8位的字符串在其后补空字符。
- amount 浮点类型数据(float)类型。如果你之前没有接触过数据类型,你可以暂且记为包含小数点的数字类型。
- Date 日期数据类型。这个不解释了。
- text 字符串数据类型。但是这个用于长文本,如文章什么的。
9.8.3用show和describe来查看数据库
这个之前说过了。再来一遍吧。
查看数据库(databases 注意加S)
show databases;
使用数据库 (目前可使用的是books,use books;)
use dbname;
查看数据表(记得加s)
show tables;
输入完了你会看到如下数据表的,再次注意看表头Tables_in_books ,显示当前的数据表是在哪个数据库。
+-----------------+| Tables_in_books |+-----------------+| book_reviews || books || course || customers || order_items || orders |+-----------------+
查看某个特定表的详细信息.(书中举例说明的是books 表,是books数据库中的books表,别搞混乱了啊。)
describe tablename;
我也显示了一下:
+--------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+------------+------+-----+---------+-------+| isbn | char(13) | NO | PRI | NULL | || author | char(50) | NO | | NULL | || title | char(100) | NO | | NULL | || price | float(4,2) | NO | | NULL | |+--------+------------+------+-----+---------+-------+
9.8.4创建索引
这里的内容略过了,我就不写我笔记了,因为我没啥可记的。推荐查看我上文提到过的文章:MySQL中的索引详讲。你先了解原理就行,具体操作先不必上手,专心看书。
9.9理解MySQL的标识符
略。
9.10选择列数据类型
MySQL中3种基本的列数据类型:数字,日期和时间、字符串。
一般来说,选择列数据类型的时候,基本原则是选择可以满足数据的最小类型。
9.10.1数字类型
数字类型分为整型和浮点型两类。
我只能用我浅薄的小学数学水平,狭隘的解释一下这两类了。
整型:整数,正整数负整数都是整型,不包含小数点的。
浮点型:就是小数,是不是浮点型,就看有没有小数点就行了。
然后看表9-5,9-6吧。
9.10.2日期和时间类型
唯一值得提的是TIMESTAMP类型。因为它有两个特性:
1.不手动指定时,TIMESTAMP列将被设置为最近修改该行的日期和时间。(设想一下这个特性能做什么?)。
2.它有多种的可显示类型,参见表9-8。
9.10.3字符串类型
字符串类型分了三大类,其中第二类为text和blob类型。
BLOB全称为大二进制对象。它支持任何数据,例如,图像或声音数据。
数据库三大类型介绍完毕了,是不是觉得很多很繁琐记不清?
其实很好记得,同一类型,比如说字符串类型,它很多的类型都是对当前类型的描述,长文本类型(langtext),中等文本类型(mediumtext),小文本类型(tinytext)。其实都是对一种类型,不同范围的描述。如果你这么理解了,就容易记得多了,可参看MySQL 数据类型文档。
(我其实根本就没记,主要的类型我还记了的,随用随查,用的多了自然就记着了。)
结语:
回想第八章,我们学习了数据库的基本知识,学习了是么是表格,列,行(记录),值,键(主键/外键)。
学习了关系数据库的都是啥关系?一对一,一对多,多对多。
学习了数据库的基本设计规范(三个不规则)。
什么是原子列?还扩展的学习了第一二三范式。
web数据库的架构。
第九章的内容是实践偏结合,学习了如何登陆,创建数据库,创建用户,设置用户权限。
学习了数据表的创建,查看,关键字都是什么意思。扩展了学习了一下索引。列的三大数据类型。
说起来没多少,如果你也是一步一步看过来,并且还保证自己学会理解,还是很多的。努力吧,我也在学习。在此之前,我对数据库只有个简单的认识与了解,学习完这两章之后。对数据库也是有个粗浅的了解了,共同学习,共同进步,为了爱我的人,和我爱的人,努力学习挣钱花。