• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czysty kod w CodeIgniterze

0 głosów
951 wizyt
pytanie zadane 7 marca 2017 w PHP przez Sławek Obywatel (1,270 p.)
edycja 7 marca 2017 przez Sławek

Cześć wszystkim, używam od niedawna CodeIgnitera do pewnego projektu, termin gonił a ja nie dbałem o refaktoryzację kodu i mam nauczkę bo wyszło mi coś takiego(tak wiem horror)

public function szukajsqlite($maszyna=false, $dataod=false, $datado=false, $procod=false, $procdo=false, $procestype=false, $procesStatus=null, $errorId=null)
	{
		
		if($datado==false && $dataod!=false && $maszyna==false && $procod!=false && $procdo!=false && $procestype!=false && $procesStatus==null)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->get( 'Process' )->result();

		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod!=false && $procdo!=false && $procestype!=false && $procesStatus!=null)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->where('Process.processStatus =', $procesStatus)
			->get( 'Process' )->result();

		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod!=false && $procdo!=false && $procestype!=false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->where('Process.processStatus =', $procesStatus)
			->get( 'Process' )->result();
		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod!=false && $procdo!=false && $procestype==false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->get( 'Process' )->result();
		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod!=false && $procdo==false && $procestype!=false)
		{
			$querydo = $this->db->query("SELECT * FROM Process ORDER BY processId DESC limit 1");
			$jestdo = $querydo->row();
			
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $jestdo->processId)
			->where('Process.processType =', $procestype)
			->get( 'Process' )->result();
		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod!=false && $procdo==false && $procestype==false)
		{
			$querydo = $this->db->query("SELECT * FROM Process ORDER BY processId DESC limit 1");
			$jestdo = $querydo->row();
			
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $jestdo->processId)
			->get( 'Process' )->result();
		}
		
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod==false && $procdo!=false && $procestype!=false)
		{
			$queryod = $this->db->query("SELECT * FROM Process ORDER BY processId ASC limit 1");
			$jestod = $queryod->row();
			
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $jestod->processId)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->get( 'Process' )->result();
		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod==false && $procdo!=false && $procestype==false)
		{
			$queryod = $this->db->query("SELECT * FROM Process ORDER BY processId ASC limit 1");
			$jestod = $queryod->row();
			
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processId >=', $jestod->processId)
			->where('Process.processId <=', $procdo)
			->get( 'Process' )->result();
		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod==false && $procdo==false && $procestype!=false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->where('Process.processType =', $procestype)
			->get( 'Process' )->result();
		}
		elseif($datado==false && $dataod!=false && $maszyna==false && $procod==false && $procdo==false && $procestype==false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1");
			$jest = $query->row();
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $jest->date)
			->get( 'Process' )->result();
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod!=false && $procdo!=false && $procestype!=false)
		{
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod!=false && $procdo!=false && $procestype==false)
		{
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod==false && $procdo!=false && $procestype!=false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId ASC limit 1");
			$jest = $query->row();
			
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $jest->processId)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod==false && $procdo!=false && $procestype==false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId ASC limit 1");
			$jest = $query->row();
			
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $jest->processId)
			->where('Process.processId <=', $procdo)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod!=false && $procdo==false && $procestype!=false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId DESC limit 1");
			$jest = $query->row();
			
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $jest->processId)
			->where('Process.processType =', $procestype)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod!=false && $procdo==false && $procestype==false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId DESC limit 1");
			$jest = $query->row();
			
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $jest->processId)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod==false && $procdo==false && $procestype!=false)
		{
			
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processType =', $procestype)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna!=false && $procod==false && $procdo==false && $procestype==false)
		{
			
			$result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->like('machine', $maszyna)
			->get( 'Process' )->result();
			
			return $result;
		}
		elseif($datado!=false && $dataod!=false && $maszyna==false && $procod!=false && $procdo!=false && $procestype!=false)
		{
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->get( 'Process' )->result();
		}
		elseif($datado!=false && $dataod!=false && $maszyna==false && $procod!=false && $procdo!=false && $procestype==false)
		{
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $procdo)
			->get( 'Process' )->result();
		}
		elseif($datado!=false && $dataod!=false && $maszyna==false && $procod!=false && $procdo==false && $procestype!=false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId DESC limit 1");
			$jest = $query->row();
			
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $jest->processId)
			->where('Process.processType =', $procestype)
			->get( 'Process' )->result();
		}
		elseif($datado!=false && $dataod!=false && $maszyna==false && $procod!=false && $procdo==false && $procestype==false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId DESC limit 1");
			$jest = $query->row();
			
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $procod)
			->where('Process.processId <=', $jest->processId)
			->get( 'Process' )->result();
		}
		elseif($datado!=false && $dataod!=false && $maszyna==false && $procod==false && $procdo!=false && $procestype!=false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId ASC limit 1");
			$jest = $query->row();
			
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $jest->processId)
			->where('Process.processId <=', $procdo)
			->where('Process.processType =', $procestype)
			->get( 'Process' )->result();
		}
		elseif($datado!=false && $dataod!=false && $maszyna==false && $procod==false && $procdo!=false && $procestype==false)
		{
			$query = $this->db->query("SELECT * FROM Process ORDER BY processId ASC limit 1");
			$jest = $query->row();
			
			return $result=$this->db->where('Process.date >=', $dataod)
			->where('Process.date <=', $datado)
			->where('Process.processId >=', $jest->processId)
			->where('Process.processId <=', $procdo)
			->get( 'Process' )->result();
		}

		
	}




 

Było tego więcej ale nie mogłem dodać więcej znaków, ale wyglądało podobnie jak to.

I teraz pytanie ktoś wie jak to skrócić, próbowałem używać helperów, ale coś mi nie działało, tak jak mówiłem używam CodeIgnitera od niedawna. Ktoś ma jakieś pomysły?

2 odpowiedzi

+2 głosów
odpowiedź 7 marca 2017 przez rafal.budzis Szeryf (86,440 p.)
wybrane 8 marca 2017 przez Sławek
 
Najlepsza

Nawet nie wiesz na jakiego wariata trafiłeś :D (mówiąc o mnie) :D zoptymalizowałem twoje pierwsze 4 ify ;) które zajmowały 64 linijki. Mój kod co prawda jeszcze nie testowany ale zajmuje 27. Mam nadzieje ze zadziała na przyszłość rada jeśli funkcja ma wiecej niz 2 parametry musi być zła ale od tego teraz nie uciekniemy. 

Punkty co robiłem z kodem :

1 - usuwamy parametr $errorId (nigdzie nie był uzyty)
2 - wyciągamy zmienne query oraz jest
3 - "query" zmieniamy nazwa na newestProcess (w koncu wyciągasz jeden z najnowszych)
4 - "jest" usuwamy a pobranie row przesuwamy do zmiennej newestProcess (stare query)
5 - kasujemy wszystkie return
6 - result przenosimy wyzej poza ify i nadajely nazwe assemblingWhereClause (w koncu bedziemy składać where :D)
7 - rozbijamy wszystkie where osobno i dajemy do ifów

a teraz kodzik ;) jeszcze musisz przerobić resztę ifów ale juz widać jakieś swiatełko w tunelu ;) Mam nadzieje ze zadziała.

public function szukajsqlite($maszyna=false, $dataod=false, $datado=false, $procod=false, $procdo=false, $procestype=false, $procesStatus=null) 
{
    $newestProcess = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1")->row();
    $assemblingWhereClause = $this->db->get( 'Process' );
    $assemblingWhereClause = $assemblingWhereClause->where('Process.date >=', $newestProcess->data);
    
    if ($dataod != false) {
        $assemblingWhereClause = $assemblingWhereClause->where('Process.processId <=', $procdo);
    }

    if ($procod != false) {
        $assemblingWhereClause = $assemblingWhereClause->where('Process.processId >=', $procod);
    }

    if ($dataod != false) {
        $assemblingWhereClause = $assemblingWhereClause->where('Process.date >=', $dataod);
    }

    if ($procestype != false) {
        $assemblingWhereClause = $assemblingWhereClause->where('Process.processType =', $procestype);
    }

    if ($procesStatus != false) {
        $assemblingWhereClause = $assemblingWhereClause->where('Process.processStatus =', $procesStatus);
    }

    return $assemblingWhereClause->result();
}

 

