您的位置:首页 > 运维架构 > 网站架构

哈佛公开课:构建动态网站——第四讲SQL

2014-02-08 17:05 162 查看
1.时刻注意防御式编程,比如用户肯定会进行一些非你所期望的行为,比如输入框中的输入乱七八糟的东西而不按你的设计来。

2.类似c语言中的include,在php中包括include在内公有四种:require("header.php"),require_once, include ,include_once。用带once的,php会去跟踪文件是否被包含过,这会导致一点性能上的缺陷,但可以忽略。

function printHeader($title) //写入一个函数中,当项目复杂到一定程度时,可以做些有趣的功能,比如在这个函数中传参,这样可以根据不同页面显示title名了。
{
require("../lib/header.php");  //header这类页面是不希望用户知道的,所以放在了非html的目录下,而是同级目录lib(或者其他自己取名的目录)
}


3.通常查询一个存储了数据的xml是通过循环遍历,这样当数据很大时,效率就会很低,而是用XPath则相当于可以直接获取到物品信息,比如我要查询ID=123的物品信息,使用XPath就能直接获得该物品的信息。

4.

menu.xml:
<menu>
<item id="mush">
<name>Mushroom Pizza</name>
</item>
<item id="cheese">
<name>Cheese Pizza</name>
</item>
<item id="pepperoni">
<name>Pepperoni Pizza</name>
</item>
</menu>


-----------------------

find.php:  //当然这种遍历循环查询能找到,但还可以有更好的办法。
$dom = simplexml_load_file(menu.xml);
foreach($dom->item as $item)
{
if($item["id"] == "mushroompizza")
//do sth
}


利用XPath语言查询

/child::lectures/child::lecture[@number='0'] //child:: 是固定格式,该例是查找根节点后的lectures,然后lectures的后代lecture,通过方括号进行过滤,方括号是一个布尔版判//别,表示是否有如下节点,@表示判别的是属性,判断是否有属性name然后其值是否为'0',如果是为0的,

//则包含它到结果集中,综上我最后会获取了所有number属性为0的lecture元素。

这个方法在php中是这样的:

$results = $dom->xpath("/menu/item[@id='mushroompizza' ]");//由于child::是默认轴(default axis),所以可以不用写出来
if(count($results) == 1)
{
$item = results[0];
//do sth
}


其实XPath还支持其他很多轴(axis),如父轴,先代轴等等。如果不知道属性在哪,可以用双斜线,//item[...] 这样xpath会在整个DOM中去查找。

5. fgetcsv(),可以查阅官方php帮助文档,阅读文档的最好办法是不从开头看,直接从范例开始看。此时范例中遇到符号!== ,表示不仅会判断值是否不等,还会判断类型是否不等。此处用这个可以区分出0和False的不同。csv就是一个表格形式,列之间用逗号隔开,要新的一行用换行符。

6.这里为什么要提到csv的读取,因为后面课程会涉及到读取雅虎财经的股票信息,雅虎财经用的微软excel格式提供下载,但实际上并不是excel,而是csv。上节课用到simplexml_load_file与URL获得信息,这里同样用fopen与URL也可以获得信息。

7.xml比csv这些优秀在更易读易查看,易于查询,并且有层级概念,用xml概念化描述的对象是无法用csv的扁平结构描述的,csv没有关系和属性这些概念

8.mysql这类关系数据库和csv很像,但又比csv要优秀,比如内存中可以访问多个表格,并且有SQL这样的标准查询语句

9.SQL语句惯用大写。用小写表示表名,值名等等

10.使用phpmyadmin

11.varchar是可变长度字符(过去varchar默认最大255个字符,但后来已经提高到65535左右),如果能规划好最大长度,如果规定好最大长度不超过8字符那么可以用用定长类型char,会有利于更快的搜索,并且可变长度也可能导致安全问题,因为可变长度可以塞入更多的字符数据,这是有可能导致安全问题的

12.在设计数据类型选项中可以设定attributes项,其中的unsigned表示不含负数,这样比如便可以从-20到20变为从0到40,让可用空间变得更大。另外下面还有个关于update time的时间戳,它可以自动更新最后修改时间,这样就不用自己再去编程写了。collation不用管默认就行了,默认使用的字符编码。

13. default,默认该数据项的值,extra选项中还有自动增加,比如给每个用户设定唯一ID编号,并且开启这项,之后每添加一个用户都会自动增加ID

14.主键就是唯一标识符,整个数据中不能重复。但是若不想设为主键又需要唯一存在,比如email,社保号等等,这时可以设置unique。

index索引选项,让某字段添加索引,比如经常查询的如用户名,设置了索引,就可以加快搜索,因为会在内存中建立树状结构(或者说哈希表),但是当用户非常多的时候就需要考虑一下是否承受得起花费额外的空间去维持索引。

---选项表示什么都不选。如果是全文字段可以勾选Fulltext index,创建全文索引,让搜索全文时能更快。

15.
login5.php:
<?
if(isset($_POST["user"]) && isset($_POST["pass"]))
{
if(($connection = mysql_connect("localhost","malan","12345") ) === FALSE) //connect to database,即连接数据库服务器。
//参数:要连接的服务器名,用户名,用户密码
die("could not connect to database");
if(mysql_select_db("malan",$connection) == FALSE)//select database,选择特定数据库,例子中选择的是叫malan的数据库。mysql是一款数据库服务器软件,它里面 die("could not select database");//有一个或更多数据库分属不同用户。如果上面的用户malan和密码12345不能正确访问则提示
$sql = sprintf("SELECT * FROM users WHERE user = '%s' ",mysql_real_escape_string($_POST["user"]));//mysql_real_escape_string函数能将一些危险字符 //如分号,引号等在其前面加入转义符/。避免一些sql注入攻击
//die($sql); 可以加个这句话,返回自己输入的语句然后粘贴到phpmyadmin中执行看语句有什么问题,如果后面出错了的话,可以使用这种方法排错。
$result = mysql_query($sql);//execute query,获得查询结果集
if($result === FALSE) //注意这里FALSE不代表0值。而是指一些有语法错误之类的,得到0值,可能就是没有查到而已。
die("could not query database");
if(mysql_num_rows($result) == 1)//这是一个计数函数可以告诉我结果集中有多少行
{
$row = mysql_fetch_assoc($result); //表示获取关联数组
if($row["pass"] == $_POST["pass"])//如果密码不对,就不会执行后面的挑战,而是会执行?>之后的html代码。
{
$_SESSION["authenticated"] = TRUE;
$host = $_SRVER["HTTP_HOST"];
$path = rtrim(dirname($_SERVER["PHP_SELF"]), "/\\");
header("Location:http://$host$path/home.php");
exit;
}
}
}
?>


关于密码判断部分,没有必要存入一个$row变量。使其完全暴露在内存中,这样不安全,如下这样

$sql = sprintf("SELECT 1 FROM users WHERE user = '%s' AND pass='%s'",mysql_real_escape_string($_POST["user"]),mysql_real_escape_string($_POST["pass"]) );//注意这里的SELECT后面的1,是因为我只是为了做一个判断登录用户名和密码,并不是真的需要得到整个表,所以用1,当然也可以其他数字。

//由于搜索user后还要在一个个搜索pass这太傻了,因此在phpmyadmin中勾选user和pass点击下面的index,构建这两个项的联合索引。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: