За последние 24 часа нас посетили 21365 программистов и 1665 роботов. Сейчас ищут 816 программистов ...

В процедуре непорядок: выборка идет без WHERE

Тема в разделе "MySQL", создана пользователем Kreker, 21 дек 2009.

  1. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Структура базы:
    [sql]`time` INT UNSIGNED NOT NULL,
    `ip` INT SIGNED NOT NULL,
    PRIMARY KEY (`ip`)[/sql]

    Делаю процедуру:
    [sql]DELIMITER $$
    CREATE PROCEDURE ipchecker(IN ip INT, OUT funcReturn INT)
    BEGIN
    DECLARE iptime, thistime INT;
    SET thistime = UNIX_TIMESTAMP();
    SELECT `time` INTO iptime FROM ip_table WHERE `ip`=ip;
    IF FOUND_ROWS( ) = 0 THEN
    INSERT INTO ip_table VALUES (thistime, ip);
    SET funcReturn = 1;
    ELSEIF (iptime <= (thistime-43200)) THEN
    UPDATE ip_table SET `time`=thistime WHERE `ip`=ip;
    SET funcReturn = 1;
    ELSE
    SET funcReturn = 0;
    END IF;
    END$$
    DELIMITER;[/sql]
    Смысл каков:
    Вызываю процедуру CALL ipchecker(IP, @checkresult). Если ip нет в базе, делается запись и возвращается 1 в @checkresult. Если запись есть и она старше 12 часов, обновляю и возвращаю 1 в @checkresult, в противном случае возвращаю 0 в @checkresult.

    Проблема в том, что после первой же записи возвращает всегда 0, вне зависимости от передаваемого IP.
    Проверил всю процедуру, уже три часа бьюсь не понимаю - ip проходит в процедуру разный, но выборка SELECT идет как будто без WHERE и в iptime подставляется первая же метка. Из-за этого FOUND_ROWS = 1. Из-за свежести первой метки, попадаем в последний логический блок.
    По отдельности (с изменением синтаксиса) запросы работают как нужно. А в процедуре - нет. В чем проблема?
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    ПИПЕЦ! Игор происходит из-за одинаковых названий столбцов и переменных. И это, несмотря на обратные кавычки.
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мне казалось что переменные в MySQL начинаются с @ - я ошибался?
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Есть разные переменные: пользовательские (@), системные (@@), процедурные (без @).