(PHP) хранение IP-адреса кликов - PullRequest
0 голосов
/ 05 октября 2018

После почти 3-х дней поиска и устранения неисправностей я должен попросить совета.

У меня есть маленькая доска с изображениями с 4 изображениями и 4 кнопками «как».Ранее я сделал так, чтобы количество нажатий каждой кнопки сохранялось в .txt файле.Теперь мне нужно сделать так, чтобы человек мог нажать определенную кнопку только один раз .

Это ip.txt.Число слева - это идентификатор кнопки, справа - IP-адрес человека, который нажал эту кнопку.

click-001||127.0.0.1
click-002||

Это очень просто.Мне нужно убедиться, что он сохраняет ip, когда я нажимаю на моем компьютере, затем сохраняет другой IP, когда я нажимаю на своем планшете - и останавливает , что бы я ни делал дальше.Теперь в течение последних нескольких дней он делал что-нибудь кроме этого!

Мой текущий код с isset.Это видит первый IP, но не добавляет второй:

$file2 = 'ip.txt'; // path to text file that stores counts
$fh2 = fopen($file2, 'r+');
$ip_addr = $_SERVER['REMOTE_ADDR'];
$lines2 = '';
while(!feof($fh2)) {
    $line2 = trim(fgets($fh2));
    if ($line2) {
        $line2 = explode('||', $line2);
        if(isset($line2[0], $line2[1])) {
            $item2 = trim($line2[0]);
            if(!empty($item2)) {
                if($item2 == $id) { 
                    if(empty($line2[1])) {
                        $lines2 .= "$item2||$ip_addr\r\n";
                        file_put_contents($file2, $lines2);
                    } else {
                        // this is where it always fails
                        if (!isset($ip_addr)) {                             $ip_all = $line2[1] . " " . $ip_addr;
                            $lines2 .= "$item2||$ip_all\r\n";
                            file_put_contents($file2, $lines2); 
                        } else {
                            echo "lul"; 
                        }
                    } 
                } 
            }
        }
    }
}
fclose($fh2);

Я также попробовал это с функцией in_array:

$ip_all = array($line2[1]); 
    if (!in_array($ip_addr, $ip_all)) {
        array_push($ip_all, ',' , $ip_addr);            
        $ip_fin = implode($ip_all);
        $lines2 .= "$item2||$ip_fin\r\n";
        file_put_contents($file2, $lines2); 

^ Этот также видит первый IP и добавляет второе , но затем не может определить, существует ли уже IP-адрес, и просто продолжает добавлять копии, когда я нажимаю.

Это жестоко.Что я делаю не так и есть ли более простой способ?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Используйте базу данных MySQL для этого.
Использование текстового файла супер неэффективно и может привести к конфликтам, когда нескольким пользователям нравится одновременно!

Вставьте IP-адрес в базу данных каждый раз, когда пользователь нажимает кнопку «Нравится», а затем используйте запрос выбора, чтобы определить, понравился ли этот IP-адрес изображению ранее.

Я не рекомендую использовать только IP-адреса, хотя некоторые интернет-провайдеры предоставляют динамический IP-адрес, который меняет IP-адрес (публичный IP-адрес) каждые несколько секунд.
Использование файлов cookie для хранения уникального файла cookie для пользователя (если онне авторизован) или просто попросите пользователя войти в систему, прежде чем голосовать!

Информация о MySQL Insert и Select везде в Google.
Вот один из них: https://www.w3schools.com/sql/

0 голосов
/ 05 октября 2018

лучший метод: использовать базу данных или использовать XML (XML имеет очень полезную библиотеку)


метод текстового файла:

получить файл и отредактировать ...

$id = "...";
$ip="...";
$file2 = file('ip.txt'); 


$file2 = array_map(
  function($current_line) use ($id,$ip) {
    $current_line = explode('||', $current_line);
    if($current_line[0] == $id){
        $current_line[]=$ip;
    }
    return join("||",$current_line);
  },$file2
);

file_put_contents('ip.txt', implode('\n', $file2));
...