首页 > PHP教程

ecshop 无限级分类分析

function cat_options($spec_cat_id$arr)

{

    static 
$cat_options = array();

    if (isset(
$cat_options[$spec_cat_id]))

    {

        return 
$cat_options[$spec_cat_id];

    }

    if (!isset(
$cat_options[0]))

    {

       
/*

        初始化关键参数:

        $level:当前子节点深度

        $last_cat_id:当前父节点ID

        $options:带有缩进级别的数组

        $cat_id_array:沿同一路径的父节点依次进驻

        $level_array:该节点的子节点深度,也是依次进驻

       */

阅读全文

PHP常用缓存方式入门教程

PHP常用缓存方式入门教程
第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件。在需要缓存数据

的时候,通过include方式引入,并使用。
第二种,把需要的数据通过serialize函数序列化后直接保存到文件。在需要使用缓存

阅读全文

mysqli的异常处理功能?

mysqli的异常处理功能?
class check{
                        private $host;
                        private $name;
                        private $paw;
                        public $res;
                        function connect($host,$name,$paw){
//                                var_dump($host,$name,$paw);exit();
                                $this->res = @new mysqli($host,$name,$paw);
                                //
                                if(!$this->res){
                                        throw new Exception("MySQL connect is error!");
                                }
                        }

阅读全文

php 二级联动菜单

<?php
//PHP部分:   
  //取得下拉联动数据   
  require("conn.php");
  $result=mysql_query("SELECT * FROM units LEFT JOIN users ON (users.unit=units.unid)");   
  $mx=mysql_num_rows($result);   
   
  for   ($i=0;$i<$mx;$i++)   {   
  $r=mysql_fetch_array($result);   
  $uname=$r['uname'];   
  $unid   =$r['unid'];   
  $usname=$r['username'];   
  $usid=$r['userid'];   
   
  if   ($lasun!=$uname)   {   
  $java1=$java1   .   ""$uname",";   
  $java2=$java2   .   ""$unid",";   
  $lasun=$uname;   
   
  if   ($i>0)   {   
  $java3=$java3   .   "],[";   
  $java4=$java4   .   "],[";   
  }   
  }   else   {   
  $java3=$java3   .   ",";   
  $java4=$java4   .   ",";   
  }   
   
  $java3=   $java3   .   ""$usname"";   
  $java4=   $java4   .   ""$usid"";   
   
  }   
   
  $java1="["   .   substr_replace($java1,"",-1)   .   "]n";   
  $java2="["   .   substr_replace($java2,"",-1)   .   "]n";   

  $java3="[["   .   $java3   .   "]]n";   
  $java4="[["   .   $java4   .   "]]n";   
   
   
   
  //javascript部分   
  ?>
  <SCRIPT   LANGUAGE="JavaScript"   DEFER>   
  var   fMenu   =   <?=$java1?>   
  var   fValue   =   <?=$java2?>   
  var   sMenu   =   <?=$java3?>   
  var   sValue   =   <?=$java4?>   
   
  var   oWhere   =   document.all.tar;   
  var   ofMenu   =   document.createElement("<SELECT   name='unid'>");   
  var   osMenu   =   document.createElement("<SELECT   name='usid'>");   
  with(oWhere)appendChild(ofMenu),appendChild(osMenu);   
   
  createMainOptions();   
  createSubOptions(0);   
   
  ofMenu.onchange   =   function()   {createSubOptions(this.selectedIndex);};   
   
  function   createMainOptions()   {   
          for(var   i=0;i<fMenu.length;i++)ofMenu.options[i]   =   new   Option(fMenu[i],fValue[i]);   
  }   
  function   createSubOptions(j)   {   
          with(osMenu)   {   
                  length=0;   
                  for(var   i=0;i<sMenu[j].length;i++)osMenu.options[i]   =   new   Option(sMenu[j][i],sValue[j][i]);   
          }   
  }   
   
  function   checkuser()   {   
  if   (document.forms[1].elements[1].value=="")   {   alert("没有选择用户");   return   false;   }   
  }   
  </SCRIPT>   
   
  <!-- 在HTML中引用   -->
  <div   id="tar"   style="display:inline"></div>   
  <!--   
  另外附users和units数据表结构   
  表users:   
  userid   
  username   
  unit   
   
  表units:   
  unid   
  uname

阅读全文

php 用户登陆代码,入门教程

php 用户登陆代码,入门教程
 function login_xzy()
 {
  $user_=db("user");
  $session_=db("session");
  $login['email']=strip_tags($_POST['email']);
  $login['pass']=empty($_POST['pass'])?"":md5($_POST['pass']);
  if($user=$user_->where("`email`='{$login['email']}' and `pass`='{$login['pass']}'")->find()){
   if($session_->where("`uid`='{$user['uid']}'")->find()){
    $json['status']=1;
    $json['info']='已登陆的会员!';
   }else{
    $user['total']++;
    $user_->where("`uid`='{$user['uid']}'")->update(array('total'=>$user['total'],'lastip'=>ip2long(getip()),'lasttime'=>time() ));
    $session_->where("session_id='".Session_id()."'")->update(array('uid'=>$user['uid']));
    $_SESSION['user']=$user;
    $json['data']=$user;
    $json['status']=0;
   }
  }else{
   $json['status']=1;
   $json['info']='用户名或密码不正确!';
  }
  echo json_encode($json);
 }

阅读全文

什么是哈希hash 算法

哈希(Hash)表

一般的查找方法基于比较的,查找效率依赖比较次数,其实理想的查找希望不经比较,一次存取便能得到所查

记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,这样查找k时,只要根据这个

对应关系f找到给定值k的像f(k)。这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也

叫散列表)。哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如

何确定哈希函数和解决冲突是关键。

1.哈希函数的构造方法

直接定址法:H(k)=k 或H(k)=a*k+b(线形函数)

如:人口数字统计表

地址 1 2 3 ... 100
年龄 1 2 3 ... 100
人数 67  3533 244 ... 4

数字分析法:取关键字的若干数位组成哈希地址

如:关键字如下:若哈希表长为100则可取中间两位10进制数作为哈希地址。   

81346532 81372242 81387422 81301367 81322817 81338967 81354157 81368537

平方取中法:关键字平方后取中间几位数组成哈希地址

折叠法:将关键数字分割成位数相同的几部分(最后一部分的位数可以不同)然后取几部分的叠加和(舍

去进位)作为哈希地址。

除留余数法:取关键字被某个不大于表长m的数p除后所得的余数为哈希地址。

           H(k)=k mod p  p<=m

随机数法:H(k)=rondom(k)。

2.处理冲突的方法

假设地址集为0..n-1,由关键字得到的哈希地址为j(0<=j<=n-1)的位置已存有记录,处理冲突就是为该关键

字的记录找到另一个"空"的哈希地址。在处理中可能得到一个地址序列Hi i=1,2,...k

0<=Hi<=n-1),即在处理冲突时若得到的另一个哈希地址H1仍发生冲突,再求下一地址H2,若仍冲突,再求

H3...。怎样得到Hi呢?

开放定址法:Hi=(H(k)+di) mod m  (H(k)为哈希函数;m为哈希表长;di为增量序列)

当di=1,2,3,... m-1 时叫线性探测再散列。

当di=12,-12,22,-22,32,-32,...,k2,-k2时叫二次探测再散列。

当di=random(m)时叫伪随机探测序列。

例:长度为11的哈希表关键字分别为17,60,29,哈希函数为H(k)=k mod 11,第四个记录的关键字为38

,分别按上述方法添入哈希表的地址为8,4,3(随机数=9)。

再哈希法:Hi=RHi(key) i=1,2,...,k,其中RHi均为不同的哈希函数。

链地址法:这种方法很象基数排序,相同的地址的关键字值均链入对应的链表中。

建立公益区法:另设一个溢出表,不管得到的哈希地址如何,一旦发生冲突,都填入溢出表。

3.哈希表的查找

例:如下一组关键字按哈希函数H(k)=k mod 13和线性探测处理冲突所得的哈希表a[0..15]:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  14 01 68 27 55 19 20 84 79 23 11 10      

当给定值k=84,则首先和a[6]比在依次和a[7],a[8]比结果a[8]=84查找成功。

当给定值k=38,则首先和a[12]比,再和a[13]比,由于a[13]没有,查找不成功,表中不存在关键字等于38的记

录。

5.5 查找第k小元素

查找第k小元素即在n个元素中(未排序)找到第k小的元素。方法同快速排序,采用递归方式。

程序如下:

program kspv;
const n=7;
type
arr=array[1..n] of integer;
var
b:arr;
i,k:integer;
function p(s,t:integer):integer;
var i,j,t1,x:integer;
begin
  i:=s;j:=t;x:=b[i];
  repeat
   while (b[j]>=x) and (j>i) do j:=j-1;
    if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end;
   while (b[i]<=x) and (i<j) do i:=i+1;
    if i<j then begin t1:=b[j];b[j]:=b[i];b[i]:=t1; end
  until i=j;
  b[i]:=x;
  p:=i;
end;
function find(s,t,k:integer):integer;
var p1,q:integer;
begin
if s=t then find:=b[s] else
  begin
   p1:=p(s,t);
   q:=p1-s+1;
   if k<=q then find:=find(s,p1,k) else find:=find(p1+1,t,k-q);
end;
end;
begin
write('input data:');
for i:=1 to n do read(b[i]);readln;
write('input k:');read(k);
write('output data:');
writeln('kthsmall:=',find(1,n,k));
end.

阅读全文