komentarz 8 marca 2017 przez Sławek Obywatel (1,270 p.)

O dzięki sprawdzałem twój kod część działa jak sprawdziłem zmieniony przeze mnie pierwszy warunek to działał ale następne już nie sprawdzałem czemu obawiam się że nie można łączyć zapytań do bazy w łańcuchy włożone do zmiennych, zmieniony twój kod:

 

$newestProcess = $this->db->query("SELECT * FROM Process ORDER BY date DESC limit 1")->row();
		    $assemblingWhereClause = $this->db->get( 'Process' );
		  // $assemblingWhereClause = $assemblingWhereClause->where('Process.date <=', $newestProcess->date);
		    if ($maszyna != false) {
		       return $this->db->like('machine', $maszyna)->get( 'Process' )->result();
		    }

		    if ($procdo != false) {
		        $assemblingWhereClause = $assemblingWhereClause->where('Process.processId <=', $procdo);
		    }
		 
		    if ($procod != false) {
		        $assemblingWhereClause = $assemblingWhereClause->where('Process.processId >=', $procod);
		    }
		 
		    if ($dataod != false) {
		        $assemblingWhereClause = $assemblingWhereClause->where('Process.date >=', $dataod);
		    }
		 
		    if ($procestype != false) {
		        $assemblingWhereClause = $assemblingWhereClause->where('Process.processType =', $procestype);
		    }
		 
		    if ($procesStatus != false) {
		        $assemblingWhereClause = $assemblingWhereClause->where('Process.processStatus =', $procesStatus);
		    }
		 
		    return $assemblingWhereClause->result();

 

komentarz 8 marca 2017 przez rafal.budzis Szeryf (86,440 p.)

return możesz użyć tylko jednego na koncu funkcj :) Zamiast 

 

return $this->db->like('machine', $maszyna)->get( 'Process' )->result();



zrób 

 

$assemblingWhereClause = $assemblingWhereClause->like('machine', $maszyna);

 

Powinno śmigać ale moge sie mylić bo do Bazy danych używałem tylko MYSQLI.

->get( 'Process' ); już nie robisz bo jest zrobiony na początku i ->result() już nie robisz bo jest na samym koncu jeden dla wszystkich 

return $assemblingWhereClause->result();

komentarz 8 marca 2017 przez Sławek Obywatel (1,270 p.)

Musiałem zmienić pare rzeczy w twoim kodzie bo pare rzeczy nie działało ale niech bóg ci to wynagrodzi ja w jedyny możliwy sposób na wynagrodzenie dałem twoja odpowiedź jako najlepszą dzięki tobie z 3000 linijek(nie żartuje) zrobiłem 36 tak musiałem zmienić kod:

	    $assemblingWhereClause = $this->db;

	    if ($maszyna != false) {
	       $assemblingWhereClause = $assemblingWhereClause->like('machine', $maszyna);
	    } 
	    
	    if ($procdo != false) {
	        $assemblingWhereClause = $assemblingWhereClause->where('Process.processId <=', $procdo);
	    }
	 
	    if ($procod != false) {
	        $assemblingWhereClause = $assemblingWhereClause->where('Process.processId >=', $procod);
	    }
	 
	    if ($dataod != false) {
	        $assemblingWhereClause = $assemblingWhereClause->where('Process.date >=', $dataod);
	    }

	    if ($datado != false) {
	        $assemblingWhereClause = $assemblingWhereClause->where('Process.date <=', $datado);
	    }
	 
	    if ($procestype != false) {
	        $assemblingWhereClause = $assemblingWhereClause->where('Process.processType =', $procestype);
	    }
	 
	    if ($procesStatus != null) {
	        $assemblingWhereClause = $assemblingWhereClause->where('Process.processStatus =', $procesStatus);
	    }

	    if ($errorId != null) {
	        $assemblingWhereClause = $assemblingWhereClause->where('Process.errorId =', $errorId);
	    }
	    
	 
	    return $assemblingWhereClause->get( 'Process' )->result();

 

komentarz 8 marca 2017 przez rafal.budzis Szeryf (86,440 p.)

Najlepsza zapłata to uśmiech :D No i śpiewanie ! :D Śpiewsz ze mną ? :D

https://www.youtube.com/watch?v=okB1gyfUMys

Ciesze się ze mogłem pomóc ;) 

komentarz 9 marca 2017 przez Sławek Obywatel (1,270 p.)

haha śpiewamy!!!laugh

0 głosów
odpowiedź 7 marca 2017 przez Raymond.Z Obywatel (1,800 p.)
Zauważ, że masz masę duplikującego się kodu. Jest to już pierwszy znak, że coś takiego trzeba refaktoryzować i wrzucić najlepiej to do jakiejś funkcji.

Kolejna sprawa, warunki są nieczytelne nie wiadomo co oznaczają, polecałbym utworzyć zmienne z odpowiednimi nazwami, które by przechowywały wartość tych warunków logicznych.

Nazwy zmiennych polecalbym ujednolicić do języka angielskiego i zapisywać je camel case'm.

Jak już to poprawisz i wrzucisz, będzie można pomyśleć co dalej.
komentarz 7 marca 2017 przez Sławek Obywatel (1,270 p.)
edycja 7 marca 2017 przez Sławek
Już próbowałem wrzucić to do funkcji ale to CodeIgniter i nie wiem jak to tam zrobić, używałem helperów ale coś mi nie działało.wywoływanie funkcji z kontrolera a wywoływanie funkcji wewnątrz modelu to duża różnica.Pewnie jest jakiś sposób żeby jakoś to w funkcji uruchomić ale nie wiem jaki.
komentarz 7 marca 2017 przez Raymond.Z Obywatel (1,800 p.)
Powiedz mi z czym dokładnie problem. Masz problem z wywołaniem funkcji z innej funkcji?
komentarz 7 marca 2017 przez Sławek Obywatel (1,270 p.)
edycja 7 marca 2017 przez Sławek

ten kod wykonuje się w funkcji wywoływanej z kontrolera znajduje się ona w modelu a żeby ten kod w tych instrukcjach warunkowych zadziałał w funkcji to trzeba utworzyć funkcję w modelu wywoływaną z tych instrukcji warunkowych a tak nie może być bo próbowałem tak zrobić, dam jeszcze kod kontrolera:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Sqlite extends CI_Controller {

	public function __construct()
	{
		parent::__construct();

		$post = file_get_contents( 'php://input' );
		$_POST = json_decode( $post , true );

		$this->load->model( 'site/Sqlite_model' );	

	}

	public function get()
	{
		$output = $this->Sqlite_model->get();
		echo json_encode( $output );
		
	}
	public function szukajsqlite()
	{
		$maszyna = $this->input->post('maszyna');
		$dataod = $this->input->post('dataod');
		$datado = $this->input->post('datado');
		$procod = $this->input->post('procod');
		$procdo = $this->input->post('procdo');
		$procestype = $this->input->post('procestype');
		$procesStatus = $this->input->post('procesStatus');
		$errorId = $this->input->post('errorId');
		
		$output = $this->Sqlite_model->szukajsqlite($maszyna, $dataod, $datado, $procod, $procdo, $procestype, $procesStatus, $errorId);
		echo json_encode( $output );
		
	}


}

 

 

Więc tak chciałbym to wszystko do funkcji dać ale nie wiem jak w CodeIgniterze mam to zrobić

komentarz 7 marca 2017 przez CzikaCarry Szeryf (75,340 p.)
Ale tu nie ma różnicy czy codeigniter, Yii, Symfony, php5 czy php7. Tu nic nie robi róznicy, po prostu robisz funkcję i ją wywołujesz.
komentarz 8 marca 2017 przez Sławek Obywatel (1,270 p.)
Racja, głupi błąd przy this zapomniałem o znaku dolara i zrobiłem literówkę przy zmiennej już działa:)

Podobne pytania

0 głosów
4 odpowiedzi 2,013 wizyt
pytanie zadane 19 stycznia 2017 w Rozwój zawodowy, nauka, praca przez Rayden Użytkownik (610 p.)
0 głosów
3 odpowiedzi 1,066 wizyt
pytanie zadane 31 grudnia 2016 w C i C++ przez Piredele Nowicjusz (160 p.)
+1 głos
1 odpowiedź 815 wizyt

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,328 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...