| |
|
|
| | Как можно изменить часть строки? Например, в файле 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; можно ли зная только одну переменную внести изменения в количество голосов, то есть в последнюю часть строки? И как это можно осуществить? | |
| |
|
|
| |
|
|
| |
для: FiX
(20.10.2005 в 17:07)
| | | Сделать-то легко, только вот обидно, что такая незатейливая операция будет жрать очень много ресурсов, если кол-во строк в вашем файле перевалит эдак за 500-1000... А нет ли возможности использовать базу данных (MySQL) ? | |
| |
|
|
| |
|
|
| |
для: 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);
}
?>
|
Эта своеобразная система голосования. Здесь имеется функция запрета повторного голосования... Посмотрите, пожалуйста, нет ли здесь каких-либо недочетов? У меня все работает, но, может, я чего-то не учел, и скрипт может сломаться... Если есть, пожалуйста, скажите :) | |
| |
|
|
| |
|
|
| |
для: FiX
(20.10.2005 в 18:45)
| | | Проверять, голосовал ли юзер уже или нет по IP почти бессмысленно, ибо у многих динамический IP... обычно это делается при помощи Куки... | |
| |
|
|
| |
|
|
| |
для: DDK
(20.10.2005 в 19:01)
| | | Ну да, но и в этом случае тоже бессмысленно делать запреты - стер все куки и все... И все старания бесмыслены... Хотя надо сделать, не помешает. А может есть способ, чтобы куки не стирались ?! | |
| |
|
|
| |
|
|
| |
для: FiX
(20.10.2005 в 20:14)
| | | нет, ну это вы уже загнули... Динамический IP встречается примерно у каждого второго юзера, а вот куки может догадаться стереть максимум каждый 50-й... Да, 100% системы бана нет, но в комплексе можно достичь до 90% КПД... | |
| |
|
|
| |
|
|
| |
для: 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...
Ну, это я замудрил, надеюсь, поняли =) | |
| |
|
|
| |
|
|
| |
для: 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
|
Третий столбец с конца? | |
| |
|
|
| |
|
|
| |
для: cheops
(21.10.2005 в 12:58)
| | | В данном пример $id = это после ссылки на фотку (1). Да, третий...
19-10-2005|^^|Familiya_Imya.jpg|^^|1|^^|0
Но фактически в моем скрипте он находится намного дальше, т.е. под номером 9... Думаю, это не имеет значения, т.к. если вытаскивать $id - то, думаю, с помощью массивов, например, $name[3]... | |
| |
|
|
| |
|
|
| |
для: FiX
(21.10.2005 в 17:02)
| | | Можно разбить строку функцией explode(). Вы получите массив и обратившись к нужному элементу массива получите id | |
| |
|
|
| |
|
|
| |
для: PantiL
(22.10.2005 в 00:37)
| | | Ну, это ясно :)
А вот имено как? Я уже пробовал, ведь не получилось:( | |
| |
|
|
| |
|
|
| |
для: 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 изменил его и поставил обратно... может это и не надо вам, но работает | |
| |
|
|
| |
|
|
| |
для: PantiL
(22.10.2005 в 16:35)
| | | Спасибо! Можно ещё вопрос, если $stroka - это массив, т.е. в файле у меня несколько строк с похожей структурой. От этого ничего не изменится? :) | |
| |
|
|