замучался..помогите написать плз (

sergeyttt

Новичок
замучался..помогите написать плз (

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

а) имеется файл price.txt содержание которого:

1|Краска белая|22.32|10|
2|Краска чёрная|22.50|10|

(как дивите в к-ве символа разделителя "|" . первое значение - номенклатурный номер, второе - наименование, третье - цена, четвертое - возможная скидка) нам нужны первое и третье значение (номер и цена)

б) теперь база.. база имеет состав

поле | поле
nn | cena
1 22.10
2 22.13

то есть вовсе ничего особенного .. но для меня это полный ступор.. итак.. действия

берётся первое значение с текстового файла (номенклатурный номер назовем его параметром $nnfile ) сверяется с базой (назовем $nnbase ) if $nnfile = $nnbase then .. обновить цену с файла price.txt в базу..в поле cena ... else (если номера такого нет) пропускаем идем дальше по файлу... и т.д.. и теперь Уважаемые, я понимаю что я сам нифигища не сделал хоть и усердно пытался найти примеры в инете.. но не нашел к своему сожалению, не могли бы Вы хотябы в кратце объяснить какие функции мне использвовать.. я могу открыть этот файл.. fopen($filename,'r') ))) но не могу получить с него эти данные для дальнейшей обработки..я так полагаю нужно их зафигачить в массив.. но как.. ума не приложу..помогите плз... очень нужно ( Заранее благодарен! сам эту с позволения сказать байду делаю нахаляву фирме..заставили ... (( поэтому.. будьте плз снисходительны к бедному админу ))))

PS у файла текстового размер не более 500 кб.
 

Фанат

oncle terrible
Команда форума
file() "зафигачит" твой файл в массив строк.
explode() разобьет строку в массив значений.
 

sergeyttt

Новичок
не понимаю товарищи.. (((((( можно пример... счас слегка переделал одну штукенцию.. которую нашел..и пытаюсь применить к своей ситуации:




<?php
$file = 'price.txt';
$handle = fopen($file,"rb") or die("Не удалось открыть файл"); #открываем файл на чтение
while (!feof($handle)) { #до конца файла
$str = fgets($handle); #читаем очередную строку
if (eregi("[[:alnum:].-_]+@(mail|inbox|bk|list).ru",$str,$regs)) #ищем e-mail в строке
$mails[] = $regs[0]; #если e-mail найден добавляем его в массив mails
}
fclose($handle); #закрываем файл

if (empty($mails)) die("Почтовых адресов не обнаружено"); #если массив пуст почтовых адресов нет
$mails = array_unique($mails); #удаляем из массива mails повторяющиеся записи

$handle = fopen("base.txt","a+b"); #открываем файл для записи, указатель в конец файла
while (!feof($handle)) $except[] = rtrim(fgets($handle)); #уже имеющиеся мыла
$except = array_merge($except,explode(",",$_POST['exception'])); #добавляем адреса
$mails = array_diff($mails,$except); #убираем ненужные mail`ы
$mails = implode("\r\n",$mails); #объединяем массив в строку с сепаратором \r\n
fputs($handle,$mails."\r\n"); #пишем строку в файл
fclose($handle); #закрываем файл
?>
<div style='cursor:pointer; font-weight:bold; text-decoration:underline;' onClick='history.back()'>Back</div>


вопрос, что писать заместо:

if (eregi("[[:alnum:].-_]+@(mail|inbox|bk|list).ru",$str,$regs)) #ищем e-mail в строке


подскажите плз :)) .. это выколупыватель e-mail адресов с текстового файла... я хотел бы чтобы он выколупывал сопоставление номенклатурных номеров (тоесть если в базе есть..и есть в текстовом файле.. то записывал эту строку в base.txt )
 

Фанат

oncle terrible
Команда форума
Ты, админ, хоть один язык программирования знаешь? Хоть бейсик?
 

sergeyttt

Новичок
бейсик, фортран, повершелл знаю...

-~{}~ 28.10.08 22:34:

насчет функций походу дела понял..спасибо.. а ведь всего лишь попросил пример..есть ли он у вас..
 

Maxsystems

Новичок
sergeyttt

Тебе нужна функция file('адрес файла'); - она возращает масив, тоесть каждая строка 1 переменная масива, например

$m=file('price.txt');
$m[0] - первая строка
$m[1] - вторая строка и тд

Общее кол-во строк тебе поможет узнать функция sizeoff($m); - вернет сколько всего строк.

для file(); не нужны такие штуки как fopen(); fclose(); - они нужны для записи в файл.

Также тебе понадобитсья функция explode() - она разбивает строку по задданому символу на масив, в твоем случае это будет выглядить так:

$line=explode('|',$m[1]); - разобьет на элементы масива строку 2( 2 потому что нумерация начинаеться масива с нуля), тоесть будет так
$line[0] //=2 - номер
$line[1] //=Краска - название
$line[2] //=2,22 - цена

И еще одна тонкость когда будешь собирать линию не забудь в конце добавить символы перехода на другую строку "\n\r"

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

sergeyttt

Новичок
оооо спасибо большое!!! ))) Вы очень добры! офигенно помогли.. хелп мне даже не помог как помогли Вы! )))) Maxsystems премного благодарен!
 

AmdY

Пью пиво
Команда форума
:) ну вот, а ***** как всегда *****, говорил совсем о другом ;)
кстати, в тонкости ошибка, в винде перевод строки не такой, а в никсах и подавно.
а в мане есть правильный :p
 

Фанат

oncle terrible
Команда форума
непонятно только, при чем здесь перевод строки вообще, кроме того, что надо последнему трим делать. ну да ладно.
 

sergeyttt

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

iSlayter

Новичок
Фaнат, загляни лучше в мою соседнюю темку и расскажи как заставить mencoder работать с VP7 под linux x64.
 

Фанат

oncle terrible
Команда форума
не понял, а зачем? что-то еще осталось нерешенным?
 

sergeyttt

Новичок
Так.. по мере написания опять возникли вопросы

<?

// base work
$link = mysql_connect("localhost", "root", "")
or die("Could not connect: " . mysql_error());

mysql_select_db('222', $link) or die('Could not select database.');

$r=mysql_query("SELECT products_id FROM products");




while($row = mysql_fetch_row($r))
{
$name[] = $row[0];
}

echo $name[0];
echo "<br>";

// price

$file = file('Ostatki.txt');
$exp = explode("|", $file);
$line = explode('|',$file[2]);
$line[0];
$line[1];
$line[2];
echo "<br>";
echo $line[11]; //cena
echo "<br>";

echo $line[0]; // nnum

echo "<br>";


$i = 0;
while ($i++<50000);
echo $i;
echo "<br>";

if ($name[$i] == $line[0]) {
echo "yahoo";
} else {
echo "not good";
}
?>



каким способом можно построчно сравнить значение у $name[0] с $line[0] не пойму.. (((( пока загвоздка лишь в этом вопросе.. значения с файла и с базы выводятся нормально... но вот со сравнением значений взятый с базы и с файла проблемы
 

Фанат

oncle terrible
Команда форума
удивительным образом "база" из base.txt переехала в mysql

-~{}~ 29.10.08 12:07:

построчно сравнить можно вложив один цикл в другой.
 

AmdY

Пью пиво
Команда форума
в хумор, чувак из данного ему примера всё скопироал бездумно.
$line=explode('|',$m[1]); - разобьет на элементы масива строку 2( 2 потому что нумерация начинаеться масива с нуля), тоесть будет так
$line[0] //=2 - номер
$line[1] //=Краска - название
$line[2] //=2,22 - цена
$line = explode('|',$file[2]);
$line[0];
$line[1];
$line[2];
:), круче илюстрации к готовым примерам не найти.
 

Фанат

oncle terrible
Команда форума
хотя нет. сначала надо создать массив с новыми ценами. которого у тебя нет.

$file - это у тебя массив. массив строк с палочками. А тебе нужен массив с номерами. Не одна строчка $line[0], а МАССИВ.
Для этого операцию, которую ты производил с одной строкой массива $file, надо произвести для всех строк.
для этого служат циклы. Надо в цикле перебрать массив $file, и выделить из его строк номера.
 
Сверху