Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Замена в строковом файле по id
 
 автор: sedek   (13.11.2004 в 14:57)   письмо автору
 
 

Добрый день!
Ну значит так!
Допустим скрипт принял параметры:
$_get['id']
$_get['nick']
$_get['param1']
$_get['voc']

Он читает их и записывает в файл примерно так
id = nick
id = nick
id = nick
Тоесть каждый раз приняв такие параметры он записывает их в файл с новой строки соответственно проверяя если такой id уже есть в файле то незаписывает ничего!
Далее если в параметре $_get['param1'] поступило SETNICK то он должен найти в файле строку в которой совпадёт $_get['id'] и вместо nick вставить то что будет в
$_get['voc'] !
Выведя сообщение о том что успешно изменено!
Потом если в $_get['param1'] поступит просто текст то должен сделать следующее:
Прочитать то что в $_get['id'] найти в файле строку в которой совпадёт $_get['id'] с id
прочитать в этой nick запомнив его
прочитать из файла только id составить их через запятую или как там
и послать сообщение вставив вместо $nik то что запомнил раньше!
$handle = fopen ("pid.txt","r");
  while ($data = fgetcsv($handle, 1000, ","))
  {
    foreach ($data as $value)
    {
      if($_GET['id'] != $value)
      echo '$PID'."\r\n $value $nik bla bla bla\n";
    }
  }

   
 
 автор: cheops   (13.11.2004 в 18:02)   письмо автору
 
   для: sedek   (13.11.2004 в 14:57)
 

Постараюсь ближе к полуночи отписаться...

   
 
 автор: sedek   (14.11.2004 в 12:52)   письмо автору
 
   для: cheops   (13.11.2004 в 18:02)
 

И ещё!
Если в $_GET['param1'] поступило DEL а в $_GET['nick'] BOSS то скрипт должен найти в файле строку в которой nick совпадает с тем что в $_GET['voc'] и удалить эту строку вместе с id!
Если в $_GET['param1'] поступило OFF то скрипт должен найти строку в которой id совпадает с $_GET['id'] и удалить строку!

   
 
 автор: cheops   (14.11.2004 в 13:06)   письмо автору
 
   для: sedek   (14.11.2004 в 12:52)
 

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

   
 
 автор: sedek   (14.11.2004 в 14:23)   письмо автору
 
   для: cheops   (14.11.2004 в 13:06)
 

a как стелать отправку я чтото не пойму
ведь id должны както распологаться в списке наверно через запятую чтоб вывод был такой
$handle = fopen ("pid.txt","r");
  while ($data = fgetcsv($handle, 1000, ","))
  {
    foreach ($data as $value)
    {
      if($_GET['id'] != $value)
      echo '$PID'."\r\n $value chat-$nik $msg\n";
    }
  }

но только чтоб он id брал из text.txt
или из переменной

   
 
 автор: cheops   (14.11.2004 в 14:38)   письмо автору
 
   для: sedek   (14.11.2004 в 14:23)
 

Хм... можно сделать так как в аттаче, но нужно знать в строке
<?php
  
echo '$PID'."\r\n ".$matches[1]." chat-$nik $msg\n"
?>

кто есть кто? В частности $PID, $nik, $msg...

   
 
 автор: sedek   (14.11.2004 в 19:34)   письмо автору
 
   для: cheops   (14.11.2004 в 14:38)
 

а зачем надо файл снова разбивать и извлекать id?
У нас уже есть все id тут $list_id .= $matches[1]." ";
просто как-то надо разбить их на строки удалить текущий и вывести!
В принципе не какой разницы!
теперь другая проблемка!
допустим в $_GET['param1'] поступила команда setnick nick
Нужно чтобы скрипт если if(substr($_GET['param1'],0,7) == "setnick")
то читает файл text.txt если там id совпало с $_GET['id'] то он там заменяет nick на то что будет в $_GET['voc'] только после 7 символов!

   
 
 автор: cheops   (14.11.2004 в 20:34)   письмо автору
 
   для: sedek   (14.11.2004 в 19:34)
 

>то читает файл text.txt если там id совпало с $_GET['id'] то
>он там заменяет nick на то что будет в $_GET['voc'] только
>после 7 символов!
Т.е. setnick у нас и в voc?

   
 
 автор: sedek   (14.11.2004 в 20:51)   письмо автору
 
   для: cheops   (14.11.2004 в 20:34)
 

>Т.е. setnick у нас и в voc?
Оказывается да!
Просто то что в $_GET['param1'] поступает как и посылают тоесть на английском!
А в $_GET['voc'] на русском! это система переводит!

   
 
 автор: sedek   (14.11.2004 в 20:57)   письмо автору
 
   для: cheops   (14.11.2004 в 20:34)
 

немного не так у нас в $_GET['param1'] поступило setnick nick нам надо чтобы скрипт если в $_GET['param1'] первые 7 символов setnick то только тогда ищет id и заменяет на то что стоит в $_GET['voc'] после setnick

   
 
 автор: cheops   (14.11.2004 в 21:09)   письмо автору
 
   для: sedek   (14.11.2004 в 20:57)
 

Т.е. если заменить
<?php
  
if($param == "SETNICK")
?>

на
<?php
 
if(substr($_GET['param1'],0,7) == "SETNICK")
?>

Всё будет правильно, или проблема в другом?

   
 
 автор: sedek   (14.11.2004 в 21:42)   письмо автору
 
   для: cheops   (14.11.2004 в 21:09)
 

да я уже исправил!
только там надо не 7 символов а 8 так как пробел тоже символ!
теперь проблема в другом!
как с этим быть?
else if($param == "DELETE" && $nick == "Xolod")
  {
    $fd = fopen($filename, "r");
    $bufer = fread($fd, filesize($filename));
    fclose($fd);
    // Удаляем из $bufer строку id=nick
    $bufer = preg_replace("|[\d]+ = $voc\n|", "", $bufer);
    // Записываем изменённое содержимое буфера в файл
    $fd = fopen($filename, "w");
    fwrite($fd, $bufer);
    fclose($fd);
    echo "Ник успешно удалён!".$menu[$rnd];
    exit();
  }

и как сделать чтоб команда не важна в каком регистре была?
типа этого if(preg_match("|^Offline$|i", $_GET['param1']))

   
 
 автор: cheops   (14.11.2004 в 22:08)   письмо автору
 
   для: sedek   (14.11.2004 в 21:42)
 

Так прямо и заменяйте как пишете:
<?php
else if(preg_match("|^DELETE $|i"substr($param,0,8)) && preg_match("|^Xolod$|i"$nick )) 
  { 
    
$fd fopen($filename"r"); 
    
$bufer fread($fdfilesize($filename)); 
    
fclose($fd); 
    
// Удаляем из $bufer строку id=nick 
    
$bufer preg_replace("|[\d]+ = $voc\n|"""$bufer); 
    
// Записываем изменённое содержимое буфера в файл 
    
$fd fopen($filename"w"); 
    
fwrite($fd$bufer); 
    
fclose($fd); 
    echo 
"Ник успешно удалён!".$menu[$rnd]; 
    exit(); 
  }
?>

   
 
 автор: sedek   (16.11.2004 в 00:46)   письмо автору
 
   для: cheops   (14.11.2004 в 22:08)
 

Почемуто у меня эта команда не работает сообщение о том что удалён выводит а из файла не удаляет!
substr($voc,8)
не пойму как поставить!

   
 
 автор: cheops   (16.11.2004 в 01:56)   письмо автору
 
   для: sedek   (16.11.2004 в 00:46)
 

Хм... но ведь в строке "DELETE " - только 7 символов... попробуйте в этом блоке семёрки на восьмерки заменить. Или вообще обработать $voc при помощи регулярного выражения - следующий код удаляет из $voc любую команду вначале параметра и пробел следующий за ней
<?php
    $voc 
preg_replace("|^[^ ] |"""$voc);
?>

В этом случае можно избежать во-первых ошибок связанных с подсчётом числа параметров, во-вторых обрабатывать $voc сразу для всех блоков. К тому же вы говорили в $voc - перевод, чёрт знает как они переводят - может там и число символов другое....

   
 
 автор: sedek   (16.11.2004 в 10:15)   письмо автору
 
   для: cheops   (16.11.2004 в 01:56)
 

