Codeigniger - bardzo dziwne wyniki zapytań

0

W telegraficznym skrócie: baza danych zwraca dziwne wyniki, nie zwraca ich wcale lub zwraca z opóźnieniem. Np po dodaniu jakiegoś wiersza i redirectie na stronę z wyświetlaniem danej bazy, dodany wiersz się nie pojawia. Po kilku odświeżeniach nagle się pojawia. Jak skasuję , to też czasem znika, czasem nie znika i dopiero po jakimś czasie znika (np. przejdę na inną zakładkę, wrócę na tą z wyświetlaniem bazy i odświeżę). A czasem nawet znów się pojawia choć jest skasowana.

Do tego dochodzą dziwne wyniki. Np w bazie jest wartość 3 a wyświetla się wartość 2 a w drugiej kolumnie zamiast zapisanego czasu wyświetla się 0000. Odświeżam kilka razy i nagle pojawiają się prawidłowe wartości.

Moje tabele
user image
user image

Kontroler - visits_model jest załadowany w konstruktorze

public function summary(){
		$this->load->model('main_model');
		$visit_id= $this->uri->segment(3);
		$config['visit'] = $this->visits_model->get_visit($visit_id);
		$config['client'] = $this->main_model->show_client($config['visit'][0]['visit_client']);
		$config['view'] = 'visits/summary';
		$this->load->view('templates/content',$config);
	
	} 

Model - reszty użytych tu tabel nie będę pokazywał. Nadmienię tylko że zawierają po kilka-kilkanaście wpisów

public function get_visit($visit_id){
		$query = $this->db->select('*')->where('visit_id',$visit_id)->join('clients','clients.client_id=visits.visit_client')->join('procedures','procedures.proced_visit=visits.visit_id')->join('offers','offers.offer_id=procedures.proced_offer')->get('visits');
		if ($query->num_rows()>0){
		return $query->result_array();
		}
		else{
		return FALSE;
		}
		} 

public function show_client($id){
		return $this->get_item(array('client_id'=>$id), 'clients');
	}

Funkcja get_item (w rodzicu wszystkich modeli - MY_Model)

public function get_item($where,$tab_name){
		$query = $this->db->select('*')->where($where)->get($tab_name);
		if ($query->num_rows() > 0 ){
			return $query->result_array();
		}
		else {
			return FALSE;
		}
	} 

A o to błędne wyniki które się wyświetlają. Czasem przez kilkadziesiąt odświeżeń jest dobrze a później przez dalsze kilkadziesiąt tak jak poniżej (oczywiście w międzyczasie w kodzie nic nie jest grzebane).

user image

Nie wiem czy to wersja bazy jest jeszcze "za młoda" i nie jest jeszcze stabilna (MariaDB 5.5.32-2), czy dlatego że jest 64bit, czy kwestia zapytań. Z programowaniem mam do czynienia od ponad miesiąca i w tym przypadku nie wiem nawet gdzie szukać przyczyny. Testowałem na różnych przeglądarkach i jest tak samo. Czasem na Operze lub Chrome jest dobrze a na Firefoksie źle, czasem na wszystkich jest źle lub dobrze. Restartowałem demona mysqld (korzystam z linuxa Arch) i nic nie pomogło.

0

Wątpię, żeby to baza coś mieszała. Jeżeli "to samo" zapytanie MySQL w phpMyAdmin jest ok, to winna jest Twoja aplikacja. Ale co, gdzie - to pewnie trzeba by było cały kod przeglądać, skoro produkuje LOSOWE wyniki.

0

"W tym szaleństwie jest metoda" chciało by się powiedzieć bo zawsze produkuje albo wynik dobry albo zły ale konkretny. Losowość jest tylko w rodzaju wyniku ale nie w samym wyniku. Poza tym właściwie nie wiem gdzie szukać błędu w kodzie skoro to nie C++ żeby zarządzać pamięcią. A losowość wyników tylko z tego typu błędami mi się kojarzy. Natomiast w PHP zawsze jest konkret - albo błąd jest, albo go nie ma. Nawet jeżeli jest mocno ukryty i wywołuje go specyficzna sytuacja to właśnie ów fakt specyficzności sprawia że można go namierzyć. A w tym przypadku nie robię nic specyficznego oprócz przełączania się to na jedną to na drugą kartę lub przeglądarkę, nic więcej.

Jedynie co przychodzi mi na myśl to transakcje. Ale one chyba nie mogłyby popsuć niczego poza metodą w której są uruchamiane.

//edycja
Sprawdzałem bazę poleceniem mysqlcheck. Za pierwszym razem wieszało się na tabeli clients którą joinowałem do visits. Zrestartowałem bazę, problem chyba ustąpił ale robiąc mysqlcheck znów wieszało się, tym razem na tabeli offers. Więc ewidentnie coś jest nie tak z bazą. Prosiłbym o potwierdzenie czy na podstawie wyników (a w zasadzie ich braku) mam prawo tak zakładać (i tym samym założyć odpowiedni topik), czy jednak mysqlcheck niczego nie przesądza i szukać jeszcze w kodzie.

@hzmzp
Heh, gdyby baza była gdzieś w świecie to tak. Ale na lokalnym kompie? Bo nie wierzę że jakieś dyskowe problemy przekładały by się w tak "ułożony" sposób na warstwę softwarową. Prędzej to w ogóle byłaby kaszana. Być może za często robię update mysql'a :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1