View file function.php

File size: 19.02Kb
<?php
/*
Набор функций для построения wap сайтов.
Полное или частичное распространение запрещено.
Автор: Denvas
*/
    //проверка данных регуляркой
    $filterinput=array(
        "MAIL"=>array("^[a-zA-Z0-9_.-]+\@[a-zA-Z0-9_.-]+\.[a-zA-Z]{2,5}$","[email protected]"),
        "LOGIN"=>array("^[a-zA-Z0-9_.\@-]{2,50}$","латинские буквы, цифры и символы \".@-\""),
        "PASSWORD"=>array("^[a-zA-Z0-9.,!#%*()]{3,20}$","от 3х английских букв"),
        "INT"=>array("^\-?[0-9]*$","только цифры"),
        "FLOAT"=>array("^\-?[0-9]*\.?[0-9]*$","целаячасть.дробная"),
        "IP"=>array("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$","XXX.XXX.XXX.XXX"),
        "WORD"=>array("^[0-9a-zA-Z_.-]*$","только английские буквы и цифры"),
        "URL"=>array("^(https?|HTTPS?|ftp|gopher):\/\/[a-zA-Z0-9_-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{1,7}".// Основное имя сервера
          "(\/[a-zA-Z0-9\_\.-]*\/?)*". // Имена возможных подкаталогов и файл
          "(\?[a-zA-Z0-9\_]+=[a-zA-Z0-9]+([&][a-zA-Z0-9_]+=[a-zA-Z0-9]+)*)?$"//get параметр
          ,"http://site.com/path/"),
        "TIME"=>array("^[0-9]{2}(:[0-9]{2})?(:[0-9]{2})?$","часы:минуты:секунды"),
        "DATE"=>array("^[0-9]{4}-[0-9]{2}-[0-9]{2}$","ГГГГ-ММ-ДД"),
        "DATETIME"=>array("^[0-9]{4}-[0-9]{2}-[0-9]{2}([ ]+[0-9]{2}:[0-9]{2}:[0-9]{2}){0,1}$","ГГГГ-ММ-ДД ЧЧ:ММ:СС"),
        "NUMPHONE"=>array("^\+?[0-9 ()-]{5,20}$","только цифры"),
        "SESSION"=>array("^[0-9a-zA-Z]*$","правильная сессия"),
        "FILE"=>array("^[0-9a-zA-Z_.-]*$","только английские буквы и цифры"),
    );
    if(!empty($chartoutf))include_once("utf8.php");
//==================================================//
    global $user_agent, $ip, $srobot, $wapver, $curpath, $queryneed;

    $user_agent=(isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:"");
    $ip=(isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:"");
    $curpath=rtrim(dirname($_SERVER["PHP_SELF"]),"/")."/";
    if(empty($wapver)){
        if(isset($_GET["wv"]))$wapver=(int)$_GET["wv"];
        elseif(strpos($user_agent,"Mozilla")===0)
            $wapver=3;
        elseif((isset($_SERVER["HTTP_ACCEPT"]))&&(strpos($_SERVER["HTTP_ACCEPT"],"xhtml+xml")!==false))
            $wapver=2;
        else
            $wapver=1;
    };
    
    AllParam();
//==================================================//
function formatinput($type){    
    global $filterinput;
    return $filterinput[$type][1];
};
//==================================================//
function checkinput($value,$type,$fempty=true){
    global $filterinput;
    if(!$value)return $fempty;
    return ereg($filterinput[$type][0],$value);
};
//==================================================//
/*
Вывод страницы
*/
    function ShowXML($code){
        global $template, $chartoutf, $codereplace, $compressdata;
        header($template["Content-type"]);
        $code=preg_replace("/\\\$([a-zA-Z0-9]*)\\\$/si","",$code);//удалить все незамененные шаблоны
        if(!empty($codereplace))$code=strtr($code,$codereplace);//заменить чтото на чтото
        if(!empty($chartoutf))$code=myUTF8_encode($code);
        if((!empty($compressdata))&&(isset($_SERVER["HTTP_ACCEPT_ENCODING"]))){
            if(strpos($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")!==false){
                $code = gzencode($code, 9);
                header("Content-encoding: gzip");
            }
            elseif(strpos($_SERVER["HTTP_ACCEPT_ENCODING"],"deflate")!==false){
                $code = gzdeflate($code, 9);
                header("Content-encoding: deflate");
            };
        };//if(isset($_SERVER["HTTP_ACCEPT_ENCODING"]))
        header("Content-Length: ".strlen($code));
        print $code;
    };
//==================================================//
/*
Пересылка на другую страницу с задержкой
*/
    function Relocation($url,$title="",$timeout=10){
        global $wapver,$curpath,$template,$chartoutf;
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); //Дата в прошлом
        header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
        header("Pragma: no-cache"); // HTTP/1.0
        header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
        if(strpos($url,"?")===0){
            $url=$_SERVER["PHP_SELF"].$url;
        };
        if((strpos($url,"/")!==0)&&(strpos($url,"http://")===false)){
            $url=rtrim($curpath,"/\\")."/".$url;            
        };
        if(strpos($url,"http://")===false){
            $url="http://".@$_SERVER['HTTP_HOST'].$url;
        };
        if(!$title)$timeout=-1;
        if($timeout<0)header("Location: ".strtr($url,array("&amp;"=>"&")));
        header($template["Content-type"]);
        if($wapver>1){$timeout=((int)($timeout/6));if($timeout<0)$timeout=1;};
        $code=strtr($template["location"],array("\$url\$"=>$url,"\$timeout\$"=>$timeout,"\$code\$"=>$title.((strpos($title,"<a")===false)?("<br/><a href=\"".$url."\">Дальше</a>"):"")));
        if(!empty($chartoutf))print myUTF8_encode($code); else print $code;
        exit;
    };
//==================================================//
function SaveLog($name="access",$str=""){
    global $path_log;
    $fd=fopen($path_log."/".$name.".log","ab");
    if($fd){
        fwrite($fd,date("Y-m-d H:i:s", time())."|".$str."|".$_SERVER["REQUEST_URI"]."|".(isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:"")."|".$_SERVER['REMOTE_ADDR']."|".(isset($_SERVER['HTTP_COOKIE'])?$_SERVER['HTTP_COOKIE']:"")."|".(isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:"")."\n");
        fclose($fd);
    };
};
//==================================================//
/*
Отображение переключения между страницами в таблицах
*/
    function ShowPage(){
        global $nrowpage,$rows,$page;
        $code="";
        $urlpage=QueryParam("p")."p=";
        if($rows>$nrowpage){
            $npage=(int)($rows/$nrowpage);if($npage*$nrowpage<$rows)$npage++;
            if($page>$npage)$page=$npage;
            $code.=$page." из ".$npage." ";
            if($npage>$page)$code.="<a href='".$urlpage.($page+1)."'>-&gt;</a>";
            if($npage>$page+1)$code.=" <a href='".$urlpage.$npage."'>-&gt;&gt;&gt;</a>";
            $code.="<br/>";
            if($page>1)$code.="<a href='".$urlpage.($page-1)."'>&lt;-</a><br/>";
            if($npage>5){
                $dataform=HiddenParam("p");
                $dataform[]=array("","p",($npage>$page)?($page+1):$page,"text");
                $code.=ShowForm($dataform,"Go","","get","");
            };
        };//if($rows>$nrowpage)
        return $code;
    }
//==================================================//
    function GetPage(){
        global $nrowpage, $rows, $page;
        if(empty($rows))return array(0,0);
        if(empty($_GET["p"]))$page=1; else $page=(int)$_GET["p"];
        $start=($page-1)*$nrowpage;
        if($start<0)$start=0;if($start>$rows-1)$start=$rows-1;
        $stop=$start+$nrowpage;if($stop>$rows)$stop=$rows;
        return array($start,$stop);
    };
//==================================================//
/*
Скрытые гет параметры
*/
function HiddenParam($paramname=array(),$querystr=""){
    $data=array();
    if(strlen($querystr)==0)$querystr=$_SERVER['QUERY_STRING'];
    if(!is_array($paramname))$paramname=array($paramname);
    $querystr=str_replace("&amp;","&",$querystr);
    $arr=explode("&",$querystr);$countarr=count($arr);
    
    for($i=0;$i<$countarr;$i++){
        if(empty($arr[$i]))continue;
        $flag=false;
        for($j=0;$j<count($paramname);$j++)
        if(strpos($arr[$i],$paramname[$j]."=")===0){$flag=true;break;}
        if($flag)continue;
        $appr=explode("=",$arr[$i]);
        $data[]=array("",$appr[0],$appr[1],"hidden");
    };//for
    return $data;
};//function QueryParam($paramname,$querystr)
//==================================================//
/*
Возвращает путь + qet запрос
*/
function QueryParam($paramname,$invert=false,$newfile="",$querystr=""){
    global $query_rnd,$queryneed;
    if(strlen($querystr)==0)$querystr=@$_SERVER['QUERY_STRING'];
    if(!is_array($paramname))$paramname=array($paramname);
    $paramname[]="rnd";
    if($invert){
        for($i=0;$i<count($queryneed);$i++)$paramname[]=$queryneed[$i];
    };

    $str="?";
    $querystr=str_replace("&amp;","&",$querystr);
    $arr=explode("&",$querystr);$countarr=count($arr);
    
    for($i=0;$i<$countarr;$i++){
        if(empty($arr[$i]))continue;
        $flag=$invert;
        for($j=0;$j<count($paramname);$j++){
            if(strpos($arr[$i],$paramname[$j]."=")===0){$flag=!$invert;break;}
        };
        if($flag)continue;
        $str.=$arr[$i]."&amp;";
    };//for
    if(!empty($query_rnd))$str.="rnd=".mt_rand(0,10000)."&amp;";
    return ($newfile?$newfile:$_SERVER["PHP_SELF"]).$str;
};//function QueryParam($paramname,$querystr)
//==================================================//
function IName($name,$rnd=0){
    if(empty($rnd))$rnd=mt_rand(1,100000);
    return $name."__".$rnd;
};
//==================================================//
/*
Показ формы
*/
    function ShowForm($data,$ftitle,$action="",$method="post",$br="<br/>"){
        global $wapver;
        $extform=array();
        $rnd=mt_rand(1,100000);
        $code="";$codeform="";
        if(empty($action))$action=str_replace("&","&amp;",$_SERVER["REQUEST_URI"]);
        if(strcmp($method,"get")==0){
            $action=explode("?",$action);
            $action=$action[0];
        };
        //версия 1
        if($wapver==1){
            if(strcmp($method,"post")==0)$codeform.="<postfield name='send' value='".$rnd."'/>";
            for($j=0;$j<count($data);$j++){
                list($title,$name,$value,$type)=$data[$j];
                $namei=IName($name,$rnd);
                if(strcmp($type,"file")!=0)$code.=($title)?($title."<br/>"):"";
                if(strcmp($type,"textarea")==0)$type="text";
                if((strcmp($type,"text")==0)||(strcmp($type,"password")==0)){
                    $code.="<input name='".$namei."' type='".$type."' value='".$value."' emptyok='true'/>".$br;
                    $codeform.="<postfield name='".$name."' value='\$".$namei."'/>";
                }
                elseif(strcmp($type,"select")==0){
                    $option=$data[$j][4];reset($option);
                    $code.="<select name='".$namei."' value='".$value."'>";
                    while(list($key,$val)=each($option))$code.="<option value='".$key."'>".$val."</option>";
                    $code.="</select>".$br;
                    $codeform.="<postfield name='".$name."' value='\$".$namei."'/>";
                }
                elseif(strcmp($type,"hidden")==0){
                    $codeform.="<postfield name='".$name."' value='".$value."'/>";
                }
                elseif(strcmp($type,"show")==0){
                    if(strlen($value)>0)$code.=$value.$br;
                };
            };//for($j=0;$j<count($data);$j++)
            return $code."<anchor title='".$ftitle."'>".$ftitle."<go href='".$action."' method='".$method."'>".$codeform."</go></anchor><br/>";
        };
        //для версии 2 и для компа
        if(strcmp($method,"post")==0)$codeform.="<input type='hidden' name='send' value='".$rnd."'/>";
        for($j=0;$j<count($data);$j++){
            list($title,$name,$value,$type)=$data[$j];
            $namei=$name;
            $code.=($title)?($title."<br/>"):"";
            if((strcmp($type,"text")==0)||(strcmp($type,"password")==0)){
                $code.="<input name='".$namei."' type='".$type."' value='".$value."'/>".$br;
            }
            elseif(strcmp($type,"textarea")==0){
                $code.="<textarea cols='35' rows='5' name='".$namei."'>".$value."</textarea>".$br;
            }
            elseif(strcmp($type,"select")==0){
                $option=$data[$j][4];reset($option);
                $code.="<select name='".$namei."'>";
                while(list($key,$val)=each($option))$code.="<option value='".$key."'".((strcmp($key,$value)==0)?" selected='1'":"").">".$val."</option>";
                $code.="</select>".$br;
            }
            elseif(strcmp($type,"hidden")==0){
                $codeform.="<input type='hidden' name='".$name."' value='".$value."'/>";
            }
            elseif(strcmp($type,"show")==0){
                if(strlen($value)>0)$code.=$value.$br;
            }
            elseif(strcmp($type,"file")==0){
                $code.="<input name='".$name."' type='file' value=''/>".$br;
                $extform["enctype"]="multipart/form-data";
            };

        };//for($j=0;$j<count($data);$j++)
        $str="";while(list($key,$val)=each($extform))$str.=" ".$key."='".$val."'";
        return "<form action='".$action."' method='".$method."' ".$str.">".$code.$codeform."<input type='submit' value='".$ftitle."'/></form>";
    };
//==================================================//
/*
Функция преобразовывает в кодировку UTF-8 (если стоит параметр),
заменяет опасные символы, удаляет с начала и с конца пробелы
*/
function AllParam(){
    global $nottrans,$charmapt,$chartoutf;
    if(!empty($chartoutf))$charmaputf8=charmapUTF8(-1); else $charmaputf8=array();
    //защита данных
    $charmaputf8["&"]="&amp;";
    $charmaputf8["\""]="&quot;";
    $charmaputf8["'"]="&#039;";
    $charmaputf8["<"]="&lt;";
    $charmaputf8[">"]="&gt;";
    $charmaputf8["$"]="USD";
    $charmaputf8["\r"]="";
    $charmaputf8["\n"]="<br/>";
    $charmaputf8["|"]="&#x07C;";

    reset($_GET);while(list($key,$val)=each($_GET)){
        if(!isset($nottrans[$key]))
            $_GET[$key]=strtr(trim($val),$charmaputf8);
    };

    //работа с транслитом
    if((!empty($_POST["tr"]))||(!empty($_GET["tr"]))){
        include_once("latinic.php");
        while(list($key,$val)=each($charmapt))$charmaputf8[$key]=$val;
        $tr=1;
    }//if
    else
        $tr=0;

    reset($_POST);while(list($key,$val)=each($_POST)){
        if(!isset($nottrans[$key]))
            $_POST[$key]=strtr(trim($val),$charmaputf8);
    };
    return $tr;
};
//==================================================//
/*
Принимает: $content - строка в которой искать,
           $left - ограничитель слева,
           $right - ограничитель справа
           $edit - перемещать ли $content на конец найденых данных
Действие: Находит первое включение $left и $right вырезая все что между ними
Возвращает: возвращает вырезанную часть
*/
function getsubstr(&$content,$left,$right,$edit=false,$def=""){
    if($left)
        $startpos=strpos($content,$left);
    else
        $startpos=0;
    if(!($startpos===false)){
        $startpos+=strlen($left);
        if($right)
            $stoppos=strpos($content,$right,$startpos);
        else
            $stoppos=strlen($content);
        if($stoppos>0){
            $str=substr($content,$startpos,$stoppos-$startpos);
            if($edit)$content=substr($content,$stoppos);
            return $str;
        };
    };
    if($edit)$content="";
    return $def;
};
//==================================================//
/*
Подстановка в урл контента
*/
function replaceurl(&$content,$repl=array()){
    $repl["\r"]="";$repl["\n"]=" ";;
    $content=strtr($content,$repl);
    $newcontent=$content;$repl=array();
    while($str=getsubstr($newcontent,'href="','"',true)){
        if(strpos($str,"http://")===0)continue;//не преобразовывать абсолютные пути
        $elem=explode("?",$str);
        if(!isset($elem[1]))$elem[1]="";
        $url=QueryParam("",1,$elem[0]).$elem[1];
        $repl["href=\"".$str."\""]="href=\"".$url."\"";
    };//while
    return strtr($content,$repl);
};
//==================================================//
function NotFound($code=""){
    global $template, $chartoutf;
    header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
    $code=strtr($template["main"],array("\$title\$"=>"404 Not Found","\$code\$"=>"404 Not Found ".$_SERVER["REQUEST_URI"]."<br/>".$code));
    ShowXML($code);
    exit;
};
//==================================================//
/*
Преобразование урлов в полные ссылки
Если $type==0 то генерирует html, иначе bbcode
*/
function UrlInText($content,$type=0){
    $str=strtr($content,"<>,'\"","     ")." ";$repl=array();
    while($url=getsubstr($str,"http://"," ",1)){
        $url=rtrim($url,"<>.,(:)ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ\r\n");//удалить из конца ссылки возможные глюки
        if($type==0){
            $repl["http://".$url]="<a href='http://".$url."'>http://".$url."</a>";
        }
        else{
            $repl["http://".$url]="[url]http://".$url."[/url]";
        };
    };
    return strtr($content,$repl);
};
//===========================================
function ResizeImage($filein,$fileout,$maxwidth=0,$maxheight=0,$type=0){
    global $resize_type;
    if(($maxwidth==0)&&($maxheight==0))return 1;
    if(!file_exists($filein))return 2;
    $size=getimagesize($filein);
    if(!$size)return 3;
    $s_width=$size[0];
    $s_height=$size[1];
    if(strpos($filein,".jpg")!==false)    
        $im_in = imagecreatefromjpeg($filein);
    elseif(strpos($filein,".gif")!==false)    
        $im_in = imagecreatefromgif($filein);
    elseif(strpos($filein,".png")!==false)    
        $im_in = imagecreatefrompng($filein);
    else return 4;

    if($maxwidth!=0)$dx=$s_width/$maxwidth; else $dx=0;
    if($maxheight!=0)$dy=$s_height/$maxheight; else $dy=0;
    if($dx>$dy)$dd=$dx; else $dd=$dy;
    if($type==0){//вписан в квадрат таких размеров
        $d_width=$s_width/$dd;
        $d_height=$s_height/$dd;
    } else
    if($type==1){//задать такие размеры
        if($maxwidth!=0)$d_width=$maxwidth; else $d_width=$s_width/$dd;
        if($maxheight!=0)$d_height=$maxheight; else $d_height=$s_height/$dd;  
    };
    $im_out = imagecreate($d_width, $d_height);
    ImageCopyResized($im_out, $im_in, 0, 0, 0, 0,$d_width, $d_height, $s_width, $s_height);
    //вывести картинку в файл
    if(strcmp($resize_type,"png")==0)
        imagepng($im_out,$fileout);    
    elseif(strcmp($resize_type,"gif")==0)
        imagegif($im_out,$fileout);    
    elseif(strcmp($resize_type,"jpeg")==0)
        imagejpeg($im_out,$fileout);    
    return 0;
};
//==================================================//
/*
Вывод ошибки и завершение программы
*/
function Error($error){
    global $template;
    ShowXML(strtr($template["main"],array("\$code\$"=>$template["fatalerror"],"\$urlrefresh\$"=>QueryParam(array()))));
    SaveLog("error",$error);
    exit;
};//function Error
    //==================================================//
    /*
    Отправить письмо
    */
    function SendMail($to,$subject,$message,$from=""){
        global $mail_text,$admin_email,$smtp_serv,$smtp_user,$smtp_pass;
        include_once("class_sendmail.php");
        $mails=new SendMailClass();
        $mails->SetCharset("Windows-1251");
        $mails->Mail(($from)?array($admin_email,$from):$admin_email,$to,$subject,trim($message)."\n".$mail_text);
        $mails->SMTPConf($smtp_serv,$smtp_user,$smtp_pass);
        $mails->Send();
    };
?>