Раздел "Кодинг". Содержание:
Статьи:
Как слать письма в PHP с аттачами? Просто!
Импортирование информации с чужого сайта на свой сайт в свой дизайн
Гостевая книга на PHP
Автоматическое построение форм различной сложности и отправка их письмом с аттачами произвольного количества
PHP: удаление строки из файла
Подпишитесь на рассылку от ведущего раздела "Кодинг"
Раздел "Кодинг". Статьи:
Как слать письма в PHP с аттачами? Просто!
Как послать письмо в HTML виде? Присоедините к письму аттач с названием message.html и письмо превратиться в HTML-письмо!
<?
// Функции. Можно вынести в дpугой файл.
class html_mime_mail {
var $headers;
var $multipart;
var $mime;
var $html;
var $parts = array();
function html_mime_mail($headers="") {
$this->headers=$headers;
}
function add_html($html="") {
$this->html.=$html;
}
function build_html($orig_boundary,$kod) {
$this->multipart.="--$orig_boundary\n";
if ($kod=='w' || $kod=='win' || $kod=='windows-1251') $kod='windows-1251';
else $kod='koi8-r';
$this->multipart.="Content-Type: text/html; charset=$kod\n";
$this->multipart.="BCC: del@ipo.spb.ru\n";
$this->multipart.="Content-Transfer-Encoding: Quot-Printed\n\n";
$this->multipart.="$this->html\n\n";
}
function add_attachment($path="", $name = "", $c_type="application/octet-stream") {
if (!file_exists($path.$name)) {
print "File $path.$name dosn't exist.";
return;
}
$fp=fopen($path.$name,"r");
if (!$fp) {
print "File $path.$name coudn't be read.";
return;
}
$file=fread($fp, filesize($path.$name));
fclose($fp);
$this->parts[]=array("body"=>$file, "name"=>$name,"c_type"=>$c_type);
}
function build_part($i) {
$message_part="";
$message_part.="Content-Type: ".$this->parts[$i]["c_type"];
if ($this->parts[$i]["name"]!="")
$message_part.="; name = \"".$this->parts[$i]["name"]."\"\n";
else
$message_part.="\n";
$message_part.="Content-Transfer-Encoding: base64\n";
$message_part.="Content-Disposition: attachment; filename = \"".
$this->parts[$i]["name"]."\"\n\n";
$message_part.=chunk_split(base64_encode($this->parts[$i]["body"]))."\n";
return $message_part;
}
function build_message($kod) {
$boundary="=_".md5(uniqid(time()));
$this->headers.="MIME-Version: 1.0\n";
$this->headers.="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$this->multipart="";
$this->multipart.="This is a MIME encoded message.\n\n";
$this->build_html($boundary,$kod);
for ($i=(count($this->parts)-1); $i>=0; $i--)
$this->multipart.="--$boundary\n".$this->build_part($i);
$this->mime = "$this->multipart--$boundary--\n";
}
function send($server, $to, $from, $subject="", $headers="") {
$headers="To: $to\nFrom: $from\nSubject: $subject\nX-Mailer: The Mouse!\n$headers";
$fp = fsockopen($server, 25, &$errno, &$errstr, 30);
if (!$fp)
die("Server $server. Connection failed: $errno, $errstr");
fputs($fp,"HELO $server\n");
fputs($fp,"MAIL FROM: $from\n");
fputs($fp,"RCPT TO: $to\n");
fputs($fp,"DATA\n");
fputs($fp,$this->headers);
if (strlen($headers))
fputs($fp,"$headers\n");
fputs($fp,$this->mime);
fputs($fp,"\n.\nQUIT\n");
while(!feof($fp))
$resp.=fgets($fp,1024);
fclose($fp);
}
}
// *************************************************************************
//
// В качестве аттача пpисоединяем html-письмо (открывается автоматически).
// Второй аттач - некоторый файл из каталога.
// Вот так вызывать все то, что написано выше:
//
// *************************************************************************
$mail=new html_mime_mail();
$mail->add_html("<html><body><center><h2>Пpивет!<br><br>".
"<br>Посылаю двоичный файл [/bin/ls] ...".
"</h2></center></body></html>");
$mail->add_attachment("/bin/","ls");
$mail->build_message('win'); // если не "win", то кодиpовка koi8
$mail->send('ПОЧТОВЫЙ_ХОСТ_ВАШЕГО_ПРОВАЙДЕРА',
'КОМУ_(E-MAIL)',
'ОТ_КОГО_(E-MAIL)',
'ТЕМА ПИСЬМА');
//
// После прихода письма качаем по ФТП оригинальный /bin/ls и сравниваем с
// импортированным из письма:
//
// X:\temp>fc /b ls ls2
// Сравнение файлов ls и LS2
// FC: различия не найдены
//
//
// Внимание! Если у вас нет файла /bin/ls, то просто закомментируйте строку
// $mail->add_attachment("/bin/","ls"), чтобы программа не пыталась присоединить
// к письму неcуществующие файлы.
//
?>
>
Комментаpии по пpосьбам тpудящихся. Будут добавляться до тех поp, пока всем все не станет понятно.
> ...объяснить поподробнее, то что написано
> на http://php.spb.ru/php/mail.html.
> Т.е. я не понял, вся та информация, она
> располагается все на одной странице или то,....
Пpогpамма состоит из 2х частей.
- необходимые функции
- как написать письмо с аттачем. Аттач -- это HTML-письмо, содеpжащее слово "пpивет"
> И второе: ("<html><body><center><h2>пpивет</h2>
> </center></body></html>") - это есть само тело послание,
> которое придет на mail ???
Да, это и есть аттач. Их может быть несколько.
> .. но у меня возникли кое-какие еще вопросы:
> "почтовый хост" - в этом случае прописывается тот адрес, где
> реально находиться почтовый ящик (т.е. в большинстве
> случаев у провайдера) или нет
Нет. Этот параметр не имеет никакого отношения к каким-либо почтовым ящикам... Если вы не можете запонить это поле, то не занимайтесь программированием вообще.
- Открываем свою почтовую программу (для тех, кто не понял: Outlook, Thebat или др)
- Смотрим, что указано в поле "исходящий (SMTP) сервер"
- Пишем в параметре "ХОСТ" эти данные (без угловых скобок)
Пример: smtp.peterlink.ru (если я являюсь клиентом Петерлинка, что дает мне право пользоваться сервером почты). Любой человек как-то пишет письма в Инет. Это "как-то" он делает через почтовый сервер своего провайдера.
> "кому" - ???
> "от кого" - ???
> "тема" - ???
Нет, пожалуй эти поля комментировать не будем... Хотя:
- Кому - пример: vasya@pupkin.ru
- От кого - пример (от меня): dmitry@php...ru
- Тема - пример: ...
Нет, все же лучше не комментировать...
Импортирование информации с чужого сайта на свой сайт в свой дизайн
Пример предназначен для тех, кто начинает работать с php, и не только для них. Результатом работы программы(скрипта) является прогноз погоды на 5 дней для любого, интересующего Вас города, выводимый в виде, который нравится именно Вам, а не дизайнерам сайта-донора.
Информация в таких случаях берется с известных серверов прогноза погоды (где не пишут фразу "запрещено использование информации" и т.п.). В данном случае используется сервер http://weather.yahoo.com , на котором есть страницы с погодой для довольно большого количества городов, и практически всегда можно найти если не интересующий Вас город, то ближайший ему и идентичный по погодным условиям.
Это законченный проект, работающий на сайте http://sim-sim.ru в разделе туризма "погода в мире".
Единственным недостатком является лишь то, что админу приходится вводить в текстовый файл (возможен вариант с mysql, но в том случае мне было проще сделать в файле) название населенного пункта на родном языке и ссылку на страницу с прогнозом погоды на него на сервере Яхо. Но никто за Вас этого делать не будет.
Посему, скрипт состоит из 2-х частей:
- 1. Файл с администрированием (вводится в первую строку название города, на следующей строке - ссылка). Разбирать работу данной части, думаю, не стоит, комментариев более чем достаточно.
- 2. Файл с самой программой. Работа программы будет подробно описана ниже.
1. Администрирование.
Выводим на экран форму с паролем pass.
В окне вводятся:
Затем, после нажатия на кнопку и проверки пароля, записываем новый список в файл.
<html>
<head>
<title>admin weather</title>
</head>
<body>
<?php
// адрес файла, в котором и будут записываться названия городов со ссылками
$adr=$DOCUMENT_ROOT."/weather/weather.ini";
$password='pass'; // простенькая система авторизации
$eror='Password eror!';
$old=file($adr); // читаем то, что сейчас есть в файле
if ($submit) { // проверяем на нажатость кнопки
if ($pass==$password) {
$fp=fopen($adr,"w");
fwrite ($fp, $ini); // записываем в файл измененные данные
fclose($fp);
$old=file($adr);
}
else {
echo $eror;
}
}
?>
<form method=post action="<?php echo $PHP_SELF?>">
// информация, введенная в форму, обрабатывается этим же файлом
password:<input type=text name=pass><br>
inicialisation:<textarea name="ini" rows=15 cols=60>
<?
for ($i=0; $i<sizeof($old); $i++) {
echo $old[$i], ""; // выводим на экран текущий вариант файла
}
?>
</textarea>
<br>
<input type=submit name="submit" value="Enter">
</form>
</body>
</html>
После ввода информации в файл в виде, получаем:
50
Ларнака
http://weather.yahoo.com/forecast/Larnaca_CY_f.html
51
Пафос
http://weather.yahoo.com/forecast/Paphos_CY_f.html
- "44" - номер города.
- "Ларнака" - название города.
- "http://weather.yahoo.com/forecast/Larnaca_CY_f.html" - ссылка на погоду в городе Ларнака на Яхе.
Ссылки на города организовываются по принципу:
<a href=http://www.sim-sim.ru/catalogue/weather.php?weather=50>Ларнака</a>
А можно так:
<a href=http://www.sim-sim.ru/catalogue/weather.php?city=Ларнака>Ларнака</a>
Но если город из друх слов, то в пробелах пишем "%20"
В таком случае, номера городов в списке не нужны:
Если у нас не текстовый файл, а mysql, то все проще.
Если кому понадобится вариант с mysql, пишите мне totoeval@mtu-net.ru
2. Программа (собственно, адаптер чужого кода к Вашему сайту).
<table width=100% border=0 cellspacing=0 cellpadding=2 bgcolor=<? echo $brdcolor; ?>>
<tr>
<td>
<br>
<!----------------------- FORECAST ------------------------->
<?php
$ini=$DOCUMENT_ROOT.'/weather/weather.ini';
$region=file($ini); // читаем файл со списком городов-ссылок а массив $region
// определение координат искомого города
for ($i=0; $i<sizeof($region); $i++) {
if (trim($region[$i])==$weather) { // ищем номер города в списке
$city=trim($region[$i+1]); // название города
$adr=trim($region[$i+2]); // адрес страницы
}
else {
}
}
// если у нас передается информация не номером города, а названием, то:
for ($i=0; $i<sizeof($region); $i++) {
$city=str_replace($city,"%20"," "); // заменяем "%20" на " "
if (trim($region[$i])==$city) { // ищем название города в списке
$adr=trim($region[$i+1]); // адрес страницы
}
else {
}
}
// Входная информация для дальнейшего кода - $adr (адрес страницы
// прогноза погоды для города на сайте http://weather.yahoo.com)
// и $city - название города на родном языке.
// фразы для поиска полезной информации. Оригинал фраз можно обнаружить
// на странице, например, этой ,
// проанализировав код. здесь заводим в переменные фразы, по которым будем
// искать нужную информацию (градусы, описания погоды, картинки). Используем
// фразы до и после необходимой информации. Этот блок в будущем придется
// изменять, когда на оригинале (weather.yahoo.com) изменится код страниц.
// На 14 авг. 2001 он работает.
$begin_screen='FORECAST ----'; // начальная фраза таблицы с прогнозом погоды
$end_screen='</b></td></tr></table></td></tr></table>'; // последняя фраза таблицы
$post_gradus='</font></b><'; // после градусов
$before_gradus='<font size="3" face="arial">'; // перед градусами
$before_image='http://us.i1.yimg.com/us.yimg.com/i/we/fc/'; // перед картинкой
$post_image='.gif'; // после картинки
$before_forecast='top><font face="arial" size="2">'; // перед фразой погоды
$post_forecast='</font></td><td>'; // после фразы погоды
// массивы для переводов даты и описаний погоды с английского языка
// на родной (в данном случае использован вариант перевода с
// буржуйского на язык, которым разговаривал Ленин.
$endat=array(" ","Mon","Tue","Wed","Thu","Fri","Sat","Sun",
"May","Jul","Jun","Aug","Sep","Oct",
"Nov","Dec","Jan","Feb","Mar","Apr"); // английские даты
$rudat=array(" ","понедельник","вторник","среда","четверг",
"пятница","суббота","воскресенье",
"мая","июля","июня","августа","сентября","октября","ноября",
"декабря","января","февраля","марта","апреля"); // родные даты
$eng=array(" ","Thunderstorms","Sunny","Partly Cloudy",
"Showers","Rain","Mostly Cloudy","Tstorms","Drizzle","Cloudy",
"Flurries","Fog","High","Low","Clear","Sleet","Rain/snow",
"Snow Showers","Mixed Snow", "Rain", "Snow",
"Mixed"); // английские описания погоды
$rus=array(" ","гроза","ясно","переменная облачность",
"ливень","дожди","облачно","гроза","изморось","пасмурно",
"снегопад","туман","день","ночь","ясно","дождь со снегом",
"дождь со снегом","мокрый снег","снег с дождем","снег",
"переменно"); // российские аналоги погоды
$brdcolor='#ffffff'; // цвет рамки таблицы прогноза (белый)
$bgcolor='#eeeeee'; //цвет фона ячеек таблицы (лучше - цвет фона страницы)
// А Здесь начинается код программы, который изменять не придется.
// занимаемся созданием даты, выводимой на экран.
Функция time() даст нам текущее время. Функцией date(d." ".M,$t[$i]) получаем дату текущего и последующих 4 дней, а date(D,$t[$i]) дает нам дни недели всех 5 дней. А затем переводим даты с английского языка на родной.
$t=array(4);
$d=array(4);
$dn=array(4);
for ($i=0; $i<=4; $i++) {
$t[$i]=time()+$i*86400;
$d[$i]=date(d." ".M,$t[$i]);
$dn[$i]=date(D,$t[$i]);
// переводим слова в дате и получаем даты на родном языке
for ($j=0; $j<sizeof($endat); $j++) {
$d[$i]=str_replace($endat[$j],$rudat[$j],$d[$i]);
$dn[$i]=str_replace($endat[$j],$rudat[$j],$dn[$i]);
} // и получаем даты на языке, которым разговаривает наш нонешний Вова
}
// начинаем обрабатывать страницу.
// Выясняем строки начала и конца таблицы с прогнозом погоды.
// Затем, будем работать именно с этим блоком.
$screen=file($adr); // читаем страницу с прогнозом погоды в переменную $screen
for ($i=1; $i<sizeof($screen); $i++) { // обрабатываем строки с первой по последнюю
if (strpos($screen[$i],$begin_screen)==false) { //находим начало таблицы с прогнозом
if (strpos($screen[$i],$end_screen)==false) { //находим ее конец
}
else {$m=$i; // $m - номер последней строки таблицы
}
}
else {$k=$i; // $k - номер первой строки таблицы
}
} // Получаем с $screen[$k] по $screen[$m] - нашу таблицу с погодой.
// Потом будемработать именно с ней, чтобы не было лишних совпадений, и
// быстро работала программа.
// Можно ее выводить в "родном дизайне, но нам это не нравится
// Начинаем искать полезную информацию.
$grad=array(9); // массив из 10 чисел градусов температуры окружающей среды
$zed=0; // счетчик градусов
for ($i=$k; $i<=$m; $i++) { //работаем с градусами
//если нет градусов в строке (если нет фразы, стоящей перед градусами.
if (strpos($screen[$i],$before_gradus,0)==false) {
}
else {// если есть градусы в строке
$string_grad=$screen[$i]; // сохраняем строку с градусами в переменную
// разбиваем строку на массив строк по разделителю, которым
// является фраза перед градусами, таким образом, мы получаем в
// 1 элементе массива строку, которая начинается собственно с
// самого градуса погоды.
$string_grad=explode($before_gradus,$string_grad);
// определяем позицию начала фразы, идущей после градуса.
$end_grad=strpos($string_grad[1],$post_gradus,0);
// первый градус получаем, как подстрока, с 0-го символа до начала фразы после градуса.
$grad[$zed]=substr($string_grad[1],0,$end_grad);
$zed++; // инкремент счетчика градусов
$end_grad=strpos($string_grad[2],$post_gradus,0);
$grad[$zed]=substr($string_grad[2],0,$end_grad); // второй градус
$zed++; // инкремент счетчика градусов
}
} // в результате чего, мы получили все градусы на нашей странице
// переводим фаренгейты в цельсии
for ($i=0; $i<=9; $i++) {$grad[$i]=round(5/9*($grad[$i]-32));
}
// в варианте с забиранием информации со страницы с цельсиями
// эту строку стоит просто закомментировать. Я оставил так, просто каприз.
// переводим фаренгейты в цельсии
// находим слова погоды абсолютно аналогично поиску градусов
$zed=0; // счетчик описаний погоды
for ($i=$k; $i<=$m; $i++) { //работаем с описаниями
//если нет описания погоды в строке
if (strpos($screen[$i],$before_forecast,0)==false) {
}
else {// если есть описания в строке
$string_grad=$screen[$i]; // сохраняем строку с описаниями в переменную
$string_grad=explode($before_forecast,$string_grad);
$end_grad=strpos($string_grad[1],$post_forecast,0);
$forec[$zed]=substr($string_grad[1],0,$end_grad);
// перебираем все варианты слов в описаниях
for ($j=0; $j<sizeof($eng); $j++) {
// переводим слова
$forec[$zed]=str_replace($eng[$j],$rus[$j],$forec[$zed]);
}
$zed++; // инкремент счетчика описаний
}
} // в результате чего, мы получили все описания погоды на нашей странице
$zed=0; // счетчик слов картинок аналогично
for ($i=$k; $i<$m; $i++) { //работаем с картинками
//если нет описания погоды в строке
if (strpos($screen[$i],$before_image,0)==false) {
}
else {// если есть картинки в строке
$string_grad=$screen[$i]; // сохраняем строку с картинками в переменную
$string_grad=explode($before_image,$string_grad);
$end_grad=strpos($string_grad[1],$post_image,0);
$for_img[$zed]=substr($string_grad[1],0,$end_grad);
$zed++; // инкремент счетчика картинок
}
} // в результате чего, мы получили все картинки на нашей странице
?>
// публикуем результаты:
<table width=100% cellpadding=0 cellspacing=0 border=0>
<tr><td width=20% align=center><font size=3><b
// выводим название города, для которого отображается прогноз погоды
><? echo $city;
?></b><br></font></td></tr></table
><table width=100% cellpadding=0 cellspacing=0 border=0>
<tr><?
// выводим на экран ячейки с датами и днями
for ($i=0; $i<=4; $i++) {
echo "<td width=20% align=center><font
size=2><b>$d[$i]<
br>$dn[$i]</b></font></td>";
}
?></tr
></table
><table width=100% cellpadding=0 cellspacing=0 border=0
bgcolor=<? echo $brdcolor; ?>
><tr><td
><table width=100% cellpadding=2 cellspacing=1 border=0
><tr><?
$zed=0; // счетчик выводимых градусов
// выводим ячейки с прогнозами - картинки, градусы, описания
for ($i=0; $i<=4; $i++) {
$zed1=$zed+1;
echo "<td width=20% align=center bgcolor=$bgcolor
valign=middle><img src=../pic/".$for_img[$i].".gif border=0
alt=".$forec[$i]."><br><br><font
size=2>".$forec[$i]."</font><br><br><font
size=3><b>".$grad[$zed]."°C<br>".$grad[$zed1]."°C</b>
</font></td>";
$zed=$zed+2;
}
?>
</tr></table>
</td>
</tr>
</table>
Картинки можно привязать к картинкам Яхи (названия аналогичных по погоде совпадают, как в моем случае), а можно сделать массивы соответствия слов-описаний погоды и Ваших картинок. Это по-желанию. Что долговечнее, трудно судить. И фразы-описания они могут изменить, и картинки переименовать. Можно, конечно договориться с админом Яхи, чтобы они не меняли один из этих элементов и отталкиваться от него, но у меня не было его телефона:о)
Теперь программа работает, и ее можно вставлять в свой дизайн.
Вот вариант: вышеупомянутая Ларнака
Если кого заинтересуют "вариации на тему" или возникнут вопросы, прошу писать мне totoeval@mtu-net.ru.
А также, пишите все, кто сможет посоветовать другие варианты. Всегда рад критике и возможности повысить свой уровень.
Гостевая книга на PHP
Последнее время, все чаще и чаще в нашем форуме всплывают вопросы связанные с написанием гостевых книг.
Обычно гостевая книга состоит из двух частей: первая часть выводит записи, а вторая добавляет их.
В рассмотренном примере гостевой книги каждая запись хранится в отдельном файле. Имя файла создается автоматически, и состоит из двух частей - префикса и уникального идентификатора. Префикс нам необходим для того, чтобы отличить наш файл, от любого другого находящегося в том же каталоге (Честно говоря, по хорошему, в том же каталоге больше ничего не должно находиться), а уникальный идентификатор необходим для того, чтобы отличить одну запись от другой, и предоставить возможность сортировки записей.
В нашем случае префикс будет - "rec", а уникальный идентификатор мы получим с помощью функции time(). Функция time() возвращает текущее время, измеренное в числе секунд с эпохи Unix (1 Января 1970 00:00:00 GMT). Конечно, абсолютно уникальное число мы с помощью этой функции мы получить не сможем, но она нас устроит.
Сначала мы рассмотрим исходный текст модуля добавления записи в гостевую книгу.
Файл add.php:
В переменной $err мы будем хранить сообщения о произошедших ошибках. Если переменная пуста, то ошибок не происходило.
<?
$err="";
Если переменная $action не пуста, то значит происходит обращение при котором необходимо добавить запись, иначе
необходимо просто вывести форму добавления записи. Переменная $action задается в форме с помощью тега <input type=hidden>
$action=$HTTP_POST_VARS["action"];
if (!empty($action)) {
Первым делом необходимо проверить введено ли сообщение и указан ли его автор.
$name=trim($name);
$msg=trim($msg);
if (empty($msg)) {$action="";$err=$err."<LI>Вы не ввели сообщение\n";}
if (empty($name)) {$action="";$err=$err."<LI>Вы не ввели имя\n";}
после этого мы должны осуществить преобразование введенных данных, проверить их длину. Слишком длинные записи могут
сильно испортить внешний вид страницы. Необходимо убрать слеши "\" перед кавычками и заменить специальные символы HTML.
$name=substr($HTTP_POST_VARS["name"],0,32);
$name=htmlspecialchars(stripslashes($name));
$email=substr($HTTP_POST_VARS["email"],0,64);
$email=htmlspecialchars(stripslashes($email));
$www=substr($HTTP_POST_VARS["www"],0,64);
$www=htmlspecialchars(stripslashes($www));
$city=substr($HTTP_POST_VARS["city"],0,64);
$city=htmlspecialchars(stripslashes($city));
$msg=substr($HTTP_POST_VARS["msg"],0,1024);
$msg=htmlspecialchars(stripslashes($msg));
Если не произошло ошибок, то можно заменить специальные символы (такие как [b],[i],[u]) на их HTML аналоги (<b>, <i>, <u>)
if (!empty($err)) {
$msg=nl2br($msg);
$msg=str_replace("[u]","<u>",$msg);
$msg=str_replace("[i]","<i>",$msg);
$msg=str_replace("[b]","<b>",$msg);
$msg=str_replace("[/u]","</u>",$msg);
$msg=str_replace("[/i]","</i>",$msg);
$msg=str_replace("[/b]","</b>",$msg);
С помощью регулярного выражения заменим запись типа [url]http://www.codenet.ru/[/url] на <a href=http://www.codenet.ru/>http://www.codenet.ru/</a>
$msg=eregi_replace("(.*)\\[url\\](.*)\\[/url\\](.*)",
"\\1<a href=\\2>\\2</a>\\3",$msg);
$msg=str_replace("\n"," ",$msg);
$msg=str_replace("\r"," ",$msg);
Теперь данные готовы к сохранению в файл. Файлы с записями у нас будут храниться в каталоге ./records.
$fp=fopen("records/rec.".time(),"w");
fputs($fp,$name."\n");
fputs($fp,$email."\n");
fputs($fp,$city."\n");
fputs($fp,$www."\n");
fputs($fp,$msg."\n");
fclose($fp);
Все действия произведены, и мы можем смело отправить пользователя на главную страницу гостевой книги, где он сможет увидеть свою
запись.
print "<HTML><HEAD>\n";
print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>\n";
print "</HEAD></HTML>\n";
}
}
Если переменная $action пуста, то выводим форму добавления записи
if (empty($action)) {
?>
<HTML>
<HEAD>
<TITLE>Гостевая книга - добавить запись</TITLE>
</HEAD>
<BODY>
<?
if (!empty($errro)) {
print "<P>Во время добавления записи произошли следующие ошибки: </P>\n";
print "<UL>\n";
print $err;
print "</UL>\n";
}
?>
<H3>Добавление записи.</H3>
<center>
<table width=1 border=0>
<form action=add.php method=post>
<input type=hidden name=action value=post>
<tr><td width=50%>Имя<font color=red><sup>*</sup></font>:</td>
<td align=right>
<input type=text name=name maxlength=32 value='<? echo $name; ?>'></td></tr>
<tr><td width=50%>E-Mail:</td>
<td align=right>
<input type=text name=email maxlength=64 value='<? echo $email; ?>'></td></tr>
<tr><td width=50%>Домашняя страница (WWW):</td>
<td align=right>
<input type=text name=www maxlength=64 value='<? echo $www; ?>'></td></tr>
<tr><td width=50%>Город:</td>
<td align=right>
<input type=text name=city maxlength=64 value='<? echo $city; ?>'></td></tr>
<tr><td colspan=2>Сообщение<font color=red><sup>*</sup></font>:<br>
<textarea cols=50 rows=8 name=msg><? echo $msg; ?></textarea></td></tr>
<tr><td colspan=2><input type=submit value='Добавить'></td></tr>
</form>
</table>
</center>
<P>Используйте размету для [b]<B>выделения текста</B>[/b]
и вставки [url]гиперссылок[/url] </P>
</BODY>
</HTML>
<?
}
?>
Теперь рассмотрим модуль, ответственный за вывод записей гостевой книги.
Файл index.php:
<HTML>
<HEAD>
<TITLE>Гостевая книга</TITLE>
</HEAD>
<BODY>
<?
Первым делом, с помощью объекта dir, считаем содержимое каталога, в котором у нас хранятся записи. Все идентификаторы записей мы сохраним в массив, для его последующей сортировки.
$d = dir("records");
$i=0;
while($entry=$d->read()) {
if (substr($entry,0,3)=="rec") {
$names[$i]=substr($entry,4);
$i++;
}
}
$d->close();
Сортируем массив
@rsort($names);
$count=$i;
$cnt=$count;
if (empty($start)) $start=0;
$start=intval($start);
if ($start<0) $start=0;
Выводим ссылки навигации по гостевой книги "Предыдущие" и "Следующие"
print "<center>";
if ($count>$start+10) $count=$start+10;
if ($start!=0)
print "[ <A href=index.php?start=".($start-10).">Предыдущие</A> ]";
print " [ <a href=add.php>Добавить запись</A>] ";
if ($cnt>$start+10) {
print "[ <A href=index.php?start=".($start+10).">Следующие</A> ]\n";
print "</center><br>";
Теперь самое главное - считываем нужные нам записи и выводим их.
for ($i=$start;$i<$count;$i++) {
$entry=$names[$i];
$data=file("records/rec.".$entry);
$date=$entry;
$name=trim($data[0]);
$email=trim($data[1]);
$city=trim($data[2]);
$www=trim($data[3]);
$question=trim($data[4]);
$answer=trim($data[5]);
print "<table border=0 cellspacing=0 cellpadding=2 width=100%>";
print "<tr bgcolor=#F0F0F0><td> ";
if (!empty($email)) print "<a href=mailto:$email>$name</A>\n";
else print $name;
if (!empty($www)) print "[<a href=$www>$www</A>]";
print "</td><td align=right>".date("H-i-s <b>d-m-Y</b>",$date);
print "</td></tr>\n<tr><td colspan=2>\n";
print "<P>".$question."</P>\n";
if (!empty($answer)) print "<P><B><I>$answer</I></B></P>\n";
print "</td></tr></table>\n<br><br>\n";
}
Опять выводим ссылки навигации по гостевой книги "Предыдущие" и "Следующие"
print "<center>";
if ($start!=0)
print "[ <A href=index.php?start=".($start-10).">Предыдущие</A> ]";
print " [ <a href=add.php>Добавить запись</A>] ";
if ($cnt>$start+10)
print "[ <A href=index.php?start=".($start+10).">Следующие</A> ]\n";
print "</center>";
?>
</BODY>
</HTML>
Ну вот вроде все. Скачать исходный текст в архиве можно здесь.
А если у вас остались вопросы, вы их можете задать здесь.
Автоматическое построение форм различной сложности и отправка их письмом с аттачами произвольного количества
Все сталкивались с тривиальной задачей - создание формы для отправки по e-mail.
Обычно не возникает никаких проблемм. Но и работа эта не столь интересна и увлекательна. Простая рутина.
Возникает идея создать программу, которая автоматизировала бы этот процесс.
Для начала определим задачу.
Предположим, нам нужно создать формы на сайте.
В формах может присутствовать:
- заголовок раздела формы
- текстовое поле (text)
- текстовый блок (textarea)
- поле пароля (password)
- поле выбора из списка (select)
- поле checkbox
- поле радио буттона (radio)
- невидимое поле (hidden)
- поле загрузки файла (file)
Отсылать письма предполагается в текстовом виде с аттачами. Письма в формате html не пользуются популярностью у народа.
Должна быть проверка на заполненность полей, обязательных к заполнению.
Вот все пункты задачи готовы.
Решено сделать 3 файла:
- файл с формой
- файл отправки формы
- файл инициализации формы
Забегая вперед, могу предположить, что кто-то захочет положить файлы программы (первые два) в отдельный каталог, например forms, и будет просто инклюдить файл с формой на нужных страницах сайта, передавая ему параметром путь к файлу инициализации данной формы. Так как формы могут все-таки отличаться друг от друга в оформлении, я не стану городить огромный файл с бесконечным количеством вариантов и приведу полностью рабочий пример, работающий на сайте «Седьмого континента» в разделе «поставщики», а также на сайте gipragor.ru в разделе «задать вопрос».
Добавлю, что в наших случаях в формах были вариации вида полей text, textarea (в форме «Седьмого континента» 3 вида поля text). В вашем случае, возможно, понядобится еще несколько вариантов для полей. Все делается аналогично тому, что будет рассмотрено ниже.
Начнем с описания файла инициализации формы.
Ниже приведен текст файла ini.php
Выбор адресата^head^0
Выберите из списка^select^1^mail консультант|info@gipragor.ru|selected админ|totoeval@mtu-net.ru
Ваши координаты^head^0
Имя^text^1
Телефон^text^0
Факс^text^0
<nobr>Е-mail</nobr>^text^0
Я хочу получить ответ по телефону^checkbox^0^checked
Вопрос^head^0
Тема^textarea^1
Вопрос^textarea^1^long
Присоединить файл^file^0^attach
Присоединить файл 2^file^0^attach2
Предыдущая страница^hidden^0^refer
Как видим, каждое поле формы описывается отдельной строкой.
Как я ни старался сделать универсальным оформление всех полей форм, не получилось.
Вследствие этого, предлагаю такое оформление:
Первым везде идет название поля, которое выводится на экран.
Вторым тип поля формы:
- text
- password
- textarea
- checkbox
- radio
- hidden
- file
Третий указатель обязательного заполнения поля. Если стоит 1 поле обязательно. Если параметр пустой или любой отличающийся от 1, то поле не обязательное.
Четвертым указываем дополнительный параметр, если он необходим. У каждого вида поля свои дополнительные параметры:
- text long указывает на то, что поле-строка будет длинной и размещена под названием; обычное поле, без параметра, размещается справа от названия
- textarea то же самое, что и у text
- checkbox checked указывает на то, что чекбокс будет выбран по-умолчанию
- radio четвертым параметром указывается имя группы радио-буттонов, а пятым checked, как и у checkbox
- file указываем имя указателя массива загружаемых файлов
- hidden указываем параметр, в соответствии с которым в значение этого поля будет подставлено определенное значение, либо параметр будет передан как есть
Ну вот покончили с инициализацией формы.
Теперь попробуем написать программу, выводящую форму пользователю.
Создаем файл index.php с нижеприведенным содержимым.
<!-- начало -->
<h1>Задать вопрос</h1>
<?
if ($is_send == "send_query")
{
echo "<p>Вопрос был отправлен.</p>";
}
?>
<!--
Выводим форму типа multipart/form-data
для отправки через нее текстовых полей и файлов
-->
<form method="post" action="send.php" ENCTYPE="multipart/form-data"
onsubmit="return Validate(this);">
<table border="0" cellspacing="0" cellpadding="5" width="100%">
<tr><td class="text" colspan="2" align="center"><b></b></td></tr>
<?
// читаем файл инициализации в массив $texts
$texts=file("ini.php");
// перебираем все строки в файле и определяем пустые
for ($j=0; $j<(sizeof($texts)); $j++)
{
// оператором trim удаляем у строки слева и справа пробелы и переносы
$texts[$j]=trim($texts[$j]);
// если есть пустые строки, то в новый массив $proposal_text они не записываются
if ($texts[$j] != "") {$proposal_text[]=$texts[$j];}
}
// обнуляем переменную, в которую будут занесены все обязательные для заполнения поля
$fields=""; // имена полей формы
$fieldnames=""; // названия полей формы
// перебираем все строки инициализации в массиве $proposal_text
// имена полей будут называться form[0], form[1], form[2]...
// Таким образом, мы передадим всю форму в одном массиве.
// Индекс элемента массива будет указателем строки описания поля в файле инициализации
// для дальнейшей обработки полученной формы.
for ($i=0; $i<(sizeof($proposal_text)); $i++)
{
// разобьем строки специальным разделительным символом ^
// тогда $proposal[0] - текстовое название поля
// тогда $proposal[1] - указатель типа поля формы:
// text - текстовое поле-строка
// textarea - текстовое поле-блок
// hidden - невидимое поле
// password - поле ввода пароля
// file - форма для загрузки файла
// checkbox - чекбокс
// radio - радио буттон
// head - заголовки разделов форм, не имеют никаких полей,
// лишь текст выводится полужирным шрифтом, либо выделяется иным способом
// тогда $proposal[2] - указатель обязательного заполнения поля посетителем.
//Если он равен 1, то поле обязательно, если любое другое значение - нет
// тогда $proposal[3] - дополнительный параметр.
// например, у нас это:
// long в поле text и поле textarea означает, что поле бОльшей ширины
// и расположено под названием поля
// refer в поле hidden говорит о том, что передается в невидимом поле
// адрес предыдущей страницы, посещенной пользователем
// attach в поле file - имя поля загружаемого пользователем файла
// все поля оформляются соответственно указанному типу ниже в блоке switch
$proposal=explode('^',$proposal_text[$i]);
// переменной type присвоем тип поля
$type=trim($proposal[1]);
// определяем, обязательно ли к заполнению текущее поле
if (isset($proposal[2]))
{
if (trim($proposal[2]) == '1')
// если в поле указателя содержится 1, то добавляем имя поля к
{
// если в переменную fields уже были записаны данные,
// то ставим запятую
if ($fields != "") {$fields.=', ';}
$fields.="'form[$i]'";
if ($fieldnames != "") {$fieldnames.=', ';}
$fieldnames.="'".$proposal[0]."'";
$imperative=" *";
}
else {$imperative="";}
}
// если в строке есть дополнительный параметр, то записываем его в пtременную param
if (isset($proposal[3])) {$param=trim($proposal[3]);}
// стравниваем тип поля с возможными вариантами и соответственно оформляем его
switch ($type) {
case "head": // поле заголовка
echo "<tr>\n\t".
"<td class=\"text\" colspan=\"2\"><br>".
"<p><b>$proposal[0]</b></p>".
"</td>\n</tr>\n";
break;
case "text": // текстовое поле
if (isset($proposal[3])) {
if ($param == "long") {
// если поле длинное, то располагаем его под названием
// и увеличиваем длину
echo "<tr>\n\t".
"<td colspan=\"2\" class=\"text\">".
$proposal[0]."$imperative<div align=\"right\">\n\t".
"<input type=\"text\" name=\"form[$i]\" size=\"102\">".
"</div></td>\n</tr>\n";
}
}
else {
// иначе выводим стандартное поле-строку справа от названия поля
echo "<tr>\n\t".
"<td class=\"text\">".$proposal[0]."$imperative</td>\n\t".
"<td align=\"right\" valign=\"top\">".
"<input type=\"text\" name=\"form[$i]\" size=\"50\">".
"</td>\n</tr>\n";
}
break;
case "password": // поле пароля
echo "<tr>\n\t".
"<td class=\"text\">".$proposal[0]."$imperative</td>\n\t".
"<td align=\"right\" valign=\"top\">".
"<input type=\"password\" name=\"form[$i]\" size=\"50\">".
"</td>\n</tr>\n";
break;
case "textarea": // поле текстового блока оформляем аналогично текстовому полю
if (isset($proposal[3])) {
if ($param == "long") {
echo "<tr>\n\t".
"<td colspan=\"2\" class=\"text\">".
$proposal[0]."$imperative".
"<div align=\"right\">\n\t".
"<textarea name=\"form[$i]\" rows=\"6\" cols=\"102\">".
"</textarea></div></td>\n</tr>\n";
}
}
else {
echo "<tr>\n\t".
"<td class=\"text\" valign=\"top\">".
$proposal[0]."$imperative</td>\n\t".
"<td align=\"right\" valign=\"top\">".
"<textarea name=\"form[$i]\" rows=\"4\" cols=\"50\">".
"</textarea></td>\n</tr>\n";
}
break;
case "radio": // радио буттон.
//Его дополнительный параметр - имя переменной-группы радио-буттонов.
if (!isset($proposal[3])) {$param = "form[$i]";}
if (!isset($proposal[4])) {$checked = "";}
// если не задан параметр выбора буттона по-умолчанию
else {$checked = " checked";}
// если выбран по-умолчанию
echo "<tr>\n\t".
"<td colspan=\"2\" class=\"text\">".
"<input type=\"radio\" name=\"$param\" id=\"id$i\"$checked>".
"<label for=\"id$i\"> $proposal[0]</label></td>\n</tr>\n";
break;
case "checkbox": // чекбокс
if (!isset($proposal[3])) {$checked = "";}
// если не задан параметр выбора чекбокса по-умолчанию
else {$checked = " checked";}
// если выбран по-умолчанию
echo "<tr>\n\t".
"<td colspan=\"2\" class=\"text\">".
"<input type=\"checkbox\" name=\"form[$i]\" id=\"id$i\"$checked>".
"<label for=\"id$i\"> $proposal[0]</label></td>\n</tr>\n";
break;
case "hidden": // невидимое поле.
// От его параметра зависит, что в нем будет передаваться.
// Если параметр не описан, то он будет передан по-умолчанию как есть
if (!isset($proposal[3])) {$param = "form[$i]";}
echo "<input type=\"hidden\" name=\"form[$i]\"";
if ($param=="refer") {echo " value=\"".urlencode($HTTP_REFERER)."\">";}
else {echo " value=\"$param\">\n";}
break;
case "file": // поле загружаемого пользователем файла
if (!isset($proposal[3])) {$param = "form[$i]";}
echo "<tr>\n\t".
"<td align=\"right\" valign=\"bottom\">".
"<p align=\"left\">$proposal[0]$imperative<br>".
"<input type=\"file\" name=\"file_att[$param]\" size=\"35\"></p>".
"</td></tr>\n";
break;
case "select": // поле выбора селект
if (isset($proposal[3])) { // если заданы параметры селекта
$options = explode("\t", $proposal[3]);
// разделяем параметры каждой строки селекта
$option_text=explode("|",$option[0]);
// разбиваем первый подпараметр селекта
// на имя селекта и вид (multiselect и обычный)
// получаем в $option_text[1] - вид селекта
if ($option_text[1]=="multiselect")
{
if (isset($option_text[2]))
{
$multiselect="size=$option_text[2]";
}
$multiselect.=" multiselect";
}
else {$multiselect=" size=\"1\"";}
echo "<tr>\n\t".
"<td class=\"text\">$proposal[0]$imperative</td>\n\t".
"<td align=\"right\" valign=\"top\">".
"<select name=\"form[$i]\" style=\"width: 317\"$multiselect>\n";
// выводим тег селекта
for ($z=1; $z<sizeof($options); $z++)
// в 0 строке селекта у нас параметр, указывающий отправщику,
// как обрабатывать текущий селект
{
// выводим строки селекта
$option_text=explode("|", $options[$z]);
// в первой части - текст строки,
// во второй - передаваемое значение
if (!isset($option_text[2])) {$option_text[2]="";}
// если параметр "выбранная строка" не установлен
echo "\t<option value=\"$option_text[1]\" $option_text[2]>".
"$option_text[0]</option>\n";
// вывели строку селекта
}
echo "</select></td>\n</tr>\n";
}
break;
default:
// если тип не определен, то ничего не выводится.
// И, следовательно, стоит подумать, что еще не учтено.
}
}
?>
</table>
<!--
Выведена таблица с формой.
Осталось вывести на экран кнопки "отправить" и "очистить",
как это делают умные дядьки на других сайтах.
-->
<table border="0" cellspacing="5" cellpadding="0" width="100%">
<tr>
<td align="right" valign="bottom"><input type="submit" value="Отправить">
<img src="/images/1x1.gif" width="10" height="50">
<input type="reset" value="Очистить">
</td>
</tr>
</table>
<!--
Конечно, здесь могло не быть этого кода,
а кнопки отправки формы и очищения можно задать в файле инициализации,
добавив и их обработку в программе.
-->
</form>
<p>Вы можете задать вопрос.
С вопросом можно отправить файлы.<br>
Ответ вы получите на адрес электронной почты,
указанный в координатах,
либо по телефону, если поставите галочку у соответствующего пункта.</p>
<!--
Яваскрипт, которому мы передали список полей формы, обязательных к заполнению
Он определит после попытки отправки формы, заполненны ли эти поля.
Если не заполнены, то скрипт ругнется и укажет какое поле не заполненно,
установив в него курсор.
-->
<script language="JavaScript">
fields = new Array(<? echo $fields; ?>);
fieldnames = new Array(<? echo $fieldnames; ?>);
function Validate(forma)
{
for(i=0;i<fields.length;i++)
{
field = fields[i];
if (forma.elements[field].value == "")
{
alert("Вы должны заполнить поле \""+fieldnames[i]+"\"");
forma.elements[field].focus();
return false;
}
}
return true;
}
</script>
</td>
</tr>
</table>
<!-- конец -->
Ну вот, наша форма выводится на экран пользователя, и он старательно, прикусив язык, заполняет все её поля.
Но мы-то знаем, что вывести форму и заполнить её половина дела. Важно получить форму, обработать её и отправить по выбранному или указанному по-умолчанию адресу.
Ниже приведен текст файла отправки письма с аттачами send.php, который мы кладем в папку с index.php.
<?
// определяем, с какой страницы пришел посетитель на страницу отправки
if (strpos($HTTP_REFERER, "gipragor.ru/feedback") === false) {
// если не со страницы отправки формы, то кидаем его в форму
header("location: .");
}
// если посетитель прошел проверку, читаем файл инициализации
$texts=file("ini.php");
// перебираем все строки в файле и сохраняем в новый массив только не пустые
for ($j=0; $j<(sizeof($texts)); $j++)
{
$texts[$j]=trim($texts[$j]);
if ($texts[$j] != "") {$proposal_text[]=$texts[$j];}
}
// Объявляем пустую строковую переменную, в которой будет храниться сообщение
$mailtext="";
// Перебираем все строки массива формы
for ($i=0; $i<(sizeof($proposal_text)); $i++)
{
// Разбиваем строки по разделительному символу ^
// получаем подстроки, в которых хранится:
// 0 - текст названия поля формы
// 1 - тип поля формы
// 2 - указатель обязательности заполнения поля формы
// 3 - дополнительные параметры поля формы
$proposal=explode('^',$proposal_text[$i]);
$type=trim($proposal[1]);
if (isset($proposal[3])) {$proposal[3]=trim($proposal[3]);}
if (!isset($form[$i])) {$form[$i]="нет данных";}
// перебираем варианты типов полей формы
switch ($type)
{
case "head": // если заголовок раздела формы
if ($mailtext != "")
{
// если это не первый заголовок в форме,
// то ставим перед ним 2 пустые строки
$mailtext.="\n\n";
}
$mailtext.="\t$proposal[0]\n";
break;
case "text": // если поле текствое - строка
if (isset($proposal[3]))
{
if ($proposal[3] == "long")
{ // если строка длинная, то выводим ее под названием поля
$mailtext.="$proposal[0]:\n$form[$i]\n\n";
}
}
else
{ // если строка не длинная, то выводим ее справа от названия поля
$mailtext.="$proposal[0]: $form[$i]\n";
}
break;
case "textarea": // поле текстового блока
$mailtext.="$proposal[0]:\n$form[$i]\n\n";
break;
case "radio": // радио буттон
$group == "$proposal[2]";
$mailtext.="$proposal[0]: $group\n";
break;
case "checkbox": // чекбокс
if (trim($form[$i]) == "on")
{ // если чекбокс выделили, то его значение - on
$mailtext.="$proposal[0]\n";
}
break;
case "hidden": // скрытое поле. Обрабатываем его взависимости от параметра
if (!isset($proposal[3])) {$param = "form[$i]";}
if ($param="refer") {$form[$i]=urldecode($form[$i]);}
$mailtext.="$proposal[0]: $form[$i]\n";
break;
case "file": // поле файла отправляемого пользователем в виде аттача к письму
if (!isset($proposal[3])) {$param = "form[$i]";}
else {$param=$proposal[3];}
// создаем массив из файлов-аттачей
$att_arr[]=$file_att[$param];
$att_arr_type[]=$file_att_type[$param];
$att_arr_name[]=$file_att_name[$param];
break;
case "select": // поле селекта
if (isset($proposal[3])) { // если есть параметры селекта
$options = explode("\t", $proposal[3]);
// разбиваем параметры и перебираем каждую строку
$option_text=explode("|",$options[0]);
// разбиваем первый подпараметр селекта
//на имя селекта и вид (multiselect и обычный)
if ($option_text[0] == "mail") {$mailto=$form[$i];}
// если 0 параметр равен mail -
// значит это варианты e-mail адресата (в нашем случае)
$mailtext.="$proposal[0]: $form[$i]\n";
}
break;
default:
}
}
// удалим из текста формы теги html
$mailtext=strip_tags($mailtext);
// удалим специальные символы из текста формы
// используя стандартный способ из руководства php
$search = array ("'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'(\d+);'e",
"''i",
"''i");
$replace = array ("&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)",
" - ",
"-");
$mailtext = preg_replace ($search, $replace, $mailtext);
// Параметры отправляемого сообщения
if ($mailto == "")
{ // если адресат не был выбран в форме, то указываем его по-умолчанию
$to = "totoeval@mtu-net.ru";
}
else
{ // если адресат был выбран посетителем в форме
$to = $mailto;
}
$from = "webmaster@$SERVER_NAME";
$subject = "New Providers";
$message = $mailtext;
// объявление в заголовке письма параметр From - от кого.
$headers = "From: $from";
// Оформляем boundary string - строку-разделитель
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
// определяем, был ли отправлен файл с письмом
if (sizeof($att_arr)>0)
{ // если файл отправлен
// Добавляем к заголовку письма тип передаваемых данных
$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";
// Добавляем к сообщению multipart boundary и тип передаваемых данных,
// а затем присоединяем текст письма
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"windows-1251\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";
}
else
{ // если письмо без приаттаченных файлов
// Добавляем к заголовку письма тип передаваемых данных
$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: text/plain; charset=\"windows-1251\"\n" .
" boundary=\"{$mime_boundary}\"";
// Добавляем к сообщению boundary и тип передаваемых данных (текст),
// а затем присоединяем текст письма
$message = "Content-Type: text/plain; charset=\"windows-1251\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";
}
// перебираем имеющиеся приаттаченные файлы
// если их нет, то аттач производиться не будет
for ($files=0; $files<sizeof($att_arr); $files++)
{
$fileatt=$att_arr[$files];
$fileatt_type=$att_arr_type[$files];
$fileatt_name=$att_arr_name[$files];
if (is_uploaded_file($fileatt))
{ // проверяем, верно ли заапплоаден файл
// Читаем файл аттача ('rb' = читаем в двоичном виде)
$file = fopen($fileatt,'rb'); // открываем поток
$data = fread($file,filesize($fileatt));
fclose($file); // закрываем поток
// Кодируем Base64 содержимое файла
$data = chunk_split(base64_encode($data));
// Добавляем содержимое файла к сообщению
// с соответствующими заголовком и описанием типа данных
$message .= "--{$mime_boundary}\n".
"Content-Type: {$fileatt_type};\n".
" name=\"{$fileatt_name}\"\n".
"Content-Transfer-Encoding: base64\n\n".
$data."\n\n";
}// так перебираем все отправляемые файлы
}
$message .= "--{$mime_boundary}--\n";
// в конец сообщения добавляем разделительную строку с окончанием сообщения
// Отправляем сообщение
@mail($to, $subject, $message, $headers);
// сообщаем в куки, что письмо отправлено
setcookie ("is_send", "send_query", time()+120);
// переводим пользователя к странице формы
// где ему сообщат, что письмо его отправлено
header("location: .");
?>
Результатом работы программы будет письмо, приходящее на выбранный или указанный по-умолчанию адрес. С письмом может быть прислано произвольное, установленное в инициализации количество файлов-аттачей.
Все вышенаписанное предназначено для начинающих программировать на php, и для полета мысли уже опытных.
Повторять программу можно в варианте моем, своем, друга.
По вопросам всвязи с возникающими проблемами обращаться ко мне по адресу totoeval@mtu-net.ru
PHP: удаление строки из файла
 | Автор неизвестен |
 | Найдено в Инете |
 | Мыла нет :) |
Я очень часто встречаю вопрос типа "Как удалить определенную строку из файла?". Народ совсем не хочет шевелиться, ведь так легко зайти на любой крупный форум по PHP, и в сроке поиска написать что-то типа "Удаление строк из файла". Пятерка результатов гарантирована. Итак, в первой части статьи мы как раз рассмотрим способ удаления определенной строки из текстового файла.
Для начала было бы совсем не плохо создать текстовый файл. Назовём его file.txt, который будет состоять из строк, которые мы будем удалять:
строка один
строка два
строка три
строка четыре
строка пять
Затем создаём что-нибудь типа file.php, занимающий около 11 строк!
<?
if ($id != "") {
$id--;
$file=file("file.txt");
for($i=0;$i<sizeof($file);$i++)
if($i==$id) unset($file[$i]);
$fp=fopen("file.txt","w");
fputs($fp,implode("",$file));
fclose($fp);
}
?>
Сначала определимся, что для удаления определенной строки нам нужен её номер. Его мы будем передавать с идентификатором id: file.php?id=2 (удалим строку под номером ТРИ, так как исчисления элементов в массиве ведётся с нуля, но позже мы это сгладим).
- функция file() считывает весь файл в массив (каждая строка - это его элемент);
- $id-вычитает один из нашего идентификатора, так что 2 становится 2, а 3 - 3;
- unset($file[$i]) удаляет или обнуляет элемент массива (но только из памяти, т. е. виртуально:);
- implode() объединяет массив в одну строку. Это очень важно, так как если бы это опустили, наш файл бы похудел до бесполезной записи Array;
|