Money-Cool Форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Money-Cool Форум » Веб-программирование » Программирование на PHP


Программирование на PHP

Сообщений 1 страница 5 из 5

1

Голосование на php

Начнём с того зачем нам голосование ?
Как вы видели на сайте wwwimania.zp.ua его используют чтоб узнать мнение пользователей . Голосование это один из лучших методов привлечение посетителей на сайт.

Начнём.
Для написания скрипта вам понадобится драйвер DLL_прямые_пальцы.

Вот что нам нужно будет вставить в HTML код, чтоб получить формочку.

Код:
<FORM METHOD="POST" action="vote.php">
<TABLE BORDER=1><TR><TD><TABLE BORDER=0>
<TR><TD>Вопрос голосования</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=0>Ответ №1</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=1> Ответ №2</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=2> Ответ №3</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=3> Ответ №4</TD></TR>
<INPUT TYPE="hidden" NAME=von VALUE="1"
<INPUT TYPE="hidden" NAME=a1 VALUE="Ответ №1"
<INPUT TYPE="hidden" NAME=a2 VALUE="Ответ №2"
<INPUT TYPE="hidden" NAME=a3 VALUE="Ответ №3"
<INPUT TYPE="hidden" NAME=a4 VALUE="Ответ №4"
<TR><TD>
<INPUT TYPE=Submit NAME=vote VALUE=" Отправить ">
</TD></TR>
<TR><TD>
<INPUT TYPE=Submit NAME=result VALUE=" смотреть результат ">
</TD></TR></TABLE></TD></TR></TABLE></FORM>

Надеюсь, все поняли смысл этого кода …
Я хочу объяснить только эту строку “<INPUT TYPE="hidden" NAME=von VALUE="1">”
Эта строка передаёт скрипту № голосования. Т.е. вы сразу можете проводить большое количество голосований.

Далее нам нужно будет в чём-то хранить статистику.
Для этого нам понадобится обычный файл.
Имя файла будет зависеть от № голосования.
Пример vote1.txt – для первого и т.д.
Обязательно если скрипт будет работать на *NIX платформе выставить права доступа
как 777 (Read/Write/eXecute)
Файл состоит из четырёх строк которые заполнены по 1 нулю.

Пример :

Код:
0
0
0
0

Теперь сам скрипт.

Vote.php

Код:
<?
$file = "vote".$von.".txt";
$a = file($file);
$i = 0;
$fi = Count($a)-1;
$n = 0;
while ($i <= $fi):
$a[$i] = trim(str_replace ("\n","", $a[$i]));
$n = $n+$a[$i];
$i++;
endwhile;

if ($answer != "") {
echo "<br>Спасибо, Ваше мнение учтено:";
$a[$answer]++; $n++;

$fp = @fopen($file,"w");
if ($fp) {
$counter=fputs($fp,$a[0]."
");
$counter=fputs($fp,$a[1]."
");
$counter=fputs($fp,$a[2]."
");
$counter=fputs($fp,$a[3]."
");
fclose($fp);
}
else { echo "Произошла ошибка записи результатов!"; }

} else { echo "<br>Результаты голосования"; }
echo "<br>".$a1." - <b>".$a[0]."</b>";
echo "<br>".$a2." - <b>".$a[1]."</b>";
echo "<br>".$a3." - <b>".$a[2]."</b>";
echo "<br>".$a4." - <b>".$a[3]."</b>";
echo "<br><br>Всего проголосовало: ".$n;
echo "<!-- Скрипт от KLEVO-SOFT специально для INTERNET@MANIA -->"
?>

Пару советов :

Я вообще ленивый человек , но не люблю оставлять дырки.

В данном голосование 1 человек может проголосовать хоть 100 раз , но мы это сейчас исправим.

Проверять по IP человека можно , но 1 сейчас есть много прокси серверов и можно просто перезвонить к провайдеру и ты получишь новый IP.
Но у меня идея покруче …
Cookies.
Но они работают не во всех браузерах.
Мысль состоит в том чтоб обрабатывать голосовал ли уже человек …
Допустим можно голосовать 1 раз в день .
Значит перед echo "<br>Спасибо, Ваше мнение учтено:";
Мы должны написать
setcookie("voted","yes",time() + 86400);
Если вам интересно что такое 86400 то это 1 день
1 день=24часа=24*60 минут=24*60*60 секунд или 86400 секунд.
Это значит что юзер целый день не сможет голосовать.

Далее заменяем

Код:
if ($answer != "")

на

Код:
if (($answer != "") && ($voted !="yes")){

и заменяем

Код:
} else { echo "<br>Результаты голосования"; }

на

Код:
} else {
if ($voted =="yes") {
echo "Вы уже голосовали !";
}
echo "<br>Результаты голосования"; }

Вуаля !
Скрипт ГОТОВ !!!
Теперь голосуйте сколько хотите !

0

2

Полная статистика посещений своими руками

Сегодня, даже далеко не все платные хостинг-компании предоставляют полную статистику посещений вашего сайта - что уж говорить о бесплатных. Разумеется, можно воспользоваться бесплатными сервисами, типа HotLog (например, счетчики чуть левее текста), однако более качественные услуги стоят дорого. Можно создать свою статистику, практически без труда, для этого нужно написать всего пару строчек кода. Ну что ж, приступим...

Доступ к лог-файлам сайта есть не везде, а хочется все-таки просмотреть логи, проблема решаема - пишем скрипт для создания своих лог-файлов. На вооружение возьмем два метода - с использованием сессий - в логе остается лишь одна запись - и без - остается запись после каждого нового хита пользователя. Для хранения мы будем использовать обчычные текстовые файлы.

Метод первый с использованием сессий:

Код:
<?php
session_start();
if(!session_is_registered('counted')){
$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);
session_register('counted');
}
?>

Теперь давайте пройдемся по отдельным частям кода:

Код:
session_start();

Здесь мы запускаем механизм сессий, эта строчка просто необходима, ведь в представленном примере мы будем вести учет пользователей, "не учтенных" сессией.

Код:
if(!session_is_registered('counted')){

Здесь мы проверяем существует ли сессия с именем 'counted', если нет, то выполняем идущий за этой строкой код.

Код:
$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');

А вот уже в этом куске кода мы объявляем список переменных, которые в свою очередь обращаются к глобальным переменным, пожалуй, не стоит описывать работу всех их, лишь скажу о функциях оных.
$_SERVER['HTTP_USER_AGENT'] - расскажет нам в логе о том, каким браузером и ОС пользуется юзер.
$_SERVER['REQUEST_URI'] - поведает о том, с какой страницы была произведена запись, можно также составить статистику наиболее популярных для входа страниц.
$_SERVER['PHP_AUTH_USER'] - работает, только, если у вас на сайте есть регистрация и пользовательские аккуанты - запишется имя пользователя.
$_SERVER['REMOTE_ADDR'] - ну здесь по-моему все понятно - определяется ip пользователя
$_SERVER['HTTP_REFERER'] - очень удобная вещь - с помощью нее мы узнаем откуда пришел пользователь, и узнаем о сайтах, поместивших на нас ссылку.
date('r') - записывается время в стандартно формате.

Код:
if(!$ref){
$ref = "Нет";
}
if(!$user){
$user = "Нет";
}

Если человек пришел на ваш сайт, просто набрав в адрестой строке браузера ваш адрес и он не зарегистрирован, то в этом случае в логе будет записано "нет".

Код:
$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);
session_register('counted');

В последнем куске кода - мы записываем соответствующую информацию в файл logs.txt. Все скрипт статистики готов!

Способ второй - без использования сессий.
Во втором способе мы не будем использовать сессии, то есть каждый хит пользователя будет заносится в ваш лог файл. Если посещаемость вашего ресурса высока - то не советую применять этот способ, хотя с помощью него вы получаете полную картину посещаемости вашего сайта.

Код:
<?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);
?>

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

0

3

И кто там у нас сейчас на сайте...

Наверное, путешествуя в Сети, вы не раз натыкались на подобного типа надпись «Сейчас на сайте 99 человек», что означает, что кроме вас в данный момент этот сайт просматривает 98 человек. Скорее всего, вы хотели написать такую вещь, но не знали как. Следующая статья покажет как самому написать скрипт, считающий количество посетителей на сайте в данный момент, то есть онлайн.

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

Преимущества.

Ему не нужна реляционная база данных, что согласитесь, в нашем Рунете (я имею в виду относительно бесплатную его часть), является несомненным преимуществом.
Опять же несомненным преимуществом является скорость. Я не поленился написать подобный скрипт с использованием БД и при помощи функции microtime() (в самом низу – результат ее работы – «Время генерации: …») измерил время выполнения:
Используя сессии – 0,7 мс
Используя БД – 14,2 мс
То есть преимущество в скорости – более чем в 19 раз! Вы можете сказать : «Тоже мне большое дело. Всего 13 мс разница», да они будут правы – а если посещаемость большая? Растет нагрузка на сервер и тогда действительно такое преимущество становится очевидным.
Еще одно преимущество – то, что информация в сессиях хранится пока не закрыт браузер или 1440 секунд (стоит по умолчанию в php.ini), в БД информацию о юзерах вам пришлось бы удалять вручную.
И последнее – простота, чтобы объявить сессию достаточно вызвать функцию session_start(), а чтобы настроить правильных образом БД нужно написать целых 15 строк кода.

Недостатки.

Нет детальной статистики – в сможете только узнать количество пользователей в данный момент, для ведения статистики (хиты, хосты…) придется все-таки работать с БД.
Нужен PHP4 – как это ни парадоксально – еще не все хостеры поставили себе PHP4.

Собственно скрипт:

Код:
session_start(); 
define("MAX_IDLE_TIME", 3); 
function getOnlineUsers(){ 
if ( $directory_handle = opendir( session_save_path() ) ) { 
$count = 0; 
while ( false !== ( $file = readdir( $directory_handle ) ) ) { 
if($file != '.' && $file != '..'){ 
if(time()- fileatime(session_save_path() . '' . $file) < MAX_IDLE_TIME * 60) { 
$count ; 
} 
} } 
closedir($directory_handle); 
return $count; 
} else { 
return false; 
}} 
echo 'Пользователей онлайн: ' . getOnlineUsers() . ' 
'; 
?>

ЗАМЕЧАНИЕ: Если у вас нет специальной директории для хранения сессий, просто сразу первой строчкой добавьте:

Код:
session_save_path("/path/to/custom/directory");

Теперь пройдемся по отдельным частям кода:

Код:
session_start();

Следующая строка кода - это объявление некоторой константы, в течении которой пользователи будет считаться активными, то есть присутствующими в данный момент на сайте. В нашем примере - 180 секунд, то есть, если пользовательь не перешел на новую страницу или не перезагрузил эту в течении 3 минут, то он считается ушедшим с сайта и мы его уже не учитываем:

Код:
define("MAX_IDLE_TIME", 3);

Теперь мы объявляем функцию getonlineuser() и сразу открываем "сессионную" директорию:

Код:
function getOnlineUsers(){ 

if ( $directory_handle = opendir( session_save_path() ) ) {

Далее идет часть кода, которая собственно и отвечает за подсчет пользователей, функция возвращает кол-во пользователей онлайн:

Код:
$count = 0; 
while ( false !== ( $file = readdir( $directory_handle ) ) ) { 
if($file != '.' && $file != '..'){ 
if(time()- fileatime(session_save_path() . '' . $file) < MAX_IDLE_TIME * 60) { 
$count ; 
} 
} 
closedir($directory_handle); 

return $count; 

} else { 
return false; 
} 

}

И пожалуй, разумно будет вывод количества юзеров в конце:

Код:
echo 'Онлайн юзеров: ' . getOnlineUsers() . ' 
';

0

4

Своя рассылка на PHP

В интернете есть много бесплатных сервисов. В том числе и услуги по рассылке писем подписчикам. Некоторые из них очень хороши. Но раз уж они бесплатны, значит тут же в письмах появляется реклама. Да и немалые формы для подписки с логотипом представителя услуг многих не устраивают.

Так почему бы не написать простенький движок для своей рассылки и отсылать письма своими силами?

Давайте разберемся, что нам для этого потребуется. Для того чтоб посетители имели возможность подписаться на вашу рассылку необходима форма для ввода адреса электронной почты. После ввода адрес надо запомнить. Давайте адреса будем сохранять в файле maillist.txt по одному адресу в строчке. После того как адрес будет сохранен, давайте выведем соответствующее сообщение и отобразим форму для подписки еще одного адреса или удаления существующего. Вот собственно почти и все. Осталось добавить только возможность отправки писем. Для безопасности, давайте на возможность отправки писем поставим пароль - необходима форма для ввода пароля. Далее потребуются формы для заполнения адреса отправителя и темы, а также для самого текста. Ну и, наконец, сам скрипт, который будет отсылать письма. А теперь все по порядку.

Форма для ввода адреса електронной почты будет состоять только из окна для ввода адреса и кнопки для подтверждения:

Код:
<form method="post" action="ras.php" enctype="multipart/form-data">
<input type="text" name="email" size="30">
<input type="submit" name="submit" value="подписаться"></form>

Итак, в окне для ввода текста, с именем email и видимой длиной в 30 символов, будет вводиться адрес электронной почты. После нажатия на кнопку с надписью подписаться, адрес будет передан скрипту ras.php для занесения в базу рассылки.

Далее давайте рассмотрим скрипт ras.php который будет сохранять адрес почты в файле, выводить сообщение о результате и формы для подписки и отписки. Скрипт можно исполнить совсем просто - сохранить адрес, вывести соответствующее сообщение. Но могут возникнуть проблемы: кто-то может случайно подписаться несколько раз, кто-то может допустить опечатку и ввели в поле адреса недопустимый символ или нарочно ввести белиберду. В таком случае база рассылки будет загрязняться, а неверные адреса станут приводить к ошибкам в работе скрипта. Вывод ясен - перед сохранением адреса следует проверить его на соответствие стандартам имен адресов электронных почтовых ящиков, а также на наличие в базе рассылки. Для того чтоб не рассматривать код по частям, я дам комментарии в самом коде:

Код:
<?
$file = "maillist.txt"; // файл, содержащий адреса

error_reporting(0); // запрещаем вывод сообщений о возможных ошибках

function test_mail($char) // функция, проверяющая реальность адреса

{
$flag = false;
if (eregi("^[_\.0-9a-z-]+@([0-9a-z][-0-9a-z\.]+)\.([a-z]{2,3}$)", $char)) $flag = true;
if ($flag) return true;
else return false;
}

$email = trim(strtolower($email)); // получаем введеный в
// форму адрес с 
// символами в нижнем регистре

function copy_mail($char) // проверяем, есть ли такой адрес в базе
{
$file = "maillist.txt";
$list = file($file);
for ($i = 0; $i < sizeof ($list); $i++)
if ($char == trim($list[$i])) $flag = true;

if ($flag) return true;
else return false;
}

echo "<center>";

if (is_file($file)) // далее проверяем адрес вышеописанными функциями
{
$maillist = file($file);
if (!$email == '') {
if (test_mail($email)) {
if (!copy_mail($email))
{
$maillist[] = "\n$email";
print "E-mail: $email добавлен базу рассылки</center>";
}
else print "E-mail: $email уже есть в базе</center>";
}
else print "E-mail: $email не сушествует</center>";
}
else print "</center>";
}
else print "Не найден файл $file ! Пожалуйста <A HREF=\"mailto:$fromemail\">сообщите</a> мне о ошибке.</center>";
// выводи на экран форму с предложением подписки и отписки
echo "<br><center>Подписаться на рассылку<form method=\"post\" action=\"ras.php\" enctype=\"multipart/form-data\">";
echo "Введите mail:<input type=\"text\" name=\"email\" size=\"30\"><input type=\"submit\" name=\"submit\" value=\"подписаться\"></form></center>";

echo "<CENTER><br><br><form method=\"post\" action=\"ras.php\" enctype=\"multipart/form-data\">";
echo "Отписаться от рассылки<br>Введите mail:";
echo "<input type=\"text\" name=\"delmail\" size=\"15\"><input type=\"submit\" name=\"submit\" value=\"Отписаться\"></form></CENTER>";
// если пользователь решил отписаться - удаляем введеный адрес
$flag = false;
$fw = fopen($file, "w");
for ($i = 0; $i < sizeof ($maillist); $i++)
if (trim(strtolower($delmail)) == trim(strtolower($maillist[$i]))) {
if (!$delmail == '')
{
print "<center>$delmail удален из базы рассылки</center>";
$flag = true;
}
}
else fputs($fw, $maillist[$i]); // введенного адреса в базе нет
fclose($fw);
if (!$delmail == '')
if (!$flag) print "<center>$delmail не найден в базе рассылки</center>";
?>

Вот наш код сохранения и удаления адресов готов. Теперь надо позаботится о средствах отправки почты. Не будем же мы через Аутлук отсылать ?. Как уже говорилось, защитим возможность отправки паролем, который будем вводить на специальной форме:

Код:
<form method="POST" action="out.php">
<input type="password" name="pass" value="">
<input type="submit" value="войти">
</form>

Поле для ввода с именем pass и будет служить для ввода пароля. После нажатия на кнопку с надписью войти, пароль будет передан скрипту out.php:

<?

$subject = "Рассылка моего сайта"; // тема рассылки
$fromemail = "мое@мыло"; // ваш адрес (для ответов)
$file = "maillist.txt"; // список адресов подписчиков
$password = "secretpassword"; // ваш пароль для рассылки

if ($pass == $password) // если пароль ввели правильный
// то выводим форму с полями для ввода:
// адрес отправителя, текст письма, тело письма
// кнопку для отправления
// после нажатия на кнопку, передаем данные скрипту send.php
{
echo "<font size=\"-1\"><hr><form method=\"POST\" action=\"send.php\">";
echo "адрес отправителя<br><input type=\"text\" name=\"fromemail\" value=\"$fromemail\" size=\"25\"><br>";
echo "тема письма<br><input type=\"text\" name=\"subject\" value=\"$subject\" size=\"50\">";
echo "<br>текст письма:<br><textarea name=\"body\" rows=\"8\" cols=\"50\"></textarea>";
echo "<br><input type=\"submit\" value=\"Отправить сообщение\"></form></font>";
print "<i>В базе<b>". sizeof($maillist) ."</b> адресов</i><br><hr>";
for ($i = 0; $i < sizeof ($maillist); $i++) print $maillist[$i]. "<br>";
}
// если пароль неверный - просим ввести еще раз
else echo "<form method=\"POST\" action=\"ras.php\"><input type=\"password\" name=\"pass\" value=\"\"><input type=\"submit\" value=\"Управление\"></form>";

?>

Осталось рассмотреть только один скрипт - тот самый, который будет отсылать почту:

<?

$odr = "\n\n\n Для отказа от подписки воспользуйтесь ссылкой\n";
$homepage = "http://адрес.сайта/ras.php";

error_reporting(0);
$subject = $HTTP_POST_VARS["subject"];
$body = $HTTP_POST_VARS["body"];
$subject = stripslashes($subject);
$body = stripslashes($body);

$file = "maillist.txt";
$maillist = file($file);

print "В базе". sizeof($maillist) ." адресов<br>";
for ($i = 0; $i < sizeof ($maillist); $i++)
{
#echo($maillist[$i]."<br>");
mail($maillist[$i], $subject,
$body ."$odr $homepag?delmail=$maillist[$i]",
"From: $fromemail");
}
echo "Готово!";

?>

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

Вот совсем и несложно! Теперь вы имеете мощный инструмент по ведению полностью собственной рассылки. Нет больше для вас никаких правил. Что хотите то и пишите в своей рассылке. Полная свобода по конфигурации и внешнему виду форм для подписки.

Разумеется, данный код является лишь минимальным набором. Например, с помощью функции mail можно организовать себе извещение о новом подписчике, а подписчику о удачной регистрации, рассказать побольше о рассылке.

Разумеется, говоря о полной свободе, я не в коем случае не имел в виду принудительную подписку ? или, проще говоря, спам. Если вдруг кто решит рассылать спам таким образом, то пусть учтет что на него сразу начнут жаловаться администрации хостинга. И неважно платный хостинг или нет, если администрация хостинга заметит подобные действия, она аннулирует предоставление своих услуг вам без возмещения убытков. А с халявными хостингами еще туже. Во-первых, надо просить персональное разрешения у администрации на открытие данной функции, во-вторых, как правило, стоит лимит в 1 письмо за минуту.

На такой вот веселой ноте и закончим.

0

5

Книга по PHP - PHP глазами хакера http://narod.ru/disk/4520873000/Фленов  … а.pdf.html

http://ru1.imgfiles.ru/3/f/a/c/2/3fac2d23e6915305bae462eeab1aa660p.jpg

Отредактировано Morgan Freeman (2009-01-23 22:55:13)

0


Вы здесь » Money-Cool Форум » Веб-программирование » Программирование на PHP


Сервис форумов BestBB © 2016-2024. Создать форум бесплатно