За последние 24 часа нас посетили 19940 программистов и 1695 роботов. Сейчас ищут 1686 программистов ...

Обновление лишних записей

Тема в разделе "MySQL", создана пользователем yanval, 19 дек 2007.

  1. yanval

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

    С нами с:
    18 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Фрагмент кода. Смысл – выбрать из нескольких записей одну с наименьшим значением ban_use.buView и увеличить это значение на единицу.
    Код (Text):
    1.  
    2. $qstr = "SELECT banners.bId, banners.bLimit, banners.bStatus, ban_use.buDate, ban_use.buBid, ban_use.bukId, ban_use.buView FROM banners INNER JOIN ban_use ON banners.bId = ban_use.buBid WHERE ban_use.buView<banners.bLimit AND ban_use.buDate=NOW() AND banners.bStatus=1 ORDER BY ban_use.buView, ban_use.bukId LIMIT 1";
    3.   $res = mysql_query($qstr);
    4.   $row = mysql_fetch_assoc ($res);
    5.   $n = $row['buView']+1;
    6.   $d = $row['bukId'];
    7.   //Обновляем   запись
    8.   $qk = "UPDATE ban_use SET buView=$n WHERE bukId=$d";
    9.    echo 'Запрос: '.$qk.'<br><br>'; //Для контроля
    10.   mysql_query($qk);
    11.    echo 'Результат обновления: '.mysql_info().'<br><br>';
    В браузере вижу
    Запрос: UPDATE ban_use SET buView=204 WHERE bukId=16
    Результат обновления: Rows matched: 1 Changed: 1 Warnings: 0

    Далее мистика – обновляются все записи, для которых выполняется ban_use.buView<banners.bLimit AND ban_use.buDate=NOW() AND banners.bStatus=1. Причём возникновение этой проблемы зависит от браузера (в Опере её нет. В ИЕ и ФФ – есть). Бьюсь об стенку...
     
  2. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    структуру таблиц и их связь гадать будем?
     
  3. yanval

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

    С нами с:
    18 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Из запроса
    banners.bId, banners.bLimit, banners.bStatus, ban_use.buDate, ban_use.buBid, ban_use.bukId, ban_use.buView FROM banners INNER JOIN ban_use ON banners.bId = ban_use.buBid

    Поля первой таблицы bId, bLimit, bStatus
    Второй bukId, buDate, buBid, buView
    Связь bId = buBid
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    так сколько у тебя записей с
     
  5. yanval

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

    С нами с:
    18 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    До запроса
    bukId,buDate,buBid,buView
    16,2007-12-19,1,258
    17,2007-12-19,2,257

    После

    bukId,buDate,buBid,buView
    16,2007-12-19,1,259
    17,2007-12-19,2,258

    bukId – первичный ключ, должен определять однозначно. Но, увы...
     
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    значит, где-то еще проблема.
     
  7. Ipolit

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

    С нами с:
    18 дек 2007
    Сообщения:
    34
    Симпатии:
    0
    откуда bukId=16, если должно быть 17 ?

    такое впечатление что запрос два раза выполняется...
     
  8. yanval

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

    С нами с:
    18 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Да, и логи mySQL тоже говорят, что два раза. В коде нет циклов. В-общем, иду искать бубен. Или переделывать фсё...
     
  9. yanval

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

    С нами с:
    18 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Премного благодарю всех участвовавших, проблема оказалась совсем не тут (долгая и грустная история о потерянном времени).