CodeIgniter Polska Forum

Witamy na polskiej stronie wsparcia CodeIgniter. Nie zapomnij odwiedzić naszej strony głównej

Nie jesteś zalogowany na forum.

#1 19-03-2013 18:33:15

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

Database Class - Generating Query Results

Mam pytanie.

Za pomoca funkcji row_array() sciagam sobie pojedyncze wiersze z odpowiednich tabel wersji jezykowych.
Dla danej sekcji strony mam przykladowo dwie takie tabele. jedna ze stalymi labelami, natomiast druga tabela z wynikami dzialan na bazie danych.

Do "odpalenia" widoku danej sekcji musze dwa wiersze polaczyc w jeden i "zapodac" go do html'owej templatki wywolywanej sekcji. Proboje to uzyskac za pomoca funkcji array_merge() tworzac cos w tym stylu :

$row_s = array_merge($row_t,$row_s);

Niestety wywala mi nastepujacy blad :

<p>Severity: Warning</p>
<p>Message:  array_merge() [<a href='function.array-merge'>function.array-merge</a>]: Argument #1 is not an array</p>
<p>Filename: core/MY_Controller.php</p>
<p>Line Number: 30</p>

Czym sa zatem wyniki dzialania funkcji row_array() jesl php nie traktuje ich jako tablic ?

Offline

#2 19-03-2013 19:58:10

maniakphp
Użytkownik
Data rejestracji: 26-12-2012
Liczba postów: 493

Odp: Database Class - Generating Query Results

Argumenty muszą być tablicami, najwyraźniej przekazujesz inny typ. sprawdź co zwraca $row_t. Poza tym o ile dobrze zrozumiałem to chcesz zrobić złączenie. Jeśli tak to robisz to źle. Użyj do tego funkcji join, która da Ci w rezultacie to co chcesz osiągnąć. Przykład zapytania:

$this->db->select($this->db->dbprefix('nazwa_pierwszej_tabeli').'.*')
                    ->select($this->db->dbprefix('druga_tabela').'.kolumna')                    
                ->from($this->db->dbprefix('nazwa_pierwszej_tabeli'))
                ->join($this->db->dbprefix('nazwa_pierwszej_tabeli'), $this->db->dbprefix('nazwa_pierwszej_tabeli').'.obce_id = '.$this->db->dbprefix('druga_tabela').'.id', 'left');

Wówczas nie musisz się martwić o łączenie wyników. Dalsza część zapytania wygląda tak samo.

Ostatnio edytowany przez maniakphp (19-03-2013 19:58:47)

Offline

#3 19-03-2013 20:01:16

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

Odp: Database Class - Generating Query Results

OK ROZWIAZANE smile

Pracuje teraz nad czyms w rodzaju uniwersalnego silnika, ktorego zadaniem jest uporzadkowane ladowanie kolejnych segmentow skladajacych sie na widok strony.
Tak jak mowilem niektore segmenty zawieraja jedynie labele dla tag'ow html, a niektore zawieraja wyniki operacji przeprowadzanych na bazie danych.

Caly wist polegal na tym ze silnik korzysta ze specjalnego konfiga ktory, ktory nie dla wszystkich rodzajow tabel (co zrozumiale) podaje ich konkretne odnosniki w bazie danych. Zatem jesli funkcja :

$row_s = array_merge($row_t,$row_s);

jest uruchamiana niezaleznie od tego czy tabela w bazie wystepuje czy nie dochodzi do sytuacji w ktorej faktycznie zamiast argumentu w postaci "array" pobierany jest argument '' (pusty), ktory ta tablica nie jest. Ostatecznie wystarczylo nalozyc prosty warunek :

if ( $row_t != '') 
{
     $row_s = array_merge($row_t,$row_s);
}

Offline

#4 19-03-2013 20:03:12

maniakphp
Użytkownik
Data rejestracji: 26-12-2012
Liczba postów: 493

Odp: Database Class - Generating Query Results

A czemu w tym przypadku nie możesz skorzystać z kodu który podałem?

Offline

#5 19-03-2013 20:18:56

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

Odp: Database Class - Generating Query Results

Sorry, pisalismy w tym samym czasie smile.

Bardzo Ci dziekuje za reakcje. Moje rozwizane (biorac pod uwage moje doswiadczenie) jednak lepiej mi odpowiada bo jest po prostu banalnie proste smile. Ja nawet nie rozumiem o czym Ty do mnie tam u gory rozmawiasz sad. Dlatego chwilowo (caly czas Ci dziekujac) poprzestane na swoim rozwiazaniu. Zobacz oto gotowy silnik :

        $section = array_keys($data['frame']); 
        foreach ($section as $s_id) // dla kazdej sekcji
        {   
            $row_s = array('init'=>'init');;
            foreach ($data['frame'][$s_id] as $table) // kazda tablice
            {
                if ( $table != '')
                {
                    $row_t = $this->Page_model->_get_table_row($table,$data['language']);
                    if ( $row_t != '') 
                    {
                        $row_s = array_merge($row_s, $row_t);
                    }  
                }
            }
                           
            $this->load->view('templates/'.$s_id.$data['mode'].'.php',$row_s);
         
        }

