Почему скрипт неверно заносит информацию в 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'");
        }
    }
}
  • Вопрос задан
  • 2547 просмотров
Решения вопроса 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.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы