PHP 4 на практике


Уникальные идентификаторы


Вероятно, у вас уже возник вопрос: как сгенерировать UIN, который действительно был бы уникальным? Отложите в сторону учебники — замысловатые алгоритмы вам не понадобятся. В РНР предусмотрено простое средство для создания уникальных UIN — встроенная функция uniqid( ).

Функция uniqid( ) генерирует уникальный идентификатор.из 13 символов, значение которого основано на текущем времени. Синтаксис функции uniqid( ): int uniqid(string префикс [б boolean дополнение])

В параметре префикс передается строка, с которой должен начинаться UIN. Поскольку этот параметр является обязательным, при вызове необходимо передать хотя бы пустую строку. Если необязательный параметр дополнение равен TRUE, функция uniqid( ) генерирует UIN из 23 символов. Чтобы быстро создать уникальный идентификатор, достаточно при вызове uniqid( ) передать один параметр — пустую строку:

$uniq_id = uniqid(" ");

// Генерируется строка из 13 символов - например. '39b3209ce8ef2'

В другом варианте сгенерированное значение присоединяется к строке, определяемой параметром префикс:

$uniq_id = uniqid("php", FALSE):

// Генерируется строка из 16 символов - например. 'php39b3209ce8ef2'

Поскольку uniqid( ) генерирует UIN на основании текущего времени, существует ничтожная вероятность того, что идентификатор удастся подобрать. Чтобы значение идентификатора было действительно случайным, можно предварительно сгенерировать префикс при помощи еще одной стандартной функции РНР, rand( ). Эта возможность продемонстрирована в следующем примере:

srand((double) microtime( ) * 1000000);

$uniq_id = uniqid(rand( ));

Функция srand( ) инициализирует («раскручивает») генератор случайных чисел. Если вы хотите, чтобы функция rand( ) генерировала действительно случайные числа, необходимо предварительно вызвать srand( ). Передача rand( ) в качестве параметра uniqid( ) приводит к тому, что функция uniqid( ) вызывается с заранее сгенерированным случайным префиксом, что усложняет подбор сгенерированного UIN.

Владея методикой создания уникальных идентификаторов, мы теперь можем реализовать вполне реальную схему регистрации пользователей. При первой загрузке сценария в листинге 13.4 пользователю предлагается заполнить короткую




форму с именем и адресом электронной почты. Эта информация вместе со сгенерированным уникальным идентификатором сохраняется в таблице user_info, определение которой приведено перед листингом 13.3. Cookie с этим идентификатором сохраняется на компьютере пользователя. При всех последующих посещениях сценарий ищет в базе данных уникальный идентификатор, взятый из cookie, и выводит в браузере найденную информацию о пользователе.

Листинг 13.4.

Процесс регистрации пользователя

<?

// Построить форму

$form = "

<form action=\"Listingl3-4.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"y\"> \

Your first name?:<br>

<input type=\"text\" name=\"fname\" size=\"20\" maxlength=\"20\" value=\"\"><br>

Your email?:<br>

<input type=\"text\" name=\"email\" size=\"20\" maxlength=\"35\" value=\"\"><br>

<input type=\"submit\" value=\"Register!\">

</form>

// Если форма еще не отображалась

// и для данного пользователя еще не существует cookie...

1f ((! isset (Sseenform)) && (! isset ($userid))) :

print $form;

// Если форма отображалась.

// но данные пользователя еще не были обработаны...

elself (isset ($seenform) && (! isset ($sserid))) :

srand ((double) microtime( ) * 1000000);

$uniq_id = uniqid(rand( ));

// Подключиться к серверу MySQL и выбрать базу данных users

@mysql_pconnect("localhost", "root", "") or die("Could not connect to MySQL server!");

@mysql_select_db("book") or die("Could not select user database!");

// Объявить и выполнить запрос

$query = "INSERT INTO users13 VALUES('$uniq_id', '$fname', '$email')";

$result = mysql_query($query) or die("Could not insert user information!");

// Создать cookie "userid" со сроком действия один месяц, setcookie ("userid", $uniq_id, tirne( )+2592000);



print "Congratulations $fname! You are now registered! Your user information will be displayed uponon each subsequent visit to this page.";

// ... иначе, если cookie существует - использовать идентификатор

// пользователя для выборки данных из базы данных users elseif (isset($userid)) :

// Подключиться к серверу MySQL и выбрать базу данных users

@mysql_pconnect("localhost", "root", "") or die("Could not connect to MySQL server!");

@mysql_select_db("book") or die("Could not select user database!");

// Объявить и выполнить запрос

$query = "SELECT * FROM users,13 WHERE user_id = '$userid' ";

$result = mysql_query($query) or die("Could not extract user information!"

$row = mysql_fetch_array($result); print "Hi ".$row["fname"].",<br>";

print "Your email address is ".$row["email"];

endif;

?>

Обилие команд i f позволяет организовать весь процесс регистрации и последующую идентификацию пользователя в одном сценарии. Принципиально возможны три ситуации:



  • Пользователь не заполнял форму и не имеет cookie. В этом случае он должен заполнить форму.


  • Пользователь заполнил форму, но cookie еще не создано. В этом случае информация пользователя сохраняется в базе данных и создается cookie со сроком действия один месяц.


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


  • Конечно, общий процесс, продемонстрированный в листинге 13.4, может применяться при работе с любыми базами данных. Листинг всего лишь на очень простом уровне показывает, как на крупных сайтах организуется сохранение пользовательских данных, благодаря которому сайт «подстраивается» под каждого посетителя.

    На этом завершается наше знакомство с применением cookie в РНР. Если вы захотите побольше узнать о механизме cookie, обратитесь к ресурсам Интернета, перечисленным в следующем разделе.

    Ссылки по теме

    Дополнительную информацию о cookie и их использовании можно найти в специализированных web-pecypcax:



    • http://www.cookiecentral.com;


    • http://home.netscape.com/newsref/std/cookie_spec.html;


    • http://builder.com/Programming/Cookies/ss01.html;


    • http://www.w3.org/Protocols/rfc2109/rfc2100.


    • Как говорилось выше, в cookie очень удобно хранить параметры, специфические для данного пользователя, автоматически загружаемые при последующих посещениях сайта. Впрочем, на cookie нельзя полностью положиться, потому что пользователи могут запретить их использование на своем компьютере в настройках браузера. К счастью, в РНР для сохранения подобной информации существует и другой способ. Эта методика называется отслеживанием сеанса (session tracking) и рассматривается в следующем разделе.


      Содержание раздела