:: urbansheep (urbansheep) wrote,
:: urbansheep
urbansheep

  • Music:

[ utx ] Исправление ошибок (несовпадение пароля и невыводящиеся категории)

Я всё ещё программирую на пхп и скл со словарём, поэтому почти каждый день приносит нам новые удивительные открытия.

О while и потерянных категориях

Так, после включения поиска по подстрокам, _zee_ сообщил, что „не все категории выводятся в списке“. Потом совместными усилиями выяснилось, что категории пропадают через одну, а дальше было уже просто.

Так как построение списка раньше шло в одном месте, то там всё было сделано просто и линейно — один глобальный метод „showUserCategory“ и вытаскивал нужные категории из БД, и строил их в список, и реагировал на ошибки, и всё в таком духе. Но когда появился режим „частичного вывода категорий“, оказалось, что вытаскивание категорий и построение их в список — это такие операции, которые хорошо бы вытащить в отдельные методы (непременно с гиканьем „ООООП!“). Это перестроение стало основанием для пересмотра кода внутри. И вот тут-то произошло самое смешное.

Вытаскивая, я решил заодно испытать новый способ создания массивов из пришедшего из БД материала. Мне показалось, что используемое решение с while неоптимально.

$incomingStuff = array();
$i = 0;
while($iterator = mysql_fetch_assoc($this->db->db_res)) {
    $incomingStuff[$i++] = $iterator;
}

tobe на вопрос о том, можно ли это сделать как-то сразу, без промежуточного массива $iterator, сказал, что напрямую никогда не работал. Осталось экспериментировать. Вот тут-то и начались ошибки. Простое „сокращение“ привело к такому коду:

$incomingStuff = array();
$i = 0;
while(mysql_fetch_assoc($this->db->db_res)) {
    $incomingStuff[$i++] = mysql_fetch_assoc($this->db->db_res)
}

Гордясь собой, я поехал домой, где и обнаружился репорт _zee_. Всего несколько минут беготни по логам, и выяснилось, что написанный вариант глотает элементы, пришедшие из базы, через один (что логично для любого, кто знает, что mysql_fetch_* всегда что-то тащит из пришедшего результата — а я в этом ещё не был уверен, и использовать mysql_fetch_* для проверки — это значит терять на элемент). Переписали.

$incomingStuff = array();
$i = 0;
while($incomingStuff[$i++] = mysql_fetch_assoc($this->db->db_res)) {}

Пошли смотреть. И оказалось, что теперь появляется лишний пустой элемент в принимающем массиве. После проверок и размышлений, стало ясно, что элемент всегда добавляется, если добавлять без промежуточного массива (как это было в начале). Пришлось остановиться на таком финальном варианте:

$incomingStuff = array();
while($km = mysql_fetch_assoc($this->db->db_res)) {
    $incomingStuff[] = $km;
}

О сбивающихся паролях

Приходит сегодня r_f и спрашивает: время от времени система отказывается принимать пароль. приходится запрашивать новый. с чем это может быть связано? Что такое происходит, мне известно (и видно по тому количеству запросов на напоминание пароля, которое проходит по отчётам — не могут же пользователи повально отличаться склерозом), но на моих проверках всегда всё работало нормально. А теперь пришлось посмотреть внимательнее.

Ответ нашёлся сразу, стоило лишь посмотреть на лежащие отпечатки паролей в БД. Обновление паролей происходило чудесными по форме запросами:

UPDATE usr_table SET password="NEW PASSWORD", newpassword=""

И никаких тебе WHERE user="SOME USER", ничего. Утро здорового смеха, да. Ошибка означала, что можно запустить смену пароля, войти в новым паролем, а потом с этим же паролем войти под именем любого другого пользователя. Секьюрити!

И это, кстати, означает, что сейчас все пароли сброшены, и для входа в систему придётся снова запросить напоминание пароля, но затем уже всё должно нормально работать. И, конечно, большое спасибо _zee_ и r_f за обратную связь.

Subscribe
  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 12 comments