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

Форум PHP

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

 

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

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

тема: Как изменить часть строки?
 
 автор: FiX   (20.10.2005 в 17:07)   письмо автору
 
 

Как можно изменить часть строки? Например, в файле data.dat имеются следующие записи:

19-10-2005|^^|Familiya_Imya.jpg|^^|1|^^|0
19-10-2005|^^|Familiya_Imya.jpg|^^|2|^^|0
19-10-2005|^^|Familiya_Imya.jpg|^^|3|^^|0

То, что в начале, неважно; последние две переменные = это $id и число голосов соответственно. Через ссылку передается $id; можно ли зная только одну переменную внести изменения в количество голосов, то есть в последнюю часть строки? И как это можно осуществить?

   
 
 автор: DDK   (20.10.2005 в 18:37)   письмо автору
 
   для: FiX   (20.10.2005 в 17:07)
 

Сделать-то легко, только вот обидно, что такая незатейливая операция будет жрать очень много ресурсов, если кол-во строк в вашем файле перевалит эдак за 500-1000... А нет ли возможности использовать базу данных (MySQL) ?

   
 
 автор: FiX   (20.10.2005 в 18:45)   письмо автору
 
   для: DDK   (20.10.2005 в 18:37)
 

Возможности использовать MySQL есть, только я пока не умею программировать для этого :). В данный момент после долгих непрерывных мучений все-таки написал скрипт, вот он:

<?php
$id
--;  // уменьшаем передаваемый id на один
$delfile "data.dat";
$ipfile "ip.dat";
$op fopen($ipfile,"a");
$thisip $REMOTE_ADDR;
$iparr file($ipfile);
$ipstr join("",$iparr);  // объединяем массив в одну строку
if (ereg("$thisip",$ipstr)) {  // если такой ip уже имеется
print "<center><b>Вы уже голосовали! Повторное голосование не допускается!";
print 
"<META HTTP-EQUIV='Refresh' CONTENT='3; URL=\"../konk.php\"'>"; }
else {
$file=file($delfile);
$fp=fopen($delfile,"w");
for(
$i=0;$i<sizeof($file);$i++)
{
if(
$i==$id)
{
$workstr $file[$i];
$workstr explode("|^^|",$workstr);
$last $workstr[10];
$newpoll $last+1;
$file[$i] = "$workstr[0]|^^|$workstr[1]|^^|$workstr[2]|^^|$workstr[3]|^^|$workstr[4]|^^|$workstr[5]|^^|$workstr[6]|^^|$workstr[7]|^^|$workstr[8]|^^|$workstr[9]|^^|$newpoll \n"// последние две переменные - это id и новое число голосов
$puttext "$thisip\n";
fputs($op,$puttext);
fclose($op);
print 
"<center><b>Спасибо, Ваш голос принят!</b><br><Br><img src=\"$workstr[1]\" style=\"border:1px solid;border-color:#000000\"><br>";
print 
"<b>$workstr[2] $workstr[3]</b><bR>Возраст: $workstr[5]<br><b>Количество голосов: $newpoll</b>";
print 
"<META HTTP-EQUIV='Refresh' CONTENT='3; URL=\"../konk.php\"'>";
}
 }
fputs($fp,implode("",$file));
fclose($fp);
}
?>

Эта своеобразная система голосования. Здесь имеется функция запрета повторного голосования... Посмотрите, пожалуйста, нет ли здесь каких-либо недочетов? У меня все работает, но, может, я чего-то не учел, и скрипт может сломаться... Если есть, пожалуйста, скажите :)

   
 
 автор: DDK   (20.10.2005 в 19:01)   письмо автору
 
   для: FiX   (20.10.2005 в 18:45)
 

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

   
 
 автор: FiX   (20.10.2005 в 20:14)   письмо автору
 
   для: DDK   (20.10.2005 в 19:01)
 

