• 22 Nov 2008 /  PHP

    用了PHP,发现PHP的功能确实很强大,而且有很多实用的函数。以前ASP还得用什么无组件上传类,而PHP直接处理了上传的请求,对于上传的文件,是先保存在upload_tmp_dir里面,这个文件夹是在php.ini里面设置的。那么PHP上传其实只要做一件事:用move_uploaded_file函数把临时文件移动到指定目录!如果没有移动,在会话结束后临时文件也会被删除!

    上传示例代码如下:

    <?php
    if($_REQUEST['act']==’upload’){
     $uploadFile=’upload/’.time().$_FILES['userfile']['name'];
     if(!file_exists($uploadFile)){
      move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadFile);
      echo $_FILES['userfile']['name'].’<br>’;
      echo $_FILES['userfile']['size'].’<br>’;
      echo $_FILES['userfile']['type'].’<br>’;
     }
    }
    ?>
    <form enctype=”multipart/form-data” action=”?act=upload” method=”POST”>
        Send this file: <input name=”userfile” type=”file” />
        <input type=”submit” value=”Send File” />
    </form>

    Tags: ,

  • 18 Nov 2008 /  PHP

    PHP刚入门,如何能快速用PHP开发应用呢?个人一直认为,语法变量函数都很好掌握,毕竟PHP这种类C语言很好学。关键是要封装几个自己的类:数据库操作类,常用验证类,还有一个就是搭框架要用的常用函数的集合。有了这3个类库,再加PHP本身的函数,一般的开发都会很简单了。

    这里首先展示一个自己封装的PHP数据库操作类。为什么先写这个类呢?因为一旦这个类完成,基本的数据库添删改查都解决了。好了废话少说,先看类的调用情况,我这里用2个文件展示一个轻量级的架构,一个ini.php ,这个文件定义写一些常量以及需要包含的类文件,另外一个就是test.php文件了,展示怎么调用这个数据库操作类,test.php完成数据库的查询,分页操作,并且我做一条简单的插入操作的演示;在这里实验用的数据表为 t_test(id,test) ,这个表就2个字段。演示地址:http://myphp.net0791.com/test.php

    先看 ini.php 文件:

    define (”db_name”,”db_lt”);//$dbname数据库名
    define (”db_username”,”db_xxx”);//$dbusername登陆数据库用户名
    define (”db_password”,”xxxx”);//$dbpassword登陆数据库密码 

    require_once(’db_class.php’);

    $objDB=new DBClass();
    $objDB->connect(db_name,db_username,db_password,’gbk’); 

    看,这个文件很简单,做3样事,1)定义数据库用户名密码等;2)引用一个类文件 3) 创建一个新对象,并调用它的方法连数据库。 这是一个非常平常的引用文件,和我们的asp的 conn.asp 基本完成一样的事;当然其实第3步可以放在test.php里面;不过我更喜欢放在这里!因为DBClass类在写的时候就考虑很全面了,等下从test.php就可以看出;

    test.php 文件:

    require_once(’ini.php’);
    $objDB->pagesize=10;      //设置分页的页数,如果不需要分页则不设置;
    $objDB->execute(’select * from t_test order by id asc’);  //需要执行的查询语句,当然也可以是非查询语句,execute函数会智能判断;
    //$objDB->execute(’insert into t_test(test) values(\’测试\’)'); //执行插入语句,execute会自动判断是查询还是插入,这个函数可以在页面多次调用,只要还是同一数据库;
    while($rs=$objDB->fetch_array())  //利用fetch_array()函数去将查询结果分成数组{
     echo ‘<br>’;
     echo $rs['id'];
     echo ‘&nbsp;&nbsp;’;
     echo $rs['test'];
     echo ‘<br>’;
    }
    $objDB->free_result();  //如果是查询,则请空查询结果,方便下一次select的传入;
    echo $objDB->showpage(); //分页显示! 不需要传额外的任何东西,页码的越界问题DBClass都考虑了,而且自动记忆URL的内容,方便做搜索和多参数的分页

    大家看上面的test.php, 写法非常方便,在整个过程中,我们不需要考虑数据库连接,因为在对象销毁的过程中,会自动关闭连接;而且不必考虑分页参数等问题,因为分页函数已经帮我们做完了这些;那么一个查询可以归纳为:

    1)创建对象;2)连接数据库;3)设置每页显示记录条数并执行sql语句;4)获得结果一维数组;5)按自己想要的方式显示;6)清空结果集;7)分页;

    当然这里的 第6步其实也可以省略,因为类销毁的时候会自动清空结果集;

    这种写法其实非常类似于ADO的写法,唯一区别就在 ADO 循环的时候需要 while(rs.EOF) 而且需要 rs.movenext() 将游标下移;其实这种写法已经比ado的更简化一步了。就是少了rs.movenext();循环的条件就是$rs这个一维数组是否为空;

    其实DBClass 类是非常灵活的,如果不需要分页的时候,只要不设置每页显示记录条数就可以了。正因为这种灵活性,所以一般我倾向于将对象的建立放在ini.php里,这里可以建立一个 DBClass对象作为全局对象,因为我们每个页面基本都需要和数据库合并起来!那需要做符合查询怎么办呢?我们可以将第2次查询封装在函数里,因为函数的作用域只有本身,这样只要在函数里建立一个DBClass就可以完成局部查询,而且查询完毕(退出函数)会自动清空数据库连接。这样的程序就比较健壮了。DBClass在分页的时候还考虑到了伪静态情况下分页!因为很多时候我们的分页都是需要做成:/test.php/1.html     这种形式,这里的1.html是可以换的,比如 2.html。如果要做成伪静态怎么办呢?也很简单,只要把echo $objDB->showpage(); 改成: echo $objDB->pageindex(’/test.php/$$.html’); 就可以了;其实showpage() 就是调用了pageindex的方法,如果要改成英文的也很好做,只需要showpage(’English’) 就可以了。

    当然,也可以继承DBClass构建出自己的类,在DBClass里面全部的内部变量都是public 或 protected 的属性,方便做扩展。

    DBClass类文件下载:db_class

    Tags: , ,

  • 14 Nov 2008 /  PHP

    学习PHP,先将与ASP相异的部分归纳出来,再用php的类封装一个验证类,数据库操作类(包含分页),再找套在线编辑器,PHP就算入门了。

    PHP与ASP都是解析型语言,不要预先定义变量,不过PHP与ASP还是有很大的不同

    1)PHP的变量作用域更小!比如,我在写ASP的函数时,为了和全局变量相区分,需要在函数里dim显式定义变量。而PHP则完全相反,如果没有定义,则变量的作用域只在函数里。如果是全局变量,需要用 global 定义;PHP字符串连接用”.”,并且单引号才是输出字符串,双引号则类似于C++,可以将表达式;

    2)PHP更灵活,很多地方用到了较难理解的细节!比如,对于if和while的判断,本来应该是判断true or false , 但是由于是解析型的语言,直接用变量是否为null或0作为判断,如果是null或0则为false,如果不为null或0则为true;这些语言的灵活性虽然方便了我们,但是也加大了阅读理解的难度。用得最多的在返回数据分组。如果在asp里面我会用 if rs.eof 来判断是否有记录,而在php里面直接 $rs=mysql_fetch_array($result) 开始一直不理解,当然,C#,java也有一样的语法,比如 rs.read(); 但是C#是面向对象的,这个read() 方法本来就是要返回布尔值的,如果读到则在读取对象内部的数组;而PHP是利用函数来完成此功能,可读性很差!在我写完这条函数的时候,我一直很纳闷,又不是对象,怎么能这样写呢? 原来正是利用语言的灵活性才写出这样的代码;它的意思就是对$rs 进行判断,如果不为null则go on,是null就中断。当然我这里只举了一个例子,这样的例子还有很多!比如 or die(”)  这样的写法,利用了编译器的预编译原理,也就是,如果or 前面为true,就没必要执行die了,如果不为true就执行die(”) ;  其实我个人建议:学PHP如果有更好的方法实现相同的功能,最好不要这样写,这样会引起很多的歧义!当然,稍微有点C语言基础的都知道怎么回事,毕竟大学里面学c,c++老师都会说。

    3)PHP支持范围运算符”::” ; 这个东西很有用,可以写出类似C# static静态函数的东西,也就是不构建对象也能输出内容,这样对于一些封装的判断很管用;而且PHP支持继承等高级面向对象属性,这比ASP强很多!在PHP5里面有类似static 关键字的东西,可是效果和不加static 是一样的。可能是因为PHP5要兼容PHP4做的吧;所以建议在写PHP类的死后能加上private保护类的函数被外部调用;但是对于变量,如果加上了static 则可以直接用运算符输出;

    4) PHP的类利用默认值可以实现多态;比如

    class A {
     static $a=’123′;
       function expa($a,$b=1,$c=2) {
            return $a+$b+$c;
        }
    }

    echo A::expa(1);

    在这个例子里,只输入了一个变量,照样可以执行,只要对其他的2个赋初始值;这样的好处就是函数的多态性,在C#里面必须写几个函数,当然函数名可以相同;而在PHP里可以很好用这个方法解决;如果相同的函数名,则会报重定义错误。

    Tags: ,

  • 12 Nov 2008 /  PHP

    这几天的日志好像标签没办法访问,百度发现只要在以下代码修改下就可以了:

    wd-includes/rewrite.php 找以下代码:

    function get_tag_permastruct() {
      if (isset($this->tag_structure)) {
       return $this->tag_structure;
      }

      if (empty($this->permalink_structure)) {
       $this->tag_structure = ”;
       return false;
      }

    红色代码里加一个!符号变成:if (!empty($this->permalink_structure))

    Tags: ,

  • 03 Nov 2008 /  PHP

    因公司项目需要决定研究PHP了,先装个wordpress学习下。结果发现:Warning: Cannot modify header information - headers already sent by (output started at .\wp-config.php:1) in .\wp-login.php on line 267 错误。

    找了半天原因,原来是我改 wp-config.php 的时候出了错。php的默认格式是 utf8格式,可是windows的记事本保存utf8格式的时候会包含utf8的签名BOM,也就是在文件的前面会出现一个类似空格的符号。虽然一般这个符号没什么问题,可是php在解析的时候就会出大错!

    解决办法:1)用记事本将wp-config.php保存为 ANSI 格式的文本,这样会就可以解决问题了;不过这时候文本就变成gb2312的格式了。

    2)用其他的编辑器,比如utraledit,editplus或者是dreamweaver,不过用dreamweaver的时候要注意选择编码格式,一定要取消包含Unicode的签名(BOM),要不然还是会出错的。

    Tags: , ,