对自己当前PHP知识掌握情况的一个总结

陈勇文 发表于 闲扯 分类,标签:
4

1、可以在windows下简单搭架PHP的开发环境,这个是最基本的,只有环境搭配好了,才可能谈得上去学习和开发。这里主要是指appach+php+mysql环境的搭配,对新手来说,通常采用的是wamp安装包。到现在,我也依然是采用wamp安装包进行环境搭配,不知道独立安装会不会更好呢?以后再作探讨。至于iis+php环境的搭配也略懂一点,不过不会去作深入研究,因为appach+php+myql是最好的搭配了。另外需要深入学习的是在linux系统下进行php环境的搭配,LAMP才是王道(L指linux,A指appach,M指mysql,P指php(或者Perl或者Python).

2、熟练掌握基本的语法。环境搭配好后当然是对基本的语法的学习了,我这里所说的基本语法是指怎么去书写php,也就是怎么使用php,php的标记风格有哪些,php的数据类型有哪些,php的注释方式,常用的流程控制语句(if,while,for,switch,foreach等),php如何与数据库(常用的mysql)进行连接。对我来说,可以开发一个简单的留言板,也就算对php基本语法基本掌握了。

3、熟练掌握常用的函数。函数可以帮我们更快速地开发,可以说掌握越的函数越多,我们的开发工作也变得越简单,而且使用系统内置的函数执行效率也比较高。php系统内置的函数很多,当然是不可能每一个都记住啦,所以对一些不是常用的函数有大致的印象就可以了,大概知道有这样的一个函数是用来干什么的,当我们需要用到的时候去百度一下把它找出来。

4、能解决基本的编码问题。新手来说,可能很容易遇到编码问题,也就是出现乱码,通常出现乱码是因为编码不统一。我采取对策是全部统一采用utf-8编码,utf-8编码是国际编码,所以utf-8编码应该是个趋势吧。我是这样设置的,php文件前都加一句header("Content-type:text/html;charset=utf-8);强制页面以utf-8编码显示,html文件在<head></head>标记间加了一句<meta http-equiv="Content-Type" content="text/html; charset=utf-8">;用到数据库时还要加一句mysql_query("set names utf8");至于数据库创建那里好像不用utf-8编码也可以,不过最好还是用。这样基本上不会出现乱码的情况,至少我还没遇到过。

5、模板引擎smarty.因为用过smarty进行了一次新闻系统的开发,所以对它用法基本上还是比较了解的。

6、对在线编辑器有一定的了解,这里我使用的是fckeditor,能够对fckeditor进行简单配置,去除不必要的功能,实现文件上传。

7、面向对象跟正则表达式。面向对象更重要的是掌握它的思想,这个是个大趋势来的。正则表达式,这个也是要掌握的重点。不过自己对这两个的接触还只算皮毛,实际应用得还是比较少,以后开发的时候会多加注意。

上面大致是我对php的一个掌握情况,接下来会大致朝两个方向学习,第一,常用的开发框架(目前正在学thinkphp开发框架);第二,对linux系统的学习。

php+mysql+smarty新闻系统发布

陈勇文 发表于 PHP程序发布 分类,标签: ,
7

经过几天的熬夜,终于把这个新闻系统弄出来了,经测试基本上没什么大问题,如有问题,欢迎留言提出。

简单介绍一下这个新闻系统:
1、自动创建数据库,现在都比较偏向于这个,对其他使用者也比较友好,把文件解压到跟目录下,运行install.php文件进行安装,运行首页文件也可以,这里我做了个简单的判断,如果没有创建数据库,就会自动跳转到安装界面。安装成功后install.php文件会改为install.lock,如果想重新安装,改回原来的名字就行了。

2、强大的后台的功能,先声明一下,这个后台本非本人开发,而是采用了php100.com张恩民老师提供的后台程序,我只是做了些修改。说这个后台强大,其实也是相对的,只是我觉得这个后台的扩展性很好,如果我们想去增加某个功能,也是非常容易的。

3、智能化的前台,哈哈,说智能化是夸张了点。前台采用了smarty技术,实现了模板跟程序的分离,模板我是从网上找到的“老村长简洁的模板”,程序基本上是由我一个人编写,有一些采用了开源代码。为什么说前台是智能化的?比如说,后台添加了一个分类,前台会自动循环出来,但仅限于父分类,二级分类不行。再说一下,后台的分类管理是可以实现无限循环的功能,就是说可以无限添加子分类,所以朋友们可以去扩展一下前台,把子分类也循环出来。再一个比较智能化的是,图文新闻的显示,其实是后台的功能,在添加新闻时,程序会根据你是否有插入图片也来判断是否图文新闻,然后再在前台的图文模块里显示出来。

4、后台默认的用户名跟密码是admin,这个没什么好介绍的了,后台可以修改密码。

这几天感觉很充实,也感觉很累,确实体会到做一个程序员很辛苦,不过我会继续坚持,做我喜欢做的事情。

下载地址:phpnews

PHP中完美解决fckeditor上传中文文件与新建中文目录出现乱码的问题

陈勇文 发表于 PHP技术 分类,标签: ,
5

转载于:http://hi.baidu.com/houwenbin1986/blog/item/583acec52ea3dac139db49bd.html

1、修正上传中文文件时文件名乱码问题
在文件fckeditor/editor/filemanager/connectors/php/commands.php中查找:
$sFileName = $oFile['name'] ;
在后面添加一行:
$sFileName = iconv("utf-8","gbk",$sFileName);

2、修正文件列表时中文文件名显示乱码问题
在文件fckeditor/editor/filemanager/connectors/php/util.php中查找:
return ( utf8_encode( htmlspecialchars( $value ) ) ) ;
修改为:
return iconv('','utf-8',htmlspecialchars( $value ));

3、修正新建中文文件夹时的文件夹名乱码问题
在文件fckeditor/editor/filemanager/connectors/php/commands.php中查找:
$sNewFolderName = $_GET['NewFolderName'] ;
在后面添加一行:
$sNewFolderName = iconv("utf-8","gbk",$sNewFolderName);

1、2步解决上传中文文件出现乱码的问题,2、3步解决新建中文目录出现乱码的问题,第2步很关键额,因为它关系到显示文件列表跟目录列表。
tp

哈哈,终于找到了解决这个中文乱码的问题,另外网上也有另外一种解决上传中文文件出现乱码问题的方法,就是通过把上传的文件名改成不是中文来保存,这种方法也不错,具体怎么操作大家可以去网上搜一下,不过我还是比较喜欢上面的这种方法,这样文件看上去比较直观点,方便以后查找。

即将发布一个新闻系统

陈勇文 发表于 闲扯 分类,标签: , ,
1

这几天头脑发热,脑子里想的满是代码,搞得连觉都睡不好,哎,浪费了这么好睡觉的天气,这次的新闻系统采用php+mysql+smarty技术完成,由于第一次使用smarty开发一个完整的网站,头脑很是兴奋,虽然之前也有接触smarty,但都是很零散的知识,这次把它们都穿起来了,很是兴奋啊。

太过兴奋了,所以在博客表达一下自己的心情,哈哈。嗯,继续开始开发了,估计这个星期就能完成。

PHP无限分类的原理

陈勇文 发表于 PHP技术 分类,标签: ,
0

什么是无限分类呢?就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去。

那PHP又是如何实现它的无限分类的呢?如何把它的各个分类一一列出来呢?
首先我们假设有这样的一个三级分类,新闻→PHP新闻→PHP6.0出来了。
如果我们要查找“PHP6.0出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现无限分类的功能了。

//我们建一个表"class"
CREATE TABLE `class` (
  `id` int(11) NOT NULL auto_increment COMMENT '分类id',
  `f_id` int(11) NOT NULL COMMENT '父id',
  `name` varchar(25) collate gbk_bin NOT NULL COMMENT '分类名称',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ;
 
//首先我们往数据库里插入‘新闻’这个大分类,因为‘新闻’是最大分类,上面没有父类了,所以我把它的f_id设置为0。
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(1, 0, '新闻');   //id这个字段是自动增长的,可以不写值。
 
//然后我们再往数据库里插入‘PHP新闻’这个分类,它的父类‘新闻’的id是1,所以它的f_id设置为1。
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(2, 1, 'PHP新闻');
 
//然后我们再往数据库里插入‘PHP6.0出来了’这个分类,它的父类‘PHP新闻’的id是2,所以它的f_id设置为2。
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(3, 2, 'PHP6.0出来了');
 
//同理,我们可以这样一直往下插入分类,也就达到了无限分类。
//我们可以发现插入一个分类的原则关键是找到这个分类的父类的id,然后作为这个分类的f_id字段的值。
//假设要插入跟‘新闻’同一个级别的分类‘技术’,也就是说它也是最大分类,上面没有父类了,那么它的f_id也设置为0;
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(4, 0, '技术'); 
 
//在‘技术’下面又有一个分类‘PHP技术’,那么我们怎么插入呢,首先找到‘PHP技术’的父类‘技术’的id,然后作为自己的f_id字段的值。
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(5, 4, 'PHP技术'); 
 
//看到这里,想必大家应该都明白怎么往数据库里插入各个分类了。就不再举例了。

我们已经知道如何往数据库里插入各个分类了,那又如何把各个分类罗列出来呢?

<?php
header("Content-type:text/html;charset=utf-8"); 
$db=new mysqli("localhost","root","","news_php100") ; //实例化一个数据库连接。使用这个前一定要确保已经加载了mysqli类库,或者用mysql_connect这个方式连接。 
if(mysqli_connect_errno()){
 	echo "链接失败:".mysqli_connect_error();
 	exit(); } 
$db->query("set names utf8");
$result=$db->query("select name from class where f_id=0"); //查找f_id=0的分类,也就是查找每一个大类。
while($row=$result->fetch_assoc()){
      echo $row['name']."<br>";        //这样就把每个大类循环出来了。
}
//同样我们可以把新闻的子类循环出来。
$result=$db->query("select * from class where f_id=1"); //查找f_id=1的分类,也就是查找‘新闻’的子类。
while($row=$result->fetch_assoc()){
      echo $row['name']."
";        //这样就把‘新闻’的子类循环出来了。注意:只是子类,不包括孙子类。
}
//写到这里,我们会发现一个问题,如果这个分类是10级分类,难道我们要写10个循环把它每个子类循环出来?如果是更多级分类呢,这样写显然是不现实的。
//那又有什么办法解决呢?我们可以写一个递归的函数,把f_id作为参数传入,不断循环每一个f_id的值,也就是说把每一个f_id值的子类循环出来。
//首先我们把各个分类的值保存在一个二维数组中,在下面的递归函数里有用。
$result=$db->query("select * from class");
while($row=$result->fetch_assoc()){
     $arr[]=array($row[id],$row[f_id],$row[name]);    //每一行保存一个分类的id,f_id,name的信息。
}
function fenlei($f_id=0){     //$f_id初始化为0,也就是从最大分类开始循环.
    global $arr;   //声明$arr为全局变量才可在函数里引用。
    for($i=0;$i<count($arr);$i++){       //对每个分类进行循环。
           if($arr[$i][1]==$f_id){         //$arr[$i][1]表示第$i+1个分类的f_id的值。开始$f_id=0,也就是把f_id=0的分类输出来。
                 echo $arr[$i][2]."<br>"; //$arr[$i][1]表示第$i+1个分类的name的值。
            fenlei($arr[$i][0]);   //$arr[$i][1]表示第$i+1个分类的id的值。进行递归,也就是把自己的id作为f_id参数把自己的子类再循环出来。
}
}
}
?>

php+mysql投票系统

陈勇文 发表于 PHP程序发布 分类,标签: , ,
19

原创:searchshu.com
修改:googlephp.cn,转载请注明。

特点:
1、自动安装。配置好相关信息后,可自动创建数据库,表。
2、一个IP只能投一票。
3、界面简洁。
4、文件体积小,只有20KB。
5、可发布单选、多选投票主题,暂不支持图片投票。
6、浏览器兼容性好。经测试,IE6,IE7,firefox都能正常使用。
7、后台管理方便。

操作流程:(注意使用时要开启短标签。)
第一步:修改config.php文件,填写服务器ip地址,数据库名,连接数据库的用户名、密码。

第二步:运行install.php文件安装投票管理系统

第三步:安装成功后删除install.php文件    //不删除也可以。

第四步:登陆后台添加投票主题
管理员系统默认帐号为admin 密码为admin

发布投票主题后就可以访问首页文件index.php了。

注意事项:
1、本地安装时,一定要保证appach和mysql已经启动了
2、运行安装文件install.php的路径一定要正确,比如说把文件夹vote解压到根目录下时,应该运行http://localhost/vote/install.php安装,而不是http://localhost/install.php

点击这里进行下载.

案例图片展示:(为了使图片打开快点,所以只截取了部分页面,另外页面是居中显示的)
1、首页界面
2、投票结果界面
3、后台界面

如有问题,欢迎留言指出。

实用的Javascript代码----轮播图片

陈勇文 发表于 javascript 分类,标签: ,
7

演示网址:http://www.googlephp.cn/demo/demo1.html

如果觉得有用就继续往下看,否则就PASS掉。

代码如下:   

<SCRIPT>
var widths=510;          //设置图片宽度
var heights=250;         //设置图片高度
var counts=5;            //设置图片的个数
img1=new Image ();img1.src='image/1.jpg';         //设置图片1的的路径 ,就是src="image/1.jpg",路径一定要正确,否则显示不出来。
url1=new Image ();url1.src='#';                   //设置图片1的链接网址,就是src="#",把#替换成你想要链接的网址.
img2=new Image ();img2.src='image/2.jpg';         //设置图片2的路径
url2=new Image ();url2.src='#';                   //设置图片2链接的网址
img3=new Image ();img3.src='image/3.jpg';         //其它设置跟上面一样。
url3=new Image ();url3.src='#';
img4=new Image ();img4.src='image/4.jpg';
url4=new Image ();url4.src='#';
img5=new Image ();img5.src='image/5.gif';
url5=new Image ();url5.src='#';
//天极伊永恒原创     //googlephp.cn修改版。
var nn=1;
var key=0;
function change_img()
{if(key==0){key=1;}
eval('document.getElementById("pic").src=img'+nn+'.src');
eval('document.getElementById("url").href=url'+nn+'.src');
for (var i=1;i<=counts;i++){document.getElementById("xxjdjj"+i).className='axx';}
document.getElementById("xxjdjj"+nn).className='bxx';
nn++;if(nn>counts){nn=1;}
tt=setTimeout('change_img()',5000);}          //设置变换图片的时间,单位毫秒,5000表示5秒换一次图片。
function changeimg(n){nn=n;window.clearInterval(tt);change_img();}
document.write('<style>');
document.write('.axx{padding:1px 7px;border-left:#cccccc 1px solid;text-decoration:none;color:#fff;line-height:16px;font:12px sans-serif;background-color:#666;}');
document.write('.bxx{padding:1px 7px;border-left:#cccccc 1px solid;text-decoration:none;color:#fff;line-height:16px;font:12px sans-serif;background-color:#D34600;}');
document.write('</style>');
document.write('<div style="width:'+widths+'px;height:'+heights+'px;overflow:hidden;text-overflow:clip;">');
document.write('<div><a id="url" target="_blank"><img id="pic" style="border:0px;filter:progid:dximagetransform.microsoft.wipe(gradientsize=1.0,wipestyle=4, motion=forward)" width='+widths+' height='+heights+' /></a></div>');
document.write('<div style="filter:alpha(style=1,opacity=10,finishOpacity=80);background: #888888;width:100%-2px;text-align:right;top:-16px;position:relative;margin:1px;height:16px;padding:0px;margin:0px;border:0px;">');
for(var i=1;i<counts+1;i++){document.write('<a onmouseover="javascript:changeimg('+i+');" id="xxjdjj'+i+'" target="_self">'+i+'</a>');}
document.write('</div></div>');
change_img();
</SCRIPT>

代码要设置的都有详细注释了,主要有这几个:图片的高度,图片的宽度,图片的个数,图片的路径,图片链接的网址,变换图片的时间。这里不对程序代码作详细的解释了。如果想了解的话,可以留言继续探讨。

苦命的程序员,冏

陈勇文 发表于 闲扯 分类,标签:
2

cxy

详解setcookie的各个参数

陈勇文 发表于 PHP技术 分类,标签: ,
0

bool   setcookie(string name[,string value[,int expirel[,string path[,string domain[,int secure]]]]].

第一个:name,必选参数,这个是cookie的变量名,可以通过$_COOKIE['user']调用变量名为user的cookie.

第二:value,可选参数,这个cookie变量的值,比如说setcookie("user","php"),我们通过调用$_COOKIE['user']可以得到php值;

第三个:expire,可选参数,这个是用来设置cookie变量保存的时间,注意是我们设置的的UNIX时间戳减去当前的UNIX时间戳才是cookie变量保存的时间。(UNIX时间戳:是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数) ,一般我们可以通过time()函数获取当前的UNIX时间戳,再加上我们要保存的时间(单位为秒)比如说,setcookie("user","php",time()+3600),这样我们就可以保存user这个cookie变量的时间为3600秒。另外我们可以通过设置的时间戳小于当前的时间戳来删除cookie变量,比如说setcookie("user","php",time()-1)这样我们就删除了user这个cookie变量了。

第四个:path,cookie的有效范围,这个参数是下一个参数domain基础上的有效范围,如果path设置为"/",那就是在整个domain都有效,比如setcookie("user","php",time()+3600,"/"),这样我们domain下的任何目录,任何文件都可以通过$_COOKIE['user']来调用这个cookie变量的值。如果path设置为"/test",那么只在domain下的/test目录及子目录才有效,比如domain下有两个目录: test1,test2,我们设置为setcookie("user","php,time()+3600,"/test1"),那么只有test1目录下才能通过$_COOKIE['user']调用user这个cookie变量的值,test2目录下获取不到。

第五个:domain,cookie有效的域名,如果domain,设置为googlephp.cn,那么在googlephp.cn下的所有子域都有效。假设googlephp.cn有两个子域,php.googlephp.cn,css.googlephp.cn,我们设置为setcookie("user","php",time()+3600,"/","php.googlephp.cn"),那么只有在php.googlephp.cn这个子域下才能获取user这个cookie变量的值. 再举一个例子:setcookie("user","php",time()+3600,"/test","php.googlephp.cn"),那么只有在php.googlephp.cn这个子域下的test目录下才能获取user这个cookie变量的值.

第六个:secure,值cookie是否仅通过安全的https,值为0或1,如果值为1,则cookie只能在https连接上有效,默认值为0,表示cookei在http和https连接上都有效。

使用cookie技术计算网站的月访问量:

<?php
header("Content-type:text/html;charset=utf-8"); //选择utf-8编码
   if(empty($_COOKIE['counter']))   //如果cookie不存在
       $counter=1;                    //设置$counter的初始值为1;
   else                                                 //如果cookie存在
       $counter=$_COOKIE['counter']+1 ; //每刷新一次页面,将$conunter变量的值累计加1.
   //每刷新一次页面,cookie变量的值都重新赋予新的$counter的值,也就是不断累计加1.
   setcookie('counter',$counter,time()+2678400);//time()+2678400就是说保存2678400秒,也就是一个月。     
  echo   "你是第 $_COOKIE[counter] 位访客!!";  //通过$_COOKIE['counter']调用cookie变量的值。
?>

如有问题,欢迎指正。

解决Cannot modify header information

陈勇文 发表于 PHP技术 分类,标签:
2

Warning: Cannot modify header information - headers already sent by (output started at /home/xxx/public_html/wp-config.php:1) in /home/xxx/public_html/wp-includes/pluggable.php on line 770

就是像类似于上面的问题。上次帮朋友修改wordpress模板,其中要把一些英文的改为中文,我们知道中文要正常显示的话,那就应该把文件编码改为utf-8,可是等我上传到服务器后就出现了上面的信息。后来经过我搜索,才知道utf-8编码有两种模式,UTF8 with BOM和UTF8 no BOM,UTF8 with BOM这种模式的话会在文件的第一行多出一个php无法识别的标志。这个标识是隐藏的,所以我们也看不到,也删除不掉,于是就出现了上面的问题。

那应该如何解决呢?有两种办法:第一种就是换另外一种编码,第二种就是把utf-8编码的模式改为UTF8 no BOM.像windows自带的记事本工具是修改不了的,因为它没有区分这两种模式。我们可以去下载一个emeditor工具(下载地址:http://www.crsky.com/soft/4278.html)其它能修改的工具也可以,然后用这个工具打开文件,把文件的编码另存为utf8 no bom这种模式。如下图:

12

这样问题基本就解决了。如还有其它问题,欢迎一起探讨。