Ну да, но и в этом случае тоже бессмысленно делать запреты - стер все куки и все... И все старания бесмыслены... Хотя надо сделать, не помешает. А может есть способ, чтобы куки не стирались ?!

   
 
 автор: DDK   (20.10.2005 в 20:20)   письмо автору
 
   для: FiX   (20.10.2005 в 20:14)
 

нет, ну это вы уже загнули... Динамический IP встречается примерно у каждого второго юзера, а вот куки может догадаться стереть максимум каждый 50-й... Да, 100% системы бана нет, но в комплексе можно достичь до 90% КПД...

   
 
 автор: FiX   (20.10.2005 в 23:13)   письмо автору
 
   для: DDK   (20.10.2005 в 20:20)
 

Ладно, лично я стираю куки, когда надо =)
Кстати, вот нашлась ошибочка в скрипте:

if($i==$id)
{
$workstr = $file[$i];
$workstr = explode("|^^|",$workstr);
и т.д. и т.п.

Оказывается, программа проверяет номера строк, а не $id, как я надеялся... Ошибка появилась тогда, когда я удалил строку с файла. Фактически строк в файле оставалось 6, а последний $id = 7. Вот и при головании за последнюю фотку ($id=7)выходит пустая страница, потому что такой строки нет... Вот и вся моя радость изчезла :(
И все же, как сделать так, чтобы скрипт искал строку для голосования именно по $id?
Если же это сложно, то второй вопрос: как сделать так, чтобы при удалении любой строки все $id переписывались по порядку, например, удалив строку №3, значения $id принимали новое значение. То есть фактически остается так: 1, 2, 4. А надо, чтобы стало вот как: 1, 2, 3...
Ну, это я замудрил, надеюсь, поняли =)

   
 
 автор: cheops   (21.10.2005 в 12:58)   письмо автору
 
   для: FiX   (20.10.2005 в 23:13)
 

А где id в файле?
19-10-2005|^^|Familiya_Imya.jpg|^^|1|^^|0 
19-10-2005|^^|Familiya_Imya.jpg|^^|2|^^|0 
19-10-2005|^^|Familiya_Imya.jpg|^^|3|^^|0

Третий столбец с конца?

   
 
 автор: FiX   (21.10.2005 в 17:02)   письмо автору
 
   для: cheops   (21.10.2005 в 12:58)
 

В данном пример $id = это после ссылки на фотку (1). Да, третий...
19-10-2005|^^|Familiya_Imya.jpg|^^|1|^^|0
Но фактически в моем скрипте он находится намного дальше, т.е. под номером 9... Думаю, это не имеет значения, т.к. если вытаскивать $id - то, думаю, с помощью массивов, например, $name[3]...

   
 
 автор: PantiL   (22.10.2005 в 00:37)   письмо автору
 
   для: FiX   (21.10.2005 в 17:02)
 

Можно разбить строку функцией explode(). Вы получите массив и обратившись к нужному элементу массива получите id

   
 
 автор: FiX   (22.10.2005 в 12:22)   письмо автору
 
   для: PantiL   (22.10.2005 в 00:37)
 

Ну, это ясно :)
А вот имено как? Я уже пробовал, ведь не получилось:(

   
 
 автор: PantiL   (22.10.2005 в 16:35)   письмо автору
 
   для: FiX   (22.10.2005 в 12:22)
 

<?php
$stroka 
"1bla|^^|2bla|^^|3bla|^^|4bla|^^|5bla|^^|6bla|^^|id|^^|8bla|^^|9bla|^^|10bla";
$arr explode("|^^|"$stroka);
$arr[6] = "new_id";
$post_stroka implode("|^^|"$arr);
echo 
$post_stroka;
?>

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

   
 
 автор: FiX   (24.10.2005 в 13:42)   письмо автору
 
   для: PantiL   (22.10.2005 в 16:35)
 

Спасибо! Можно ещё вопрос, если $stroka - это массив, т.е. в файле у меня несколько строк с похожей структурой. От этого ничего не изменится? :)

   
Rambler's Top100
вверх

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