plus ladowanie danych z bazy w modelu :

    // Get Table row - pobierz wiersz z tabeli dla wartosci id = $language :
    function _get_table_row($table,$language)
    {
        $rows = $this->db->count_all($table);
        if ($rows != 0)
        {
            $sql = "SELECT * FROM ".$table." WHERE ".'id'." = ?"; 
            return $this->db->query($sql,array($language))->row_array(); 
        }             
    }

plus odpowiedni config ladowany w kontrolerze do $data :

$config = array(
                'hp_'=>array(
                            's1'=>array(
                                        'lab_'=>'',
                                        'lab_m'=>'',
                                        'var_'=>'',
                                        'var_m'=>''                            
                            ),
                            's2'=>array(
                                        'lab_'=>'s2_lab_',
                                        'lab_m'=>'s2_lab_',
                                        'var_'=>'',
                                        'var_m'=>''                             
                            ),
                            's3'=>array(
                                        'lab_'=>'',
                                        'lab_m'=>'s3_lab_v',
                                        'var_'=>'',
                                        'var_m'=>''                              
                            ),
                            's4'=>array(
                                        'lab_'=>'s4_lab_',
                                        'lab_m'=>'',
                                        'var_'=>'',
                                        'var_m'=>''                            
                            ),
                            'hd1_'=>array(
                                        'lab_'=>'',
                                        'lab_m'=>'',
                                        'var_'=>'hd1_var_',
                                        'var_m'=>''                            
                            ),
                            'hp_'=>array(
                                        'lab_'=>'hp_lab_',
                                        'lab_m'=>'',
                                        'var_'=>'',
                                        'var_m'=>''                            
                            ),
                            's7'=>array(
                                        'lab_'=>'s7_lab_',
                                        'lab_m'=>'',
                                        'var_'=>'s7_var_',
                                        'var_m'=>''                            
                            )
                               
                ),
                'rtc'=>array(
                                
                )
);

To razm daje juz calkiem sprytny motorek smile mimo ze banalnie prosty.

Offline

#6 19-03-2013 22:55:15

renholder
Administrator
Data rejestracji: 06-09-2012
Liczba postów: 848

Odp: Database Class - Generating Query Results

tj_gumis napisał/a:
if ( $row_t != '') 
{
     $row_s = array_merge($row_t,$row_s);
}

Ładniej byłoby skorzystać z rzutowania:

array_merge((array)$row_t, $row_s);

@maniakphp - jeśli korzystamy z AR, to prefiks dla tabeli jest dodawany automatycznie (o ile jest zdefiniowany). Metodę dbprefix stosujemy podczas pracy ze "zwykłymi" zapytaniami do bazy.

Offline

#7 19-03-2013 23:13:44

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

Odp: Database Class - Generating Query Results

renholder

Dziekuje bardzo.
Najpierw jednakmusze sobie poczytac co to w ogole jest "rzutowanie" smile.

Offline

#8 19-03-2013 23:22:27

maniakphp
Użytkownik
Data rejestracji: 26-12-2012
Liczba postów: 493

Odp: Database Class - Generating Query Results

renholder napisał/a:

@maniakphp - jeśli korzystamy z AR, to prefiks dla tabeli jest dodawany automatycznie (o ile jest zdefiniowany). Metodę dbprefix stosujemy podczas pracy ze "zwykłymi" zapytaniami do bazy.

A mi w codziennej pracy powtarzają: pamiętaj o dbprefix, jest on dawany ze względu na specyfikę projektu - dla bezpieczeństwa. Ta moja propozycja użycia join chyba tu nie ma zastosowania, dzięki tj_gumis za kod, byłem ciekawy czy dobrze Cię zrozumiałem, ale niestety źle smile A rzutowanie w największym skrócie to wymuszenie danego typu dla zmiennej, spowoduje to że ta zmienna będzie zawsze tablicą, nawet jeśli pustą. Tak samo możesz rzutować jako string, int itd. Ocztwiście to taka moja skrócona wersja definicji, więc poczytaj dokładniej smile

Offline

#9 19-03-2013 23:35:45

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

Odp: Database Class - Generating Query Results

maniakphp

Dzieki, oszczedziles mi kupe czasu smile. Jestem juz tak padniety ze moge sie w koncu polozyc, a tak siedzialbym jeszcze i "studiowal" smile.

Offline

Stopka