Сохранение данных в .csv файл.

12
Unlock
На сайте с 01.08.2004
Offline
757
5470

Ситуация. Есть скрипт для отправки писем с сайта. Кроме отправки данных по почте, эти данные сохраняются в текстовый файл. Каждая запись выглядит так:

REMOTE_ADDR: xxx.xxx.xxx.xxx

Name: Vasya Pupkin
Job Title: President
Company: Ukos
Country: Russia
Phone: +74957777777
Email: mail@mail.com
Fax: +74958888888
Website: www.supersite.com
Enquiry: Any text

----------------------------

В скрипте, насколько я понял, данные записываются этим фрагментом:

function gettext(){

global $fields;
$text="";
if (isset($_SERVER['REMOTE_ADDR'])) $text.="REMOTE_ADDR: ".$_SERVER['REMOTE_ADDR']."\n";
if (isset($_SERVER['HTTP_VIA'])) $text.="HTTP_VIA: ".$_SERVER['HTTP_VIA']."\n";
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $text.="HTTP_X_FORWARDED_FOR: ".$_SERVER['HTTP_X_FORWARDED_FOR']."\n";
foreach($fields as $key => $field){
$text.=$field[0].": ".$_POST[$key]."\n";
}
return $text;
}

function sendform($text){
global $email, $subject, $logfile, $from;
mail($email, $subject, $text, "From: $from\nContent-Type: text/plain; charset=windows-1251\n");
$fp = fopen ($logfile, "a");
fputs ($fp, $text."\n----------------------------\n\n");
fclose($fp);
}

А надо чтобы во-первых, не писались данные из поля Enquiry не писались в файл, а во-вторых чтобы запись была вида:

REMOTE_ADDR;Name;Job Title;Company;Country;Phone;Email;Fax;Website

xxx.xxx.xxx.xxx;Vasya Pupkin;President;Ukos;Russia;+74957777777;mail@mail.com;+74958888888;www.supersite.com

Если это не сложно делается, подскажите пожалуйста как?

P.S. Если сделать так, чтобы данные из поля Enquiry не писались в файл, не видя сам скрипт сложно, пусть оно будет, это не критично.

Есть желание, - тысяча способов; нет желания, - тысяча поводов! /Петр-I/.
Shtogrin
На сайте с 02.11.2006
Offline
95
#1

А по почте отправлять тот же формат, что и в файл писать или прежний? И версия PHP?

www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
J
На сайте с 17.03.2007
Offline
17
#2

Поменять $text.=$field[0].": ".$_POST[$key]."\n"; на $text.=$_POST[$key].";"; и убрать данные которые не нужны

Письмом отправлять такой же текст или другой?

Разработка веб-сайтов, графический дизайн (http://www.jeton.ru/)
Shtogrin
На сайте с 02.11.2006
Offline
95
#3
Jeton:
Поменять $text.=$field[0].": ".$_POST[$key]."\n"; на $text.=$_POST[$key].";"; и убрать данные которые не нужны
Письмом отправлять такой же текст или другой?

А если пользователь введет в какое-то поле текст с ';'?

Shtogrin
На сайте с 02.11.2006
Offline
95
#4

PHP 5 (используется функция fputcsv). Структура csv файла будет одинаковая для всех форм - REMOTE_ADDR,HTTP_VIA,HTTP_X_FORWARDED_FOR, дальше поля с $fields, кроме Enquiry. После замены скрипта - не забыть сохранить старый лог и обнулить его.

function sendform($text)
{
global $email, $subject, $logfile, $from, $fields;
mail($email, $subject, $text, "From: $from\nContent-Type: text/plain; charset=windows-1251\n");

$fp = fopen ($logfile, "a");

$data=array();
$data['REMOTE_ADDR']=isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'';
$data['HTTP_VIA']=isset($_SERVER['HTTP_VIA'])?$_SERVER['HTTP_VIA']:'';
$data['HTTP_X_FORWARDED_FOR']=isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:'';
foreach($fields as $k=>$v)
{
if($k=='Enquiry')
continue;
if(isset($_POST[$k]))
$data[$k]=$_POST[$k];
else
$data[$k]='';
}
fputcsv($fp,$data);
fclose($fp);
}

Добавить в начале функции $fields

global $email, $subject, $logfile, $from, $fields;

Если PHP4, взять fputcsv на http://www.php.net/manual/en/function.fputcsv.php#77866

Unlock
На сайте с 01.08.2004
Offline
757
#5

Роман, версия PHP4. По почте надо отправлять в том виде, в котором сейчас. Что-то голова к вечеру совсем не работает, что теперь сделать исходя из этих данных, с вашим кодом?

Shtogrin
На сайте с 02.11.2006
Offline
95
#6

Заменить функцию sendform($text) на новую и в тот же файл положить функцию fputcsv (ссылка выше). По почте будет как раньше, в логе будет корректный csv. После замены скрипта - сохранить где-то старый лог и обнулить его. Это необходимо сделать потому что старый лог в другом формате.

JasonBourne
На сайте с 25.09.2007
Offline
3
#7

Shtogrin дело говорит, есть еще вариант сделать вот так:

function gettext(){ 

global $fields;
$text="";
if (isset($_SERVER['REMOTE_ADDR'])) $text.="REMOTE_ADDR: ".$_SERVER['REMOTE_ADDR']."\n";
if (isset($_SERVER['HTTP_VIA'])) $text.="HTTP_VIA: ".$_SERVER['HTTP_VIA']."\n";
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $text.="HTTP_X_FORWARDED_FOR: ".$_SERVER['HTTP_X_FORWARDED_FOR']."\n";
$ar = array();
foreach($fields as $key => $field){
$text.=$field[0].": ".$_POST[$key]."\n";
$ar[] = $field[0].": ".$_POST[$key]."\n";
}
return $text;
}

function sendform($text){
global $email, $subject, $logfile, $from;
mail($email, $subject, $text, "From: $from\nContent-Type: text/plain; charset=windows-1251\n");

// вставить данный кусок
$ar = explode("\n", $text);
$tofile = array();
foreach($ar as $row) {
if (preg_match("#^([^\:]+)\:(.*)$#msi", $row, $m)) {
if ($m[1]=="Enquiry") continue;
$tofile[0][] = trim($m[1]);
$tofile[1][] = trim($m[2]);
}
}
$text = implode(";",$tofile[0])."\n".implode(";",$tofile[1]);
// конец вставки

$fp = fopen ($logfile, "a");
fputs ($fp, $text."\n----------------------------\n\n");
fclose($fp);
}

Попроще и по сути нужно лишь добавить в функцию sendform блок:


$ar = explode("\n", $text);
$tofile = array();
foreach($ar as $row) {
if (preg_match("#^([^\:]+)\:(.*)$#msi", $row, $m)) {
if ($m[1]=="Enquiry") continue;
$tofile[0][] = trim($m[1]);
$tofile[1][] = trim($m[2]);
}
}
$text = implode(";",$tofile[0])."\n".implode(";",$tofile[1]);

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

if ($m[1]=="Enquiry") continue; 

на

if ($m[1]=="Enquiry") break; 
[ remoter.ru - удаленная работа (http://remoter.ru) ] [ файлообменник, без рекламы (http://share.remoter.ru) ]
Unlock
На сайте с 01.08.2004
Offline
757
#8

Всем огромное спасибо! Буду разбираться.

Unlock
На сайте с 01.08.2004
Offline
757
#9

Удалено. :) Разобрался. Все работает как надо :)

Unlock
На сайте с 01.08.2004
Offline
757
#10

Люди, подскажите пожалуйста, как добавлять дату к каждой записи? Т.е. чтобы помимо тех данных что забивает человек, проставлялась дата автоматически, когда была заполнена форма.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий