当前位置:  编程技术>php
本页文章导读:
    ▪自己前几天写的无限分类类       前一周写的吧,使用中效果还不错。 主要思想来自:http://www.phpobject.net/b...[url=http://www.phpobject.net/blog/read.php?49][/url]  这里就不多解释原理了,直接发代码。  PS:这里代码是不能直接使用的.........
    ▪用PHPdig打造属于你自己的Google[图文教程]       一、什么是PHPdig?    PHPdig是国外非常流行的垂直搜索引擎产品(与其说是产品,不如说是一项区别于传统搜索引擎的搜索技术),采用PHP语言编写,利用了PHP程序运行的高效性,极大地.........
    ▪php中的一个中文字符串截取函数       PHP代码: -------------------------------------------------------------------------------- <?php /** ***@Author:LAD ***@URL   :<a href="http://www.cnpik.com/" target="_blank">http://www.cnpik.com/</a> ***@E_mail:lianxiwoo@sohu.co.........

[1]自己前几天写的无限分类类
    来源: 互联网  发布时间: 2013-11-30
前一周写的吧,使用中效果还不错。

 主要思想来自:http://www.phpobject.net/b...[url=http://www.phpobject.net/blog/read.php?49][/url]

  这里就不多解释原理了,直接发代码。

  PS:这里代码是不能直接使用的,必须结合我的一些其他库类。应该说思想才是最重要的,这里主要提供一种分类的思路。
代码如下:

<? 
/** 
--  
-- 表的结构 `daxue8_category` 
--  

CREATE TABLE `daxue8_category` ( 
  `cid` smallint(6) NOT NULL auto_increment, 
  `pid` smallint(6) NOT NULL default '0', 
  `level` smallint(6) NOT NULL default '0', 
  `cname` char(64) NOT NULL default '', 
  `lft` smallint(6) NOT NULL default '0', 
  `rgt` smallint(6) NOT NULL default '0', 
  `uid` mediumint(8) NOT NULL default '0', 
  `username` char(32) NOT NULL default '', 
  `ctime` int(10) NOT NULL default '0', 
  `cstate` tinyint(1) NOT NULL default '0', 
  `gnum` mediumint(8) NOT NULL default '0', 
  `orderstyle` smallint(3) NOT NULL default '0', 
  PRIMARY KEY  (`cid`) 
) TYPE=MyISAM AUTO_INCREMENT=2 ; 

--  
-- 导出表中的数据 `daxue8_category` 
--  

INSERT INTO `daxue8_category` VALUES (1, 0, 1, 'root', 1, 2, 0, '管理员', 1163608814, 1, 0, 0); 
*/ 
class category 

    var $module; 

    var $tbname; 

    function category() 
    { 
        $this->tbname=TB_PREX.'_category'; 
        $this->module=new module($this->tbname); 
    } 

    /** 
      * 增加子节点 
      * @param array $node 待增加子节点的属性 
      * @param int $pid 父节点的ID 
    */ 
    function add($node,$pid){ 
        //检查是否已经存在该节点 
        if($node_exist=$this->module->detail('where pid='.$pid.' and cname=\''.$node['cname'].'\'')){ 
            //$this->error(__FUNCTION__.'():该节点'.$node['cname'].'已经存在!'); 
            //print_r($node_exist); 
            return $node_exist['cid']; 
        } 
        //获取父节点信息 
        $pnode=$this->get_by_cid($pid); 
        //更新其他节点 
        $this->module->query('update `'.$this->tbname.'` set lft=lft+2 where lft>'.$pnode['rgt']); 
        $this->module->query('update `'.$this->tbname.'` set rgt=rgt+2 where rgt>='.$pnode['rgt']); 
        //插入新节点 
        $node['pid']=$pid; 
        $node['lft']=$pnode['rgt']; 
        $node['rgt']=$pnode['rgt']+1; 
        $node['level']=$pnode['level']+1;//层次加一 
        return $this->module->add($node); 
    } 

    /** 
      * 删除节点 
      * @param $cid 待删除的节点的ID 
      * @param $delete_childern 如果该节点存在子节点,是否强制删除。设置未true,则当存在子节点的时候,删除失败,返回false 
      * 
    */ 
    function delete($cid,$delete_childern=false) 
    { 
        //获取节点信息 
        $node=$this->get_by_cid($cid); 
        if(($this->child_num($node)>0)&&(!$delete_childern))$this->error(__FUNCTION__.'():该节点存在子节点!'); 
        //删除该节点及其所有子节点 
        $this->module->delete('where lft between '.$node['lft'].' and '.$node['rgt']); 
        //修改相应的左右键值 
        $plus=$node['rgt']-$node['lft']+1; 
        $this->module->query('update `'.$this->tbname.'` set lft=lft-'.$plus.' where lft>'.$node['rgt']); 
        $this->module->query('update `'.$this->tbname.'` set rgt=rgt-'.$plus.' where rgt>'.$node['rgt']); 
        return true; 
    } 

    /** 
      * 更新一个节点 
      * @param array $set更新集 
      * @param int $cid 更新的节点的主键ID 
    */ 
    function update($set,$cid){ 
        return $this->module->update($set,'where cid='.$cid); 
    } 

    /** 
      * 选取节点及其子节点 
      * @param int $cid节点的主键ID 
      * @param int $deep选取深度 
    */ 
    function select($cid,$deep=0) 
    { 
        //获取节点信息 
        $node=$this->get_by_cid($cid); 
        $where='where lft between '.$node['lft'].' and '.$node['rgt']; 
        if(!empty($deep))$where.=' and level<'.$node['level']+$deep; 
        if($deep==1){ 
            $where.=' order by orderstyle desc'; 
        }else{ 
            $where.=' order by lft asc';             
        } 
        return $this->module->select($where); 
    } 

    /** 
      * 获取父节点路径 
      * @param int $cid 节点的ID  
    */ 
    function get_parent($cid) 
    { 
        $node=$this->get_by_cid($cid); 
        return $this->module->select('where lft<='.$node['lft'].' and rgt>='.$node['rgt'].' order by lft asc'); 
    } 
    /** 
      * 选取子节点 
      * @param int $cid节点的主键ID 
      * @param int $deep选取深度 
    */ 
    function get_children($pid,$deep=0){ 
        //获取节点信息 
        $pnode=$this->get_by_cid($pid); 
        $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt']; 
        if(!empty($deep))$where.=' and level<='.($pnode['level']+$deep); 
        if($deep==1){ 
            $where.=' order by orderstyle desc'; 
        }else{ 
            $where.=' order by lft asc';             
        } 
        return $this->module->select($where); 
    } 

    /** 
      * 获取第deep层子节点 
      * @param int $cid节点的主键ID 
      * @param int $deep选取深度 
    */ 
    function get_level_children($pid,$deep){ 
        //获取节点信息 
        $pnode=$this->get_by_cid($pid); 
        $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt']; 
        $where.=' and level='.($pnode['level']+$deep); 
        $where.=' order by orderstyle desc'; 
        return $this->module->select($where); 
    } 

    /** 
      * 获取节点信息 
      * @param $cid 节点的主键ID 
      * @return array $node 
    */ 
    function get_by_cid($cid){ 
        $node=$this->module->detail('where cid='.$cid); 
        if(!$node)$this->error(__FUNCTION__.'():获取节点'.$cid.'失败!'); 
        return $node; 
    } 
    /** 
      * 获取子节点的数目 
      * @param array $node 节点信息 
      * @return num 
    */ 
    function child_num($node){ 
        return ($node['rgt']-$node['lft']-1)/2; 
    } 
    /** 
      * 按照层次显示分类 
      * @param int $cid节点的主键ID 
      * @output 
    */ 
    function display($cid) 
    { 
        $nodes=$this->select($cid); 
        foreach($nodes as $node){ 
            echo str_repeat('   ',$node['level']-1).$node['cname']."\n"; 
        } 
    } 
/*-------private-----------------------------------*/ 

    function error($msg){ 
        die('ERROR : file '.__FILE__.' function '.$msg); 
    } 

?> 

    
[2]用PHPdig打造属于你自己的Google[图文教程]
    来源: 互联网  发布时间: 2013-11-30
一、什么是PHPdig?

   PHPdig是国外非常流行的垂直搜索引擎产品(与其说是产品,不如说是一项区别于传统搜索引擎的搜索技术),采用PHP语言编写,利用了PHP程序运行的高效性,极大地提高了搜索反应速度,它可以像Google或者Baidu以及其它搜索引擎一样搜索互联网,搜索内容除了普通的网页外还包括txt, doc, xls, pdf等各式的文件,具有强大的内容搜索和文件解析功能。PHPdig同传统的搜索引擎一样,包含了以下三种最基本的技术:

   1.Spider技术

   2.网页结构化信息抽取技术或元数据采集技术

   3.分词、索引技术

   区别于传统搜索引擎,PHPdig适用于专业化更强、层次更深的个性化搜索引擎,利用它打造针对某一领域的垂直搜索引擎是最好的选择。

   二、如何获得这PHPdig?

   PHPdig是免费产品(需要保留版权),最新版本是 phpdig-1.8.9 为了避免Apache以及MYSQL的版本兼容性问题,建议采用较低级的版本,其网站地址是:http://www.phpdig.net ,下载地址是:http://www.phpdig.net/navigation.php?action=download 说明一下,我试用过phpdig-1.8.9版本,但出现了很多问题,改用PHPdig-1.8.8则问题较少。

   三、具体步骤

   1.获取产品

   访问http://www.phpdig.net/navigation.php?action=download下载PHPdig-1.8.8至桌面,解压缩至Apache服务器html目录,一般路径为:D:\usr\www\html\,(如果你没有安装Apache服务器请事先安装,推荐使用Mappm-Server v1.1.9 Final,Mappm-Server 采用傻瓜式安装,一次搞定,方便调试和运行 PHP/CGI MySQL 程序)。

   2.运行并配置PHPdig数据库

   打开浏览器输入http://localhost/phpdig/按回车键,页面列出PHPdig的所有文件及包含文件夹,找一找发现没有默认首页文件(default,index),单击search.php文件出现错误提示:Unable to connect to database : Check the connection script。提示无法完成数据库连接,原来我们还没有完成PHPdig的数据库配置。返回进入admin目录找到install.php文件,单击运行,乍一看,全英文界面(说明一下,PHPdig目前所有版本均不支持中文界面),没有关系,如果你有过汉化经验不妨自己动手将其汉化,这里提供一份我自己汉化的cn-language.php文档的下载(请将其拷贝至locales目录下)。另外你还需修改includes目录下的config.php文件(语言修改)和style.css文件(字体修改和样式修改)。

   进入install.php后系统要求我们输入PHPdig管理用户名和密码,默认情况下均为admin,进入后出现如下界面(汉化后):


