Что не так в этом коде?

  • Автор темы ArsenT1
  • 99
  • Обновлено
  • 13, May 2024
  • #1
Здравствуйте друзья, Я пытаюсь создать простой уникальный счетчик посещений с IP-адресом и файлом .txt.

но почему-то этот код не работает.

я использую сервер Wamp для проверки кода это мой count.php
 <?php
//hit counter
include "count.php";

hit_count();

?>
PHP: и это мой index.php
 <?php function hit_count(){ $ip_address =$_SERVER["REMOTE_ADDR"]; $ip_file = file("ip.txt"); foreach($ip_file as $ip){ $ip_single = trim($ip); if($ip_address == $ip_single){ $found = true; break; }else{ $found = false; } } if($found==false){ $filename="count.txt"; $handle = fopen($filname,"r"); $current =fread($handle,filesize($filename)); //echo $current; fclose($handle); $current_inc = $current+1; $handle = fopen($filname,"w"); fwrite($handle,$current_inc); fclose($handle); $handle = fopen("ip.txt","a"); fwrite($handle,$ip_address . "\n"); fclose($handle); } } ?>
PHP: у меня есть файл ip.txt (это пусто) и файл count.txt (значение установлено равным 0) на сервере. но когда я обновляю страницу..счетчик не учитывает посещения страниц.. Любые идеи?

ArsenT1


Рег
22 Mar, 2013

Тем
1

Постов
1

Баллов
11
  • 22, May 2024
  • #2
Большая часть программирования — это умение отлаживать. Добавьте туда несколько команд var_export(), чтобы посмотреть, какие переменные имеют. Сообщите нам, какие строки не делают то, что вы ожидаете, и опишите ваши ожидания в сравнении с тем, что делает ваш код.
 

MrPuzo


Рег
16 Dec, 2013

Тем
0

Постов
2

Баллов
2
  • 29, May 2024
  • #3
Начнем с мелочей
  • используйте filter_input(INPUT_SERVER, 'REMOTE_ADDR'), чтобы получить IP-адрес
  • в строке 19 у вас опечатка - вы называете $filename $filname
    $filename="count.txt";
    $handle = fopen($filname,"r");
  • Кажется, что обработка файлов не работает, слишком много открытий и ненужное закрытие.


Затем есть содержимое count.txt. Я не уверен, что, по вашему мнению, вы записываете - буквально просто количество просмотров?
 

Giorgi Kiskeidze


Рег
23 May, 2012

Тем
0

Постов
3

Баллов
3
  • 03, Jun 2024
  • #4
Я согласен, что лучше всего использовать базу данных. Однако я бы не рассматривал IP-адрес как конфиденциальную информацию. IP-адрес человека можно увидеть в любом журнале сервера... Для этой цели подойдет плоский файл, если он не станет слишком большим. База данных кажется немного излишней
 

Lyn41rus


Рег
15 Feb, 2015

Тем
0

Постов
3

Баллов
3
  • 05, Jun 2024
  • #5
спасибо, но это все равно не работает вот модифицированный код
 <?php

function hit_count(){

$ip_address =filter_input(INPUT_SERVER, "REMOTE_ADDR");

$ip_file = file("ip.txt");

foreach($ip_file as $ip){

$ip_single = trim($ip);

if($ip_address == $ip_single){

$found = true;

break;

}else{

$found = false;

}

}

if($found==false){

$filename="count.txt";

$handle = fopen($filename,"r");

$current =fread($handle,filesize($filename));

//echo $current;

fclose($handle);

$current_inc = $current+1;

$handle = fopen($filname,"w");

fwrite($handle,$current_inc);

fclose($handle);

$handle = fopen("ip.txt","a");

fwrite($handle,$ip_address . "\n");

fclose($handle);

}

}

?>
PHP: я все еще изучаю PHP..так что это всего лишь учебник
 

kazakhkyzy


Рег
01 Jan, 2011

Тем
0

Постов
3

Баллов
3
  • 07, Jun 2024
  • #6
@РахулСаини Почему хранить IP в файле небезопасно? IP-адрес не имеет ничего чувствительного.

Это не пароль.

С этим кодом есть 2 проблемы.

1. Ваш файл count.txt вначале пуст, поэтому эта строка ничего не делает:

$current_inc = $current+1;

Для начала поместите число в файл count.txt, и проблема будет решена.

2. Вы допустили опечатку в этой строке:

$filename="count.txt";

$handle = fopen($filname,"r");

Изменить на:

$handle = fopen($filname,"r");

Вы написали «$filname». Это должно быть "$filename"

Сделайте это, и все должно сработать.

Наслаждаться! При кодировании на Wamp держите отчеты об ошибках включенными.

Он обнаружит множество ошибок, таких как опечатка $filename и т. д.
 

SwiT1


Рег
31 Dec, 2015

Тем
1

Постов
2

Баллов
12
  • 08, Jun 2024
  • #7
1) почему бы просто не вернуть истинное условие RETURN? Пропустил бы кучу лишнего хлама. Почему вы поневоле открываете и закрываете файлы и читаете их целиком? Зачем читать весь файл, если можно преждевременно отключиться?
 

<?php

function hitCount(){

$ipAddress =$_SERVER["REMOTE_ADDR"];

$handle = fopen('ip.txt', 'r+');

while ($line = fgets($handle)) {

if ($line == $ipAddress) {

fclose($handle);

return;

}

}

fputs($ipAddress . "\r\n");

fclose($handle);

$handle = fopen('count.txt', 'r+');

$current = fread($handle);

fseek($handle, 0);

fwrite($handle, $current++);

fclose($handle);

}

Код (разметка): непроверенный, возможно, в нем есть опечатки, но, скорее всего, вы пытаетесь сделать это в более компактной и эффективной форме.
 

cnv_wap


Рег
29 Aug, 2013

Тем
0

Постов
1

Баллов
1
  • 09, Jun 2024
  • #8
1) Проблема со строкой 21 — $current =fread($handle,filesize($filename)); Вы пытаетесь прочитать пустой файл, поэтому это не удается.

Я бы объединил строки 21,22 и 23 в $current = file_get_contents($filename); 2) Опечатка в строке 27 - $handle = fopen($filname,"w"); должно быть $handle = fopen($filename,"w"); Как только я внес вышеуказанные изменения, у меня все заработало.
 

magic-cash


Рег
02 Sep, 2011

Тем
0

Постов
2

Баллов
2
Тем
49554
Комментарии
57426
Опыт
552966