先说下在做的过程中遇到的一些问题,以及解决的方法吧
1.关于书写错误
最开始做的是一个登陆模块,在登陆验证的时候,使用$_POST接收的参数,然后在验证的时候,却怎么也接收不到这两个值,后来才发现$_POST写错了,写成$POST 少个下划线,结果无法正确的验证,很是郁闷。花了好长时间,才找到原因,而且还是一个低级错误,当时在没有找到原因的时候,发在论坛里群里,都让帮忙找原因,当找到原因的时候,很是惭愧,从那以后,再遇到错误,我非常的慎重,先从语法上检查,如果保重在语法没有错误的前提下,如果还找不到原因,再去问别人。
2.就是退出跳转。在登陆成功之后,点退出的时候,会跳到登陆界面,并清除session。代码如下:
<a href="login.php?action=logout" target="_parent" onClick="return confirm('您确定要退出吗?');">退出</a>
后台其实是一个frameset框架,而退出连接就在left.php里,我的这个退出验证是写在left.php里的,
比如:
if($_GET[action]==logout){
//做一些清理session操作
}
可是这时候,session并没有清除,这个退出只是完成了一个超连接的作用,连接到了login.php页面,后来才弄明白,这个超连接是连接的login.php,所以上面的那个if判断应该是写在login.php里,接收action==logout,这样才正确,而我却把它写在了left.php里了,所以才没有成功。
3.再下来就是一个乱码的问题了.
在config.php里,我设置了set names的编码格式是uft-8,页面的meta里也是设置的utf-8,数据库里也是使用的utf-8的编码,但是依然是出现乱码,后来才发现,set names这后面的utf-8 应该写成utf8 其实含义都是一样的,只是mysql称为utf8 而网页称它为utf-8,就像一个人,有一个书面的名字,也有一个小时候的乳名,其实都是同一个人。
再另一个乱码的问题是在分页的时候,我的那个分页导航是从网上找的。直接拿到程序中用了,可是奇怪的时候,其它的都正常,只有分页导航是乱码,后来在网上找了很多资料,都不是特别的清楚.一个偶尔的机会,我在打开我的那个分页函数所在的文件的时候,发现里面全是乱码才知道,设置成utf-8编码只是其中一步,文件在保存的时候,也需要保存成utf-8的编码才可以,我转换之后,就正常了。
不过有一些疑问,假如我使用的编码不是utf-8的,如果是gbk或者是gb2312编码的时候,这时候,在保存文件选择编码是否也有讲究?
关于乱码,还是有些迷糊,比如页面是utf8 数据库使用gb2312 set names该怎么设置,这些东西,还是找个时间,好好查下清楚吧,
4.就是关于引用文件路径的一个问题。我的项目结构大致是这样的
mysite
----admin
------files
a.php
----confing.php
----config
-----config.php
也就是说mysie下有两个文件夹,admin和config,admin下有一个config.php文件和一个files下的a.php config文件夹下有一个config.php文件 admin/config.php 文件里引用了config/config.php文件,而a.php文件又引用了admin/config.php文件,这时候,a.php中就会报错,说找不到config/config.php文件。后来查了许多资料,有些说要定义一个单一入口什么的,对这个不太了解,后来找了一个折衷的办法,就是每个引用文件不在单纯的使用比如admin/config.php引用config/config.php文件时,一般的写法就是include('../config/config.php'); 现在换成include(dirname(dirname(__FILE__)).'/config/config.php');
dirname(__FILE__)就是当前页的目录 ,再加个嵌套就是上一层,依次类推,不过目前不知道这样做有没有什么弊端,听一些网友说性能方面不如绝对路径。
5.关于图片上传。
这个上传也是从网上找的。经过一些小的修改,但是在保存图片路径的时候,有一个问题比较棘手,因为我的项目是分前后面的,上传图片目录一般是保存在mysite根目录下的,也就是和admin目录是同级,而upload.php文件是在admin/files/upload.php,那么这时候,要想上传到upload文件夹下上传路径为../../upload/ 而如果保存路径的话,那么数据库里就需要保存成../../upload/xx.jpg,而我的前台显示的相关文件是在根目录下的,和admin是同一级别,在引用文件的时候,直接是upload/xx.jpg就可以了,可是数据库里保存的却是../../upload/xx.jpg这时候不知道该怎么处理,后来想了一个折衷的办法,就是在数据库里只保存文件名,至于路径,在admin/config.php文件里定义一个常量为define(ADMIN_UPLOAD,'../../upload/');这个路径是后台专用的,前台想使用的话,就在confing/config.php里定义常量为define(UPLOAD,'upload/'); 就可以了。
6.最后就是关于图片显示,如图:
这个是做的最终效果,刚开始的时候,想使用ajax实现,因为刚学这个东西,一时半会儿也学不会,后来在网上找到了一种插件是prototype的一个lightbox插件,就是专门用显示图片的,感兴趣的可以到网上搜索下,这里就不再多说了。刚开始使用这个插件的时候,搞了半天没有弄成功,先简单介绍下这个插件的使用方法吧:
从网上下载之后,在页面的head里加入下面的几句代码,然后在稍微的加一些属性就可以了
<script type="text/javascript" src="../images/js/prototype.js"></script>
<script type="text/javascript" src="../images/js/scriptaculous.js?load=effects,builder"></script>
<script type="text/javascript" src="../images/js/lightbox.js"></script>
//上面是他的三个js文件,这个是基于prototype写的,所以在写的时候,注意顺序,必须是先引入prototype.js再引入其它,不然,可能会出错,
<link rel="stylesheet" href="../images/css/lightbox.css" type="text/css" media="screen" />
//下面的是一个css文件
然后在<a href="" rel="lightbox" title=""><img src="" /></a>
引入相关文件之后,然后在超连接的标签中设置rel="lightbox" 就可以了,而title就是显示上面的标题可以显示一些描述性的文字。
我刚设置好之后,没有效果,郁闷了半天,后来才发现,我少两个js文件,就是
<script type="text/javascript" src="../images/js/scriptaculous.js?load=effects,builder"></script>这一句里面的load后面的两个文件,effects.js和builder.js文件。后来从官网上下载了两个,设置了下,就成功了。
本来的图片上只是显示相关文字的,是不能有编辑功能的,后来想了一个办法,做成了上面的图,就是在绑定图片数据的时候,构造一个字符串,比如:
$title="<form method='post'><input type='text' value='".$row[imgtitle]."' name='title'/><br /><input type='submit' value='编辑' name='submit' /><input type='hidden' name='img_id' value='".$row[id]."' /></form>";
而且,在titile="<?php echo $title ?>"; 就可以了。本来是想用ajax的,后来看了一些资料,比较迷茫,先暂时使用这种方式吧,等学会了ajax,再慢慢改造。
效果出来以后,在浏览图片的时候,发现在输入N和P字母的时候,会响应上一张和下一张的事件,我想,应该是一个快捷键吧,后来在lightbox.js里把判断这两个键的代码注释掉,就OK了。
不过这个效果有两个不好的地方,
第一就是,我后台使用的是iframset框架,所以这个遮罩只遮住了子窗口,并不能全部都遮住,所以,以后使用后台导航功能,尽量使用div+css的进行控制,不使用这种。
第二就是,在浏览图片的时候,按小键盘上的数字键3会自动的取消浏览,就相当于点那个关闭按钮一样,不知道为什么,我看了源代码,并没有做这个键的判断,不知道是不是bug。目前没有特别好的解决办法。
7.动态输出几行几列
这个在显示图片的时候根据读取数据库中的数据的条数,然后一行显示3张图片,进行显示,后来根据自己的改造,自己写了一个算法,先把模型贴出来吧。
<table>
<tr>
<?php
$i=1;
while ($i<=20){
if($i<3)
{
//如果小于3按单元格显示
echo "<td>".$i."</td>";
}
if($i%3==0 ){
//如果是3的倍数显示每行的最后一个单元格,然后输出<tr>标签
echo "<td>".$i."</td>";
echo"</tr><tr>";
}
if($i>3 && $i%3!=0){
//如果大于3并且不是3的倍数
echo "<td>".$i."</td>";
}
$i++;
}
?>
</tr>
<table>
不过有一个不好的地方就是如果数据的总记录数不是3的倍数,那么最后一行,可能就只有两个单元格了,这个怎么填充,暂时没有想法,以后补出来。
8.就是关于jquer的validate插件的一些使用,过程中也遇到过一些问题,暂时就先不多述了,就说这么多吧,感觉收获蛮大的。
接下来想使用thinkphp重新把这个网站再做一遍,之前使用的大部分是表格模板,控制起来,非常的困难,这次使用的时候,找一个div的模板。顺便学下这方面的知识