Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Бинарные числа на PHP

Сообщения:  [1-10]    [11-20]  [21-24] 

 
 автор: Eugene77   (30.05.2007 в 21:47)   письмо автору
 
   для: Trianon   (29.05.2007 в 22:29)
 

----

   
 
 автор: Eugene77   (30.05.2007 в 21:40)   письмо автору
 
   для: Trianon   (29.05.2007 в 22:29)
 

Если соединить всё это вместе, то у меня получается вот такой код на три файла.
Я его привожу весь, потому что, как мне кажется, выходит довольно полезная утилита, позволяющая любому посетителю в любой момент времени узнать какие странички он ещё не видел. Я бы не отказался от такой возможности даже на этом сайте «софттайма», не говоря уже о некоторых других, в которых явно не хватает этой утилиты.
Конечно сейчас в тексте программы море ошибок, но иначе и не может быть – это ведь моя первая программа на PHP, которую я собираюсь реально использовать.
Заранее благодарю всех, кто укажет на ошибки и подскажет возможные усовершенствования. Особое спасибо Трианону! Без него я не сумел бы даже подступиться к этой задаче!
Файл вывода на экран списка посещённых страниц пока не рассматривается.
Извините за комментарии на английском языке. Мой Dreamweaver с русским вытворяет что попало. Может мне на другой редактор пересесть?

В начале создаются две таблицы каждая из двух колонок. Одна содержит названия файлов, вторая id посетителей и специальное поле типа blob, в котором каждый бит отвечает за посещение страницы с соответствующим номером. Id посетителей хранятся в cookies.


<?php
//  This file create tables to count visits of eatch visitor of eatch page
$qwiery[] = "CREATE TABLE visitors(
id int(6) NOT NULL auto_increment,
pages blob NOT NULL default '"
.  '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0' ."',
PRIMARY KEY (id)
)TYPE = MyISAM"
;

$qwiery[] = "CREATE TABLE pages(
id int(6) NOT NULL auto_increment,
page tinytext NOT NULL default '',
PRIMARY KEY (id)
)TYPE = MyISAM"
;


require_once(
"connect_db.inc");
$create_table true;
foreach(
$qwiery as $value){
    if(!
mysql_query($value)) $create_table false;
}
if (
$create_table) echo "??????? ??????? ???????";
    else echo 
"?????? ??? ???????? ??????";
?>


Эта та часть кода, которая включается на каждую учитываемую страницу. Он извлекает из cookies id посетителя, из серверной переменной берёт имя файла, запрошенного клиентом, и устанавливает в bit отвечающий за номер этой страницы единицу в строке с id посетителя. По крайней мере, должна это делать.


<?php
// This part of code must be included in every file
require_once("connect_db.inc");
$query="SELECT count(*) FROM visitors";  // Count number of visitors
$vstrs mysql_query($query);
$v mysql_fetch_array($vstrsMYSQL_NUM);
if(!isset(
$COOKIE['id'] || $COOKIE['id']>$v) {  // Id of visitor supposed to be in cookies
        
$id $v+1;
        
setcookie("id"$idtime()+60*24*60*60); // Set cookie on two monthes period
        
header("Location: cookies_on.php?id=$id");  // Check if cookie really set 
}
        else 
$id $COOKIE['id'];
        
if(isset(
$PHP_SELF$name_page=$PHP_SELF// Take name of current page
    
else $name_page='no_page';
$query="SELECT id FROM pages WHERE $page = $name_page";  // Find out id number of page
$id_page mysql_query($query);
if(!
$id_page || mysql_num_rows($id_page)<1)) { // If page not registered in the table, we are to add record into the table pages
    
$query="INSERT INTO pages page=$name_page";      // Insert new line into table pages
    
if(!mysql_query($query)) echo "New page $name_page not inserted";
    
$query="SELECT id FROM pages WHERE page = $name_page";  // Find out id number of page
    
if(!($id_page mysql_query($query))) echo "New line is not created";
}

$pg mysql_fetch_array($id_pageMYSQL_NUM);
$query="SELECT pages FROM visitors WHERE id = $id";  // Extract list of visited pages
$p mysql_query($query);   //  
$pages mysql_result($p1);
$p=set_element($pages$pg);    // Add current page to list of visited pages
$query="UPDATE visitors pages=$pages WHERE id = $id";
mysql_query($query);   //  


function set_element($str$elem){
for(
$i=$elem-strlen($str); $i<0$i++) $str ='/0'.$str;  // In case if number of pages exeed initialy reserved place in colomn pages, we make the col. wider
$idx $elem >>3$mask 1<<($elem%7);
return 
substr($str,0,$idx).chr(ord($str[$idx]) | $mask).substr($str,$idx+1);
}

function 
check_element($str$elem){
$idx $elem >>3$mask 1<<($elem%7);
return (
ord($str[$idx]) & $mask) != 0;
}
?>


Этот маленький файл проверяет, действительно ли cookie установлен.


<?php
// file:  cookies_on.php
if(!isset($_GET['id']) die("Name of cookie not set");
if(!isset(
$_COOKIE['id']) die("Please, let us to set cookie!");
if(
$_GET['id'] != $_COOKIE['id']) die("Wrong cookie value");
header("Location: $_SERVER['HTTP_REFERER']");
?>

   
 
 автор: Trianon   (30.05.2007 в 17:41)   письмо автору
 
   для: Eugene77   (30.05.2007 в 10:58)
 

если правильно применять шифрующий движок, то есть использовать не simple permutations а хотя бы в cipher feedback режиме, до длина строки не меняется.

   
 
 автор: Eugene77   (30.05.2007 в 10:58)   письмо автору
 
   для: Trianon   (29.05.2007 в 22:29)
 

Спасибо!
А есть симметричное шифрование, которое длину строки не меняет?

   
 
 автор: Trianon   (29.05.2007 в 22:34)   письмо автору
 
   для: Unkind   (29.05.2007 в 22:31)
 

Угу. Поправил :)

   
 
 автор: Unkind   (29.05.2007 в 22:31)   письмо автору
 
   для: Trianon   (29.05.2007 в 22:29)
 

TYPE = MyISAM

   
 
 автор: Trianon   (29.05.2007 в 22:29)   письмо автору
 
   для: Eugene77   (29.05.2007 в 21:51)
 

запишите там сразу нужное количество нулевых байт:
<?
$query
[] = "CREATE TABLE visitors( 
id int(6) NOT NULL auto_increment, 
pages blob NOT NULL default '"
.  '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0' ."', 
PRIMARY KEY (id) 
)"




Циклические сдвиги можно вычислить, как комбинацию логических, соединенных по побитовому ИЛИ.

А шифрование лучше самому не писать, а применять уже готовое. Уж больно скользкая область. Тем более что симметричных шифров в php реализовано вагон, а для асимметричных никакие циклические сдвиги не нужны.

   
 
 автор: Eugene77   (29.05.2007 в 21:51)   письмо автору
 
   для: Trianon   (29.05.2007 в 20:05)
 

второй параметр функции substr - не конечный индекс, который может включаться или исключаться, а длина вырезаемой подстроки - то есть сущность абсолютно детерминированная. Попробуйте сказать в свете этого.

При таком хорошем освещении, сразу заметно, что единицу я зря отнимаю.
Так у меня при каждом обращении один байт будет теряться. Исправлю. Спасибо!
Остальное тоже полезно.

Теперь вот не знаю как поле blob инициализировать.
Вот отрывок из файла:


<?
$qwiery
[] = "CREATE TABLE visitors(
id int(6) NOT NULL auto_increment,
pages blob NOT NULL default '??????????',
PRIMARY KEY (id)
)TIPE = MyISAM"
;

$create_table true;
foreach(
$qwiery as $value){
    if(!
mysql_query($value)) $create_table false;
}
?>


Кстати, жаль, что циклические сдвиги недоступны, я бы на них щифрование сделал - проще не придумаешь!

   
 
 автор: Trianon   (29.05.2007 в 20:05)   письмо автору
 
   для: Eugene77   (29.05.2007 в 19:42)
 

>Ничего умного тут сказать не могу. У меня вообще понятия о PHP пока довольно туманные.
>Я не знаю включительно функция возвращает подстроку или исключительно.

второй параметр функции substr - не конечный индекс, который может включаться или исключаться, а длина вырезаемой подстроки - то есть сущность абсолютно детерминированная. Попробуйте сказать в свете этого.

>Да и оператор >> меня в шок поверг - его в справочнике нет.

В мануале есть.

>Потом сдвиги вообще-то разные бывают, циклические, например

Циклические сдвиги не реализованы встроенными в язык операциями ни на одном из диалектов C, насколько мне известно, и в других языках тоже. Хотя со сдвигами и без того неоднозначностей хватает.

>Как я могу быть уверен, что это тот, что надо?

Вот этот раздел руководства прояснит Вам картину:
http://ru2.php.net/manual/ru/language.operators.bitwise.php

>Потом, строковые функции будут ли работать с несимвольными величинами?
>Скажите да!

С байтовыми цепочками произвольного вида? Безусловно.

   
 
 автор: Eugene77   (29.05.2007 в 19:42)   письмо автору
 
   для: Trianon   (28.05.2007 в 23:45)
 

Только почему $idx-1 ?
Ничего умного тут сказать не могу. У меня вообще понятия о PHP пока довольно туманные.
Я не знаю включительно функция возвращает подстроку или исключительно.
Да и оператор >> меня в шок поверг - его в справочнике нет. Что, на самом деле он есть? Может у меня справочник устаревший? Потом сдвиги вообще-то разные бывают, циклические, например. Как я могу быть уверен, что это тот, что надо? В смысле, я доверяю, конечно, но твёрдой почвы под ногами пока почувствовать не могу. То есть сама ситуация подразумевает отсутствие этой почвы у меня.
Потом, строковые функции будут ли работать с несимвольными величинами?
Скажите да!
А то у меня слишком много сомнений для такого маленького отрывка кода, который сам по-себе ещё и не испытаешь. Придётся довольно большой фрагмент сразу сочинять. А я пока легко спотыкаюсь на самом элементарном.

   

Сообщения:  [1-10]    [11-20]  [21-24] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования