НЕ добовляются данные о посетителе php

128
29 октября 2019, 01:30

Проблема в том что в базу данных не добавляются данные о посетителе. По скольку я тестирую это на локальном сервере должно выводится стандартное ip и время но их нет

if ( $connection == false ) {
    echo 'Произошла ошибка подключения к базе данных пожалуйста обратитесь по номеру +7(963)132-28-69';
    mysqli_connect_error();
    die();
}  
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$date2 = date("H") + 2;
$date = date("Y-m-d-$date2-i-s");
$all_ip = mysqli_query($connection, "SELECT 'ip' from 'counter' WHERE 'ip' = '$visitor_ip' ");

if ($all_ip){
    echo '1';
    mysqli_query($connection, " UPDATE 'counter' SET 'view_values' = 'view_values' + 1 WHERE 'IP' = '$visitor_ip' " );
} else {
    mysqli_query($connection, "INSERT INTO 'counter'('ip','date') VALUES ('".$visitor_ip."','".$date."')" );
    echo '2';
};
Answer 1

В коде множество проблемных мест:

  1. К времени добавляется 2 часа, только к часу. Значит в 23 часа станет 25 часов.
  2. В запросах имена колонок и таблиц в одинарных кавычках. MySQL такого не пропустит.
  3. Нет обработки ошибок SQL из за этого невозможно понять, что идет не так.
  4. Счетчик может не попасть в БД если в это время другая сессия будет работать с тем же ip. Возможна ситуация, что другой запрос сделает insert после того как вы select определили, что записи еще нет, но до вставки. (состояние гонки).
  5. mysqli_query возвращает объект "запрос", а не данные, полученные запросом и для if он будет true вне зависимости от того, есть запись в БД или нет. Он будет false только если была синтаксическая ошибка в запросе.

Предлагаю сделать на таблице counter уникальный индекс на колонке ip, если его еще нет. После этого, с учетом всего вышесказанного, скрипт можно будет переписать так:

if ( $connection == false ) {
    echo 'Произошла ошибка подключения к базе данных пожалуйста обратитесь по номеру +7(963)132-28-69';
    mysqli_connect_error();
    die();
}  
$visitor_ip = $_SERVER['REMOTE_ADDR'];
if( ! $connection->query("INSERT INTO counter(ip,date) VALUES ('$visitor_ip', now()+interval 2 hour) ON DUPLICATE KEY UPDATE view_values=view_values+1") {
    printf("Ошибка выполнения SQL запроса: %s\n", $connection->error);
}

Конечно это то же далеко от идеала. В приложении желательно иметь свой слой для работы с БД, который например будет передавать все параметры во все запросы в виде плейсхоледеров и привязки значений, вместо прямой подстановки. В данном случае код безопасен, поскольку переменная $_SERVER['REMOTE_ADDR'] получена от web сервера, а не от клиента и мы можем быть уверены, что в ней находится ip и он не содержит кавычек. Но лучше всегда использовать prepare и bind_param. Кроме того в приложении очень желательна централизованная обработка ошибок в виде исключений, а не написание соответствующего кода в каждой второй строке. Тогда будет сложно забыть обработать ошибку и в итоге не узнать, что с запросами что то не так.

P.S. Возможно у вашего MySQL сервера нет таких проблем с настройками, как у php, и два часа добавлять к now() не надо.

READ ALSO
htaccess в яндекс метрике или как открыть sitemap.xml

htaccess в яндекс метрике или как открыть sitemap.xml

Я сегодня столкнулся с камнем, который мешает продолжить моей работе

120
Адрес отправителя в функции php mail

Адрес отправителя в функции php mail

Как можно поменять адрес отправителя в команде mail в php? Был выставлен

152
запись многомерного массива циклом в БД sql

запись многомерного массива циклом в БД sql

Не могу понять, почему не записывает в БД

141
Не работает адрес сайта

Не работает адрес сайта

Я развернул сайт по адресу но зайти на него не получается, попасть можно на сайт только если в строке запроса поставлю два слеша вот так shihzamanappcom//

139