Php 笔记
从8月开始参考一个php小项目开始学习php, 这一步“基本”解决登录方面的问题。练习的过程中出现问题,求解问题,今天终于小有点像样的把登录的页面搞定了。
此项目的功能:
一个留言本的功能,涉及数据库的读写、session的存储等等。
菜单栏上有三个标签分别是浏览留言、添加留言、管理留言。
如果用户未登录,则点击浏览留言和添加留言时都会跳转到登录页面提示用户登录。
登录成功后则可以打开任意页面,不需要重复登录。
说明:以“【】”作为分隔标志。其中是问题的描述,后面是解决办法,自己的思考过程等等。
2012/8/26
【登录成功后自动跳转到之前浏览的页面的问题】
描述:拿网购来说,浏览商品时不需要登录,假如当前所在页面为a.php, 在此页面上看中一个商品想要购买,于是点击“购买(or whatever)”, 这时自动转到登录页面login.php, 想要让页面在登录成功后自动跳回a.php,应该怎么写?
比较有建设性的方案 http://zhidao.baidu.com/question/179523164.html
解决方案一:
在a.php中添加
$_SESSION['userurl']=$_SERVER['PHP_SELF'];
在login.php中登录信息匹配成功后面添加
if(isset($_SESSION['userurl'])){
$url=$_SESSION['userurl'];
echo "<meta http-equiv=\"refresh\" content=\"2;url=$url\">";
}
else
echo "<meta http-equiv=\"refresh\" content=\"2;url=index.php\">";
备用:
http://zhidao.baidu.com/question/449351765.html 只解法尚未看明白
http://zhidao.baidu.com/question/274563875.html 用cookie保存
http://www.jb51.net/article/24414.htm
http://bbs.phpcms.cn/thread-110710-1-1.html
http://club.edu5a.com/showtopic-255924.html
http://www.chineselinuxuniversity.net/articles/35273.shtml 大牛的代码Spring+JSF+Hibernate
【session】
php.ini 文件中的选项,配置session.
session.save_handler 定义存储session 数据和处理器的名字
session.save_path session文件的保存路径
session.auto_start 指定是否自动启动一个会话,默认为0,即不启用。若启用, 则每次打开一个php页面就会开始一个会话。
2012/8/25
【IE vs ff】
登录页面
ff可以正常运行,保存session,读取session. 一次登录后就不用再登录了。
ie下不正常,用户名跟密码输入后可以写入session,但似乎无法正常读取。查一下ie是如果查找session文件的。
【php与html之间传值】
html 表单中的name属性唯一的纽带。登录表单中的“提交”按钮写作:
<input type="submit" name="submit" id="sbutton" value="OK"/>
php中的判断逻辑为:
if(!isset($_SESSION['user'])){
if($_POST['submit']){
if(验证成功)
Save session 并跳转到当前页面;
else
提示出错
}
}
在登录验证页面,首先判断session存在与否,存在则不显示登录表单。如果不存在,再判断submit是否存在,也就是是否提交了表单待验证。如果submit存在则查询数据库进行验证,验证通过就保存session并跳转页面,不通过则提示出错。如果submit不存在,则显示登录表单。
2012/8/21
【insert添加留言的表单】
折腾了多少天都不知道为什么表单里面提交的数据无法插入到数据库中,其它代码都没有问题。试了n次终于找出问题的所在:mysql中保存留言那张表中有个id字段,没有设置其自增或是其它,提交的表单中也不用给它赋值,插入数据的sql语句中此字段为空。就因为这样,数据无法插入,而也没有错误报出来。以后这类数据要小心处理。
2012/8/18
【IE and COOKIE】
ie比较变态,浏览器关了cookie不自动销毁
【session认证的问题】
现在页面可以成功登录,将登录form与判断登录的php放在同一个php中,但是session认证失败, 每次都会显示登录框,提示要登录。考虑原因是每次登录成功后会刷新页面,生成一个空的session, 验证这个空的session当然不可能通过。
【页面跳转的方法(未验证)】
可用js跳转, js几种跳转方法:1 history.go(0) 2 location.reload() 3 location=location 4 location.assign(location) 5 document.execCommand('Refresh') 6 window.navigate(location) 7 location.replace(location) 8 document.URL=location.href
2012/8/15
【php与htm之间错综的包含关系】
一个工程中,页面的banner始终如一,这个时候可以把banner的html代码提出来,单独放在一个叫banner.htm的文件中,然后在index.php的<body>标签下面添加<?php include 'banner.htm;?>来引用它。我的问题是,htm的<!DOCTYPE>怎么放? 照理说,<!DOCTYPE>跟banner是类似的,不需要在每个文件中都复制一遍,不便于维护。但是,似乎又不能把它加在banner.htm的开头。如果这样加的话,banner.htm的末尾是写</html>把html关闭呢,还是不关闭呢?
<!DOCTYPE ...>
<html>
<head></head>
<body>
<?php include 'banner.htm;?>
<div id=main_content></div>
</body>
</html>
这样的构造下,banner.htm中最外围只有<div>.
不是很理解的是,html跟php交叉的时候php的解析方式。请求一个页面时,是否是先把php语句给处理了,变量等都取好值了, 再解析html.
【admin_login_1_1】
登录成功
session文件保存成功
再次点击“管理留言”,仍然显示登录表单,预期的结果应该是在session的有效期内,可以直接直接进入“管理留言”页面,而不需要再重新登录。 session 没有生效还是应该在客户端设置cookie。
为解决此问题,用 if(!isset($_SESSION['admin_user']))进行判断。但是这样一来进入了死胡同:session文件的内容是在else分支里写入的,意味着首次打开此页面(session没有被赋值)时,只能进入if里面,session存在的判断永远不会生效。
鉴于此,考虑将登录页面分离出来。
【问题的原因】
1 sql类中num_rows() 函数没有定义
2 if(empty($_POST['action'])) 的判定无效,没有name=action 的变量存在
3 <form name="form1" action="<?php $_SERVER['PHP_SELF']?>" method="POST" 应该改为
<form name="form1" action="<?php echo $_SERVER['PHP_SELF']?>" method="POST" 。此处正确性尚未验证
2012/8/9
【input hidden】
要传递除了表单里用户输入的一些东西外的值,比如购买一个商品,你想传递product_id,但是这个值并不是用户输入的,而且你的操作中要用到,就可以用hidden.
【<meta http-equiv=refresh content="2;URL=admin_prod.asp">】
意思是两秒钟后转到当前目录下的admin_prod.asp页面。2的意思事2秒。
如果没有URL=admin_prod.asp则将每2秒刷新一次页面。
2012/8/8
【admin_login.php 的逻辑】
有一点明白为什么要把表单提交给本页处理了。当没有登录时,$_POST['action'] 为空成立,进入if循环。页面中显示账号、密码的输入框。当if不成立时,则验证表单的内容,查找数据库,一旦与数据库的数据相匹配, 就则用echo "<meta http-equiv=\"refresh\" content=\"2; url=index.php\" >";这句命令来刷新页面。
【form的onsubmit 与action】
onsubmit和action两个都是提交时触发的,不过:onsubmit是表单中的确认按钮被点击时触发发的,一般是js函数,而action是在按钮被点击之后触发的,一般是触发前台提交到后台的请求,而引起后台的回应。
对于<form name="form1" action="a.php" method=POST onsubmit="return Form1_Validator(this)">
当此form提交时,首先触发Form1_Validator函数作为初步验证表单,验证通过后提交给a.php处理。
【$_SERVER['PHP_SELF']】
<form name="form1" action="<?php $_SERVER['PHP_SELF']?>" method="POST">
提交给本页验证
查看源文件,变为:
<form name="form1" action="" method="POST" >
action的值为空了。什么意思?
【session_start 错误】
错误提示
Warning: open(F:/689phpsessiondatasess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed
分析及解决方法
php.ini中将session.save_path和session.cookie_path 设置为:
session_save_path = c: temp
session.cookie_path = c: temp
然后在c:目录下建立一个temp目录,即可
参考链接 http://hi.baidu.com/%E3%C6%D0%A4%B7%BC/blog/item/6dcef00e8297e022738da5e1.html
我的php程序文件地址是 D:\exe\W3C\php
配置的时候,将源文件复制到 D:\PHP 这个路径下,环境变量path中保存的php路径是D:\PHP。即Apache使用的是D:\PHP。
我的错误提示为open(D:\exe\W3C\php\phpsessiontmp\sess_80110b574d361d71841d3, O_RDWR) failed
不明白为什么默认路径会是D:\exe\W3C\php, 因为环境变量设置的是D:\PHP。在D:\exe\W3C\php中新建一个phpsessiontmp文件夹问题就解决了。
【session_start】
告诉服务器使用session。一般来说,php不会主动使用session。设置php.ini中的session.auto_start=1来自动对每个请求使用。
用了session_start(),或者自动开启session,服务器会根据请求头部传来的cookie中或url中的PHPSESSID来确认此sessionid对应的$_SESSION数组。
用$_SESION之前必须要session_start()----其中之一的功能,$_SESSION是服务器端的cookie,相当一个大数组(浏览器关闭前,和session销毁前)$_SESSION中的数据可以一直用(除了重新赋值)。
同一个project中的所有php文件都要在开头声明session_start(),确认此用户是否登录。
【不同页面之间的关系】
1 假如有页面A.php跟页面B.php,这两个页面中都有一个链接a跟链接b,链接a指向页面A,链接b指向页面B。
由于A,B是独立的两个页面,所以在它们的文件中都要有完整的html标签,包括<!DOCTYPE>; <html> </html>; <script></scrpt>;<link></link> 这些标签对等等。以引用外部css文件来说,若这个web工程很大,有很多的跳转页面,它们都引用了同样的css文件,若css文件的名称发生改变,岂不是要把所有引用过它的语句都找出来进行修改。有没有更好的办法? 或者说,css文件名称在一开始设定好后,就一定不做改动了,这也是一种解决问题的方法, 但是并不能百分百保证。这个问题先放在这里,在后续的学习中应该会有体会,弄明白之后再写下来。
2 对php解析html的方式很是惊异,居然这样也可以,太强悍了。比如:
<?php
if ($total!=0)
{ //在这个php标签对中,if 没有结束
while ($rows=$db->fetch_array($rs))
{ //while 也没有结束
?>
<span class="leftarea"> //html标签插在两个php标签对这间
<img src="images/icon_write.gif"/>
<?php
echo "<p>".$rows['content']."</p>";
} //这里结束的是上一对php标签的if
} //这里结束的是上一对php标签的while
?>
路径:假设当前project 的路径为root, 则所有链接路径(<a>)默认从根目录下开始查找
session 错误:修改php.ini中的session.auto_start = 0 为session.auto_start = 1
2012/8/4
【php解释html 】
html得放在"<?php ?>"标签对的外面。
换行 echo "<br/>";
Window.onload=initpage; //initpage后面不能加括号
Initpage 函数中若调用其它函数,也只能用函数名,不能加括号,否则页面加载完毕就直接运行了。