哈佛公开课:构建动态网站——第五讲SQL(续)

1.在这个课程中的服务器关于目录的配置,默认是在项目0下面

通常供用户访问的文件夹html设置为701或711权限。而php文件通常是600,而另外几乎所有文件比如css和非动态html还有图片等等最好设置为644权限。


2,凡是从用户获取输入是都应该使用mysql_real_escape_string函数

3.注意数据库中注册用户的密码要加密。而在PHP中提供了几种可用方法,不仅加密还有些其他在查询时对数据和信息进行相关操作:


4.这里使用了PASSWORD函数进行处理,但这样还不够好,只是弱哈希,知道原理的人都有可能从生成的哈希字符串中获取回实际密码。

5.使用SELECT 1 FROM……是一种用于做用户登录验证的捷径,我本就不需从mysql中获取所有数据,这样查询结果是会返回1,如果查询失败则是返回空,这样最小化传递数据量 是最好的。

6.前面提到了AES_ENCRYPT('%s','secret')函数,有两个参数,第一个是待加密的字符串,第二个是加密密钥。这个函数就比生成哈希串的PASSWORD函数要更安全。另外需要记住的是如果使用了AES_ENCRYPT函数,那么对应的pass项的Type应该选择varbinary而不是varchar之类。

7.当数据库表格中用了varbinary这类二进制类型,当要转移数据库的表格时,就要格外留意了,若把这类数据导入导出(尤其存入文本文档),则可能导致最后密码不匹配,也就是密码并非是以前的那个二进制了。

8.前面使用AES_ENCRYPT函数中用的密钥是我们明文给出的,这样也不安全,因为一旦有攻击者获得了这个密钥那用户的密码也会暴露出来,所以替代方法是用用户自己输入的密码作为密钥要加密用户的密码。

9.对应的还有解密函数,通过调用数据库中加密后的密码然后解密出原本密码。


以下是在phpmyadmin中使用后返回的效果图


10.使用INSERT插入一个新注册的用户


11.使用不同的数据类型都需要不同存储空间和计算能力,因此对程序性能影响很大


12. 比如在设计一个赛车比赛数据的数据库时,如果一张表格中有选手的名字,车型,参加的何种比赛,参加日期,天气状况等等,其中不同选手之间都有可能出现参加了同一个比赛,同一天等等,因而导致这个表格中光是何种比赛就有许多个重复,因此把这些分开到不同表格中去,比如参赛选手表就只有选手独有的信息,还有一张赛事表记录了不同的赛事,将赛车表和车手表分开,因为同一个赛车可能有多个车手去驾驶,若存在一个表中,也会出现大量的重复项,综上也就是说将表格分开存储。


然后将driver_id,event_id,car_id设置成三个联合主键。

13.ID项最好做成无符号型,开启每添加一项后自动增长。当简单数据类型能达到使用目的时,就不要使用复杂的数据类型,因为有时将数据转移到其他类型数据库,基本数据类型移植性更好,有些复杂类型可能只支持mysql。

14.查询车手表中的姓名字段以及用时表中的所有字段,当用时表中的driver_id字段匹配车手表中的id字段时。


这样返回的结果就把两个不同表的信息合并到同一个表中了,这就是所谓的内连接(inner join)。

14.还有一种叫做交叉连接(cross join),它会给出所有的可能的结果, 这个不常用,但调试时常用,因为可以给出大范围的结果。


15.左外连接(left outer join),下例中将车手表作为左表,左连接将执行所有两表的匹配,同时还会给出右表中无匹配的其他左表内容。这样就可以看到匹配和不匹配的所有行。


结果就是:


16.通过内连接,组合所有信息,将多个表结合起来


17.对于一些有唯一ID的项最好不要轻易删除,比如一辆赛车信息,如果这辆车不再使用了,那么可以添加一个赛车是否禁用项进行一个设置,而不要直接从数据表格中删除掉它,同理注册用户也得有个是否可用的标志项。

18.这里用到了count,对结果集的行数进行计数。


19.从某个选手的参赛记录中,查看他最早参加的比赛是什么。ODER BY后面是要排序的数据,ASC是升序的缩写,而且LIMIT 0,1限制了仅一条记录,即我希望它能从最老到最新排序,并且只给出一条记录,也就是最老的那条记录。


20.在设计数据库时尽量减少不必要的信息记录,就是那些可以通过已知数据计算出来的信息,就没必要单独列出一项来记录它们。

21.内连接的基本形式:


常用内连接的简记形式:



22.竞态条件的例子:比如发出请求要同伴帮忙买牛奶但回家后发现冰箱里面没有牛奶,发出请求,但没有任何获得,这就是竞态条件。

又比如下面想表格的a,b,c项插入值1,2,3,但假若a是主键并且有1了,那么此时插入数据会失败。因此有了下面的ON DUPLICATE KEY,作用是如果有重复的了则做后面的动作。此时等价于后面的那句话UPDATE table SET c=c+1 WHERE a=1;


23.事务(TRANSACTION),当我要把一个账户中的钱转移到另一个账户中时。这样就能避免竞态条件了。这个事务只有在最后COMMIT语句执行时才会开始,COMMIT表示两个语句会原子执行,中间不会存竞态条件


24.同样的还有ROLLBACK语句,就是当发现一些糟糕的事发生了,你可以解除之前的尝试。比如不小心连续误点击了两次转账,这时由于有ROLLBACK就可以撤销多点击的那次操作。


25.InnoDB能支持这种事务,但这个功能使用的计算资源大于MyISAM,因此只有确定要使用事务时才选InnoDB,一般使用MyISAM的表格锁定即可,表格锁定的缺点在于它对所有人锁定整个表格,优点在于可以进行一些原子操作,而其他人此时不能接触到表格,不过解锁之前所有人无法接触确实存在缺点。比如下面我们可以锁定表格,用的是写锁定


还有种读锁定,作用就是所有人都不能写人包括你,都只能读,常用在备份表格的时候。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值