Dziś MySQL zapewnił mi dość ciekawe doświadczenie. Spotkałem się z dziwną właściwością tej bazy danych. Jedna z tabel jaką wykorzystuję w pracy ma zdefiniowane pole WYNIK jako:
decimal(3,2)
a domyślna wartość tego pola to NULL. Tabela ta jest wykorzystywana jako miejsc w którym trzymane są wyniki testów punktowanych lub zapisywany jest bieżący stan odpowiedzi.
W zależności od zawartości pola WYNIK test traktowany jest jako zapisany (wartość NULL) lub wysłany (wartość liczbowa decimal z uzyskanym wynikiem). W ostatnim czasie spotkałem się z dziwnym zachowaniem tego mechanizmu testów punktowanych. Korzystając z formularza otwartego w kilku oknach, można było nadpisać pierwotnie wysłane dane z odpowiedziami testu. Błąd ten wynikał z faktu, że mechanizm nie rozpoznawał w prawidłowy sposób statusu wysłanego testu. Było to o tyle dziwne, że patrząc od strony rekordów znajdujących się w bazie danych wyglądało to całkowicie prawidłowo.
Za brak prawidłowego rozpoznania odpowiedzialny był MySQL, dla którego wartość pola WYNIK = NULL jest równoważne z wartością pola WYNIK = 0.00.
W celu sprawdzenia statusu danego testu wykonywane było sprawdzenie liczby rekordów zwracanych przez poniższe zapytanie:
SELECT *FROM `test`
WHERE `id_uzytkownika` =1
AND `punkty` != NULL
w obu przypadkach zwróci ten sam wynik, czyli 0 rekordów.
Sposób na szybkie sprawdzenie rzeczywistego statusu testu to pobranie rekordu danego użytkownika a następnie sprawdzenie wartości pola już po stronie PHP. Można to zrealizować choćby w ten sposób:
$test_wyslany=0;
if (!empty($test['WYNIK'])) {
$test_wyslany=1;
}
$test – tablica z wynikiem powyższego zapytania SQL
Ot taka ciekawostka ze styku programowania i właściwości baz danych.
ddd
Znaczniki: bazy danych, MySQL, PHP, programowanie