(图1)

   所需提供的信息有:

   如果你是在本地测试,请输入默认情况下的服务器名称localhost(localhost是Mappm-Server下的默认务服务器名称,也就是mysql的默认服务器名称,Mappm-Server内置mysql数据库)数据库服务器端口默认为3126,可以不填,数据库sock协议默认为空,用户名默认为root(Mappm-Server默认用户名),密码是你在安装Mappm-Server时输入的用户密码,PHPdig数据库名称默认为phpdig,可任意修改,同时,你可以对数据库中的数据表加前缀,默认为空。

   如果你要上传到与Internet相连的web服务器请向服务器提供商索要mysql服务器的名称或者IP地址以及数据库服务器端口、sock协议、用户名、密码等,数据库名称以及数据表前缀的设置同上。

   至于右边的四个单选按钮,你可以视情况而定,初次使用(安装)选择默认的“建立数据库”

   确认上述信息无误后单击安装按钮,如果连接数据库不成功会提示“不能连接数据库”的错误信息,如果数据库连接成功则会直接跳入管理页面如下图:


(图2)

   3. 界面区域介绍

   区域1是一个文本输入区,默认文字有三行,都是以http开头,大家一看就知道在这里输入要spider的站点的网站地址(建议每次只spider一个网站)。

   区域2是spider选项,搜索深度是指对这个网站spider到几级目录,每页链接数是指针对某个网页最多抓取多少个下面的链接网页。默认情况下都为0,指的是对这个站点进行全站spider。

   区域3显示数据库状态信息,包括已经spider的网站、关键词、索引以及正在spider的站点信息等。

   区域4是一个下拉列表框,罗列出已经spider的站点的网址,选中其中的一个站点,在区域5可以对其进行清除和更新操作。

   区域5不仅提供了对区域4中所选站点的清除和更新操作外,还提供了相关的统计信息入口和对spider的控制等。

   4. 针对特定站点运行spider

   如果你对天极软件频道的内容很感兴趣,你就可以做一个比google更专业的搜索引擎来搜索天极软件的内容,你的这个搜索引擎将比google更全面更深层次。下面我们以spider天极软件频道的内容为例介绍一下如何spider一个网站。

   1)在图2的区域1中输入http://soft.yesky.com,搜索深度和每页链接数都保持默认为0

   2)单击spider按钮,页面跳转到spider信息页面,程序开始自动spider站点http://soft.yesky.com的内容。

   注意:spider网站的过程非常缓慢,如果该网站内容太多,这个过程可能会延续几小时到一天,但你不必担心脚本运行超时,因为系统的timeout时间被设置为最长达48小时。在这个过程中,你也可以中断spider程序的运行,并能重新启动spider程序运行未spider完的网站。需要注意的是若在这个过程中你不小心关闭了spider运行页面,但事实上系统并没有停止spider,仍在消耗系统资源。你可以重新打开spider页面,点击停止spider链接方可释放系统资源。


(图3)

   5. 利用PHPdig进行搜索

   经过一段时间后,spider程序运行的结果是将http://soft.yesky.com网站上的信息抓取到服务器数据库中,主要是对方内容的title信息、关键词信息和页面地址信息等,此时,你就可以通过访问search.php进行搜索了。


(图4)

   你可以选择搜索结果显示的条数,可以选择模糊查找还是精确查找,另外你可以选择针对某个站点的搜索,默认情况下搜索已经被spider的所有站点。


(图5)

   上图是搜索“QQ2006”的搜索结果页面。

   6. 存在的问题

   由于PHPdig的语言设置问题、系统的分词问题以及MYSQL数据库的字符处理问题等,PHPdig对汉语词汇的搜索还存在许多不确定因素,这些东西都有待我们进一步去解决和完善,欢迎广大对此感兴趣的朋友们到网页陶吧-PHPdig主题社区进行探讨。


    
[3]php中的一个中文字符串截取函数
    来源: 互联网  发布时间: 2013-11-30

PHP代码:
--------------------------------------------------------------------------------

<?php
/**
***@Author:LAD
***@URL   :<a href="http://www.cnpik.com/" target="_blank">http://www.cnpik.com/</a>
***@E_mail:lianxiwoo@sohu.com 
***@随便用,不收钱 :-)
*/
function cnSubStr($string,$sublen)
{
    if($sublen>=strlen($string))
    {
        return $string;
    }
    $s="";
    for($i=0;$i<$sublen;$i++)
    {
        if(ord($string{$i})>127) 
        {
            $s.=$string{$i}.$string{++$i};
            continue;
        }else{
            $s.=$string{$i};
            continue;
        } 
    }
    return $s;
}// End Function cnSubStr($string,$sublen)
/////////// Use like this :
echo "<p>__________________________<p>";
$string="242432反对感是456犯得上广泛大使馆地方7890";
$sublen=strlen($string);
$len=20;
echo $string."<p>";
echo "总长为:".($sublen+1)."<p>";
echo "截取数:".$len."<p>";
for($i=1;$i<=$sublen+1;$i++){
    if($i>$len){
        echo $i."<b> →</b> ".cnSubStr($string,$i)."…<br>";
        continue;
    }
    echo $i."<b> →</b> ".cnSubStr($string,$i)."<br>";
}
?>


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3