Задать вопрос

Почему скрипт неверно заносит информацию в DB?

Здравствуйте,

Написал счетчик для уникальных посетителей за день по utm, но он заносит заносит в базу неверную информацию, т.е. по ссылкам пришло 566 пользователей, а базу занеслось 61, остальные ушли в незарегистрированные. В чем проблема? Может, ошибка в проверке даты?
$cookie_days      = 30;
$cookie_timestamp = strtotime('+' . $cookie_days . ' days');
if (isset($_GET['ref']) && !empty($_GET['ref'])) {
    setcookie('utm_source', $_GET['ref'], $cookie_timestamp, '/');
    setcookie('ref', $_GET['ref'], $cookie_timestamp, '/');
    setcookie('userh', '', time()-3600);
    header('Location: /');
}
if (isset($_GET['utm_source']) && !empty($_GET['utm_source'])) {
    setcookie('utm_source', $_GET['utm_source'], $cookie_timestamp, '/');
    setcookie('ref', $_GET['utm_source'], $cookie_timestamp, '/');
    setcookie('userh', '', time()-3600);
    header('Location: /');
}


if (!isset($_COOKIE['userh'])) {
    
    setcookie('userh', 'cxv', time() + 86400);
    if (isset($_COOKIE['utm_source'])) {
        $ress = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) as total FROM `utm_counter` WHERE  `fromutm` ='" . $_COOKIE['utm_source']."' AND `datetime` = CURDATE()"));
        if ($ress['total'] == '0') {
            mysql_query("INSERT INTO `utm_counter` (`count`,`fromutm`,datetime) VALUES ('1','" . $_COOKIE['utm_source'] . "',CURDATE())");
        } else {
            $counter  = mysql_fetch_assoc(mysql_query("SELECT count as total FROM `utm_counter` WHERE  `fromutm` ='" . $_COOKIE['utm_source']."' AND `datetime` = CURDATE()"));
            $counters = $counter['total'] + 1;
            mysql_query("UPDATE `utm_counter` SET `count`=" . $counters . " WHERE  `fromutm` ='" . $_COOKIE['utm_source']."' AND `datetime` = CURDATE()");
        }
    } else {
        $ress = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) as total FROM `utm_counter` WHERE `datetime` >= CURDATE() AND `fromutm` = 'without utm'"));
        if ($ress['total'] == '0') {
            mysql_query("INSERT INTO `utm_counter` (`count`,`fromutm`,datetime) VALUES ('1','without utm',CURDATE())");
        } else {
            $counter  = mysql_fetch_assoc(mysql_query("SELECT count as total FROM `utm_counter` WHERE `datetime` >= CURDATE() AND `fromutm` = 'without utm'"));
            $counters = $counter['total'] + 1;
            mysql_query("UPDATE `utm_counter` SET `count`=" . $counters . " WHERE `datetime` >= CURDATE() AND `fromutm` ='without utm'");
        }
    }
}
  • Вопрос задан
  • 2548 просмотров
Подписаться 3 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Начнем с того, что если я помещу в куку свое значение, возможна sql injection. mysql_real_escape_string в помощь. Да и в целом, я думал уже все на PDO перешли ( курим php.net/PDO ).

select -> increment -> update ни разу не атомарны. Что мешает использовать build-in функционал ^
update `table` set `field` = field + 1

Далее, в данном случае можно легко избавиться от избыточной вложенности условий, путем определения переменной, хранящей куку utm_source.

$utm_source = isset($_COOKIE['utm_source']) ? $_COOKIE['utm_source'] : 'without utm';
// я бы тут "without utm" заменил на NULL, конечно


Потом, select -> if == 0 -> insert else update - это говнокод. Зачем этот лишний запрос? Юзать INSERT ON DUPLICATE KEY UPDATE.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