2013-12-03 4 views
0

Я пытаюсь создать уникальный счетчик попадания. Я «заимствовал» некоторый код из Интернета, но просто не мог заставить его работать. (Кстати, я самоучитель новичка.) Даже с помощью людей здесь я не мог заставить его работать. Поэтому я начал с нуля писать свой собственный код, переучивая заявления «f». Теперь у меня есть это, чтобы он считывал все IP-адреса в текстовом файле и сравнивал их с пользователями ip и выходил из цикла, если он уже был введен.Ошибки при попытке fwrite в текстовый файл

Теперь я пытаюсь открыть файл count, прочитать одну запись, увеличить ее на единицу и записать ее обратно в файл. Но это просто не сработает. Я нашел здесь еще несколько сообщений и попробовал, что они предложили, как команду «cmod» и все возможные номера, но ничего. Затем я нашел, как включить отчет об ошибках. (Что-то предлагалось раньше, но я не знал, как это сделать.) Теперь я получаю кучу ошибок, и я думаю, что на сервере есть что-то, что не позволяет мне писать в файлы. Вот код, который я использую, только для части приращения:

// прочитайте содержимое count.txt $ count_file = "count.txt";

ini_set('display_errors', 'On'); 
    error_reporting(E_ALL); 

$handle = fopen($count_file, "r"); 
$old_count=fgets($handle); 

    echo "Old count = " . $old_count . "<br><br>"; 

fclose($handle); 

// записываем содержимое count.txt

chmod($count_file, 0777); 
$fp = fopen($count_file, 'ab'); 
if (false === $fp) { 
throw new RuntimeException('Unable to open log file for writing'); 
} 

$handle = fopen($count_file, "w"); 
$new_count = $old_count +1; 

    echo "New count = " . $new_count; 


fwrite($handle, $new_count); 
fclose($handle); 

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

Warning: chmod() [function.chmod]: Operation not permitted in /home/users/tecitout/counter/fullarray1.php on line 50

Warning: fopen(count.txt) [function.fopen]: failed to open stream: Permission denied in /home/users/tecitout/counter/fullarray1.php on line 51

Fatal error: Uncaught exception 'RuntimeException' with message 'Unable to open log file for writing' in /home/users/tecitout/counter/fullarray1.php:53 Stack trace: #0 {main} thrown in /home/users/tecitout/counter/fullarray1.php on line 53

Я действительно не понимаю ошибок. Это проблема с сервером моего приятеля, или я так плохо умею писать код. Я ценю помощь.

+0

Просто вопрос с разрешениями.Сервер вашего собеседника не дает вам прав на изменение этого файла. – jszobody

+0

Спасибо @jszobody. Если я могу спросить, это что-то в его файле php.ini или глубже в настройках сервера? Это общий сервер с другой компанией, с которой он работает, но другой парень контролирует сервер. Благодарю. –

+0

Скорее всего, это разрешения файловой системы Linux, не позволяющие процессу доступа Apache к этому файлу или папке. Где '$ count_file' находится на сервере? Возможно, вы сможете вставить его где-нибудь в другом месте, где вы можете писать. – jszobody

ответ

1

Если вы хотите записать в файл, вы должны иметь пишите права на него. Кроме того, для chmod файла вам необходимо либо его зарегистрировать, либо войти в систему под именем root.

Так что ваши сообщения об ошибках, в порядке:

Warning: chmod() [function.chmod]: Operation not permitted in /home/users/tecitout/counter/fullarray1.php on line 50 

соответствует chmod($count_file, 0777);. Казалось бы, пользователь, которому работает php, не владеет файлом.

Warning: fopen(count.txt) [function.fopen]: failed to open stream: Permission denied in /home/users/tecitout/counter/fullarray1.php on line 51 

Это соответствует $fp = fopen($count_file, 'ab'); и означает, что файл не доступен для записи, потому что CHMOD не работает.

Fatal error: Uncaught exception 'RuntimeException' with message 'Unable to open log file for writing' in /home/users/tecitout/counter/fullarray1.php:53 Stack trace: #0 {main} thrown in /home/users/tecitout/counter/fullarray1.php on line 53 

из-за if (false === $fp) и, как ожидается, с учетом приведенных выше.

+0

Том, большое спасибо за объяснение кодов ошибок. У меня «есть» идея, но ваше сжатое описание дает мне гораздо лучшую картину. Вы и @jszobody выше говорят мне одно и то же, и это у меня нет разрешений. Я арендовал веб-пространство для себя, поэтому я думаю, что попробую код там и посмотреть, работает ли он. –

+0

Рад, что я мог бы помочь! –

0

Удалить count.txt и до тех пор, как веб-сервер имеет права на запись в каталог, где вы хотите поместить count.txt, просто сделать это:

$c = 0; 
$count_file = 'count.txt'; 

if(file_exists($count_file)) { 
    $c = (int)file_get_contents($count_file); 
    echo "Old count = $c<br><br>"; 
} 
file_put_contents($count_file, $c++); 
echo "New count = $c<br><br>"; 
+0

Я в восторге от вашего кода. Разговор о аккуратном и лаконичном. Надеюсь, что когда-нибудь я смогу сделать 1/10 этого хорошего. К сожалению, это тоже не сработает. Он увеличивает, но не записывает файл. Я думаю, что jszobody выше, и Том Макдональд внизу ударил ноготь по голове. Если мой приятель не получит мне разрешения, у нас не будет уникального счетчика хитов на его сайте. Благодарю. –

0

Джентльмен, спасибо за вашу помощь. Я скопировал все файлы на веб-пространство, которое я арендую, и нашел успех. К сожалению, впечатляющий код, предлагаемый AbraCadaver, читал и увеличивал число в файле, но он не писал новый номер или не дал мне никаких ошибок. Однако плохо написанный код, который я написал выше, фактически работает на моем сервере. Вся проблема была на самом деле разрешениями на сервере. По крайней мере, я получил помощь, прежде чем вытащил все мои волосы!

Смежные вопросы