Толи я чтото не так делаю толи дело в другом?
Всёравно сообщение о том что удалён выводит а удалять не удаляет!
<?
else if(preg_match("|^delete $|i"substr($param,0,7)) && preg_match("|^Xolod$|i"$nick))
  {
    
$fd fopen($filename"r");
    
$bufer fread($fdfilesize($filename));
    
fclose($fd);
    
$voc preg_replace("|^[^ ] |"""$voc);
    
$bufer preg_replace("|[\d]+ = $voc\n|"""$bufer);
    
$fd fopen($filename"w");
    
fwrite($fd$bufer);
    
fclose($fd);
    echo 
"Ник успешно удалён!".$menu[$rnd];
    exit();
  }
?>

   
 
 автор: cheops   (16.11.2004 в 10:44)   письмо автору
 
   для: sedek   (16.11.2004 в 10:15)
 

Ага, это я вчера в регулярном выражении ошибся - решил, что простое и можно не проверять :))) Вместо
<?php
    $voc 
preg_replace("|^[^ ] |"""$voc); 
?>

которое удаляет только один символ и следующий за ним пробел, следует писать
<?php
    $voc 
preg_replace("|^[^ ]+ |"""$voc); 
?>

которое уничтожит один или большее число символов и следующий за ним пробел.

   
 
 автор: sedek   (16.11.2004 в 11:34)   письмо автору
 
   для: cheops   (16.11.2004 в 10:44)
 

тоже самое!
Во вложении весь код!

   
 
 автор: cheops   (16.11.2004 в 11:58)   письмо автору
 
   для: sedek   (16.11.2004 в 11:34)
 

Хм... следует после удаления первого символа посмотреть что осталось в $voc
<?php
  $voc 
preg_replace("|^[^ ]+ |"""$voc);
  echo 
$voc."\n";

Обращая внимание на все пробелы - просто посмотреть исходный текст страницы (Opera кажется wap понимает - просмотр исходного текста Alt+F3, хотя в принципе этого наверное не нужно - у нас же text/plain).

   
 
 автор: sedek   (16.11.2004 в 13:23)   письмо автору
 
   для: cheops   (16.11.2004 в 11:58)
 

Пишу delete X
приходит
X
Ник успешно удалён!
а в файле
DFH3J4 = xolod
LK2RD = X

   
 
 автор: cheops   (16.11.2004 в 22:02)   письмо автору
 
   для: sedek   (16.11.2004 в 13:23)
 

ёклмн, так у нас id не цифры а набор цифр и букв!?

   
 
 автор: cheops   (16.11.2004 в 22:33)   письмо автору
 
   для: sedek   (16.11.2004 в 13:23)
 

Тогда все [\d] следует заменить на [\S].

   
 
 автор: sedek   (17.11.2004 в 11:12)   письмо автору
 
   для: cheops   (16.11.2004 в 22:33)
 

Я уж устал!
всёравно также!

<?
if(preg_match("|^delete$|i"substr($param,0,6)) && preg_match("|^Xolod$|i"$nick))
  {
    
$fd fopen($filename"r");
    
$bufer fread($fdfilesize($filename));
    
fclose($fd);
    
$voc preg_replace("|^[^ ] |"""$voc);
    
$bufer preg_replace("|[\S]+ = $voc\n|"""$bufer);
    
$fd fopen($filename"w");
    
fwrite($fd$bufer);
    
fclose($fd);
    echo 
"CHAT.$master> Ник успешно удалён!".$menu[$rnd];
    exit();
  }
?>


http://softtime.ru/forum/read.php?id_forum=1&id_theme=803&page=1

   
 
 автор: cheops   (17.11.2004 в 22:59)   письмо автору
 
   для: sedek   (17.11.2004 в 11:12)
 

Думаю мученья подходят к концу :)))
В этом скрипте опять нет + в строке
<?php
  $voc 
preg_replace("|^[^ ] |"""$voc); 
?>

Нужно заменить на
<?php
  $voc 
preg_replace("|^[^ ]+ |"""$voc); 
?>

   
 
 автор: cheops   (14.11.2004 в 12:58)   письмо автору
 
   для: sedek   (13.11.2004 в 14:57)
 

Не очень понятно с именами файлов, в которые производится запись... в скрипте, который прикреплён в attach имеется id = nick пишется в файл text.txt, при этом список id находится в переменной $list_id, а текущий ник в $current_nick....

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования