Отправляет email-рассылки с помощью сервиса Sendsay

Основы программирования в PHP

  Все выпуски  

Основы программирования в PHP #2


Информационный Канал Subscribe.Ru


Доброго времени суток!
Http://scriptsoft.ru
Часто пополняющаяся коллекция программ
Скрипты Web-мастеру
Статьи для вэб-мастеров, дизайнеров а также и на другие темы
Форум, задавайте ваши вопросы и вам обязательно помогут
Добавьте вашу программу в наш каталог, чтобы люди узнали о ее существовании

Приветствуем вас
Темы номера:
  1. Пишем скрипт поиска по текстовому файлу
  2. Создаем статистику посещений сайта
  3. Стандартный класс по закачке файла на сервер с zipованием


1. Поиск по текстовому файлу
Всем известно, что далеко не все бесплатные хостинги предоставляют право на использование базы данных (MySQl), поэтому в таком случае люди хранят данные в текстовом файле, когда данных накапливается слишком много и нужно что-либо найти то это окажется вам слишком затруднительным, и в данной теме разговор пойдет именно о поиске.
Создаем файл, ну например для новостей с таким содержимым:
ID|Theme of news|autor|date|text
Ну о том как считывать файл при помощи РНР я говорить не буду (с вопросом можете обратиться в наш форум), поэтому сразу перейду к коду для поиска. Форма, вставьте ее в то место, где нужно показать форму поиска:

<form menthod='post' action='search.php'>
<
input type=text name=var> <
input type=submit name=do value=Ok>
</
form>
В файле search.php поместите:
<?
$a = file("путь к текстовой БД");

for (
$var=0; $var<count($a); ++$var){
       if (
preg_match("$var",$a[$var]))
      echo
"$a[$var]";
}

?>

Результаты будут выведены на экран.
Вы можете переделать вывод результатов, например помещать все данные в таблицу, но это уже каждому по своему вкусу

2. Статистика посещений сайта
Статистика посещения сайта - это очень важный и ответственный шаг, ведь с помощью его авторы сатов узнают откуда/когда/ во сколько/из какого города/его IP пришел посетитель и исчерпывающую информацию о нем.
С помощью следующего кода можно узнать слудующее:
Дату прихода, просматриваемую страницу, браузер, от куда пришел и имя
<?php
$agent
= $_SERVER['HTTP_USER_AGENT'];
$uri = $_SERVER['REQUEST_URI'];
$user = $_SERVER['PHP_AUTH_USER'];
$ip = $_SERVER['REMOTE_ADDR'];
$ref = $_SERVER['HTTP_REFERER'];
$dtime = date('r');

if(
$ref == ""){
$ref = "None";
}
if(
$user == ""){
$user = "None";
}

$entry_line = "$dtime - IP: $ip | Agent: $agent | URL: $uri | Referrer: $ref | Username: $user n";
$fp = fopen("logs.txt", "a");
fputs($fp, $entry_line);
fclose($fp);
?>

Теперь у вас есть статистика посещений сайта, типичная информация, с помощью которой можно узнать популярность той или иной страницы.

3. Класс для закачки файла на сервер с zipованием
Приведен стандартный класс, с помощью которого можно в легкую закачивать файл на сервер в архиве.
<?php

/*

Zip file creation class
makes zip files on the fly...

use the functions add_dir() and add_file() to build the zip file;
see example code below

by Eric Mueller
<a class='datelink' href="http://www.themepark.com" target=_blank>http://www.themepark.com</a>

v1.1 9-20-01
  - added comments to example

v1.0 2-5-01

initial version with:
  - class appearance
  - add_file() and file() methods
  - gzcompress() output hacking
by Denis O.Philippov, <a class='datelink' href="mailto:webmaster@atlant.ru">webmaster@atlant.ru</a>, <a class='datelink' href="http://www.atlant.ru" target=_blank>http://www.atlant.ru</a>

*/   

// official ZIP file format: <a class='datelink' href="http://www.pkware.com/appnote.txt" target=_blank>http://www.pkware.com/appnote.txt</a>

class zipfile    
{    

    var
$datasec = array(); // array to store compressed data
    
var $ctrl_dir = array(); // central directory     
    
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
    
var $old_offset = 0;   

    function
add_dir($name)     

    
// adds "directory" to archive - do this before putting any files in directory!
    // $name - name of directory... like this: "path/"
    // ...then you can add files using add_file with names like "path/file.txt"
    
{    
        
$name = str_replace("\\", "/", $name);    

        
$fr = "\x50\x4b\x03\x04";   
        
$fr .= "\x0a\x00";    // ver needed to extract
        
$fr .= "\x00\x00";    // gen purpose bit flag
        
$fr .= "\x00\x00";    // compression method
        
$fr .= "\x00\x00\x00\x00"; // last mod time and date

        
$fr .= pack("V",0); // crc32
        
$fr .= pack("V",0); //compressed filesize
        
$fr .= pack("V",0); //uncompressed filesize
        
$fr .= pack("v", strlen($name) ); //length of pathname
        
$fr .= pack("v", 0 ); //extra field length
        
$fr .= $name;    
        
// end of "local file header" segment

        // no "file data" segment for path

        // "data descriptor" segment (optional but necessary if archive is not served as file)
        
$fr .= pack("V",$crc); //crc32
        
$fr .= pack("V",$c_len); //compressed filesize
        
$fr .= pack("V",$unc_len); //uncompressed filesize

        // add this entry to array
        
$this -> datasec[] = $fr;   

        
$new_offset = strlen(implode("", $this->datasec));   

        
// ext. file attributes mirrors MS-DOS directory attr byte, detailed
        // at <a class='datelink' href="http://support.microsoft.com/support/kb/articles/Q125/0/19.asp" target=_blank>http://support.microsoft.com/support/kb/articles/Q125/0/19.asp</a>

        // now add to central record
        
$cdrec = "\x50\x4b\x01\x02";   
        
$cdrec .="\x00\x00";    // version made by
        
$cdrec .="\x0a\x00";    // version needed to extract
        
$cdrec .="\x00\x00";    // gen purpose bit flag
        
$cdrec .="\x00\x00";    // compression method
        
$cdrec .="\x00\x00\x00\x00"; // last mod time & date
        
$cdrec .= pack("V",0); // crc32
        
$cdrec .= pack("V",0); //compressed filesize
        
$cdrec .= pack("V",0); //uncompressed filesize
        
$cdrec .= pack("v", strlen($name) ); //length of filename
        
$cdrec .= pack("v", 0 ); //extra field length     
        
$cdrec .= pack("v", 0 ); //file comment length
        
$cdrec .= pack("v", 0 ); //disk number start
        
$cdrec .= pack("v", 0 ); //internal file attributes
        
$ext = "\x00\x00\x10\x00";   
        
$ext = "\xff\xff\xff\xff";    
        
$cdrec .= pack("V", 16 ); //external file attributes  - 'directory' bit set

        
$cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
        
$this -> old_offset = $new_offset;   

        
$cdrec .= $name;    
        
// optional extra field, file comment goes here
        // save to array
        
$this -> ctrl_dir[] = $cdrec;    

           
    }   


    function
add_file($data, $name)     

    
// adds "file" to archive     
    // $data - file contents
    // $name - name of file in archive. Add path if your want

    
{    
        
$name = str_replace("\\", "/", $name);    
        
//$name = str_replace("\\", "\\\\", $name);

        
$fr = "\x50\x4b\x03\x04";   
        
$fr .= "\x14\x00";    // ver needed to extract
        
$fr .= "\x00\x00";    // gen purpose bit flag
        
$fr .= "\x08\x00";    // compression method
        
$fr .= "\x00\x00\x00\x00"; // last mod time and date

        
$unc_len = strlen($data);    
        
$crc = crc32($data);    
        
$zdata = gzcompress($data);    
        
$zdata = substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
        
$c_len = strlen($zdata);    
        
$fr .= pack("V",$crc); // crc32
        
$fr .= pack("V",$c_len); //compressed filesize
        
$fr .= pack("V",$unc_len); //uncompressed filesize
        
$fr .= pack("v", strlen($name) ); //length of filename
        
$fr .= pack("v", 0 ); //extra field length
        
$fr .= $name;    
        
// end of "local file header" segment
           
        // "file data" segment
        
$fr .= $zdata;    

        
// "data descriptor" segment (optional but necessary if archive is not served as file)
        
$fr .= pack("V",$crc); //crc32
        
$fr .= pack("V",$c_len); //compressed filesize
        
$fr .= pack("V",$unc_len); //uncompressed filesize

        // add this entry to array
        
$this -> datasec[] = $fr;   

        
$new_offset = strlen(implode("", $this->datasec));   

        
// now add to central directory record
        
$cdrec = "\x50\x4b\x01\x02";   
        
$cdrec .="\x00\x00";    // version made by
        
$cdrec .="\x14\x00";    // version needed to extract
        
$cdrec .="\x00\x00";    // gen purpose bit flag
        
$cdrec .="\x08\x00";    // compression method
        
$cdrec .="\x00\x00\x00\x00"; // last mod time & date
        
$cdrec .= pack("V",$crc); // crc32
        
$cdrec .= pack("V",$c_len); //compressed filesize
        
$cdrec .= pack("V",$unc_len); //uncompressed filesize
        
$cdrec .= pack("v", strlen($name) ); //length of filename
        
$cdrec .= pack("v", 0 ); //extra field length     
        
$cdrec .= pack("v", 0 ); //file comment length
        
$cdrec .= pack("v", 0 ); //disk number start
        
$cdrec .= pack("v", 0 ); //internal file attributes
        
$cdrec .= pack("V", 32 ); //external file attributes - 'archive' bit set

        
$cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
//        echo "old offset is ".$this->old_offset.", new offset is $new_offset
";
        $this -> old_offset = $new_offset;   

        $cdrec .= $name;    
        // optional extra field, file comment goes here
        // save to central directory
        $this -> ctrl_dir
[] = $cdrec;    
    
}   

    function file()
{ // dump out file     
        $data = implode("", $this -> datasec);    
        $ctrldir = implode("", $this -> ctrl_dir);    

        return     
            $data.    
            $ctrldir.    
            $this -> eof_ctrl_dir.    
            pack("
v", sizeof($this -> ctrl_dir)).     // total # of entries "on this disk"
            pack("
v", sizeof($this -> ctrl_dir)).     // total # of entries overall
            pack("
V", strlen($ctrldir)).             // size of central dir
            pack("
V", strlen($data)).                 // offset to start of central dir
            "
x00x00";                             // .zip file comment length
    
}   
}    

?>


/* example */

<?php    

$zipfile
= new zipfile();    

// add the subdirectory ... important!
$zipfile -> add_dir("dir/");   

// add the binary data stored in the string 'filedata'
$filedata = "(read your file into $filedata)";    
$zipfile -> add_file($filedata, "dir/file.txt");    

// the next three lines force an immediate download of the zip file:
header("Content-type: application/octet-stream");    
header("Content-disposition: attachment; filename=test.zip");    
echo
$zipfile -> file();    


// OR instead of doing that, you can write out the file to the loca disk like this:
$filename = "output.zip";
$fd = fopen ($filename, "wb");
$out = fwrite ($fd, $zipfile -> file());
fclose ($fd);

// then offer it to the user to download:
<a href="output.zip">Click here to download the new zip file.</a>

?>

Весь материал, использованный в рассылке принадлежит http://scriptsoft.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное