Avatar billede sijmonj Nybegynder
16. november 2010 - 16:42 Der er 16 kommentarer og
1 løsning

codeigniter join problem

Hej, jeg vil gerne selecte fra 3 tabeller "forum_traad" "forum_kommentare" "users"

skal hente alle felter i "forum_traad" og "forum_kommentare" og kun hente feltet "profil_billed" i min users tabel, og jeg skal vise det billed som passer til den bruger der har oprettet tråden, og den som har oprettet en kommentar til tråden,

har i felt i min "forum_traad" og min "forum_kommentare" der hedder "brugernavn" og den skal jo så matche "brugernavn" i "users" tabellen.

håber i forstår hvad jeg mener, det jeg har lavet endtil nu er det her



[code lang="PHP"]
        $this->db->select('*,forum_traad.indhold as traad_indhold,
                              forum_kommentare.indhold as kommentare_indhold,
                                forum_traad.brugernavn as traad_brugernavn,
                                forum_traad.id as traad_id, users.profil_billed as billed
                              ');
          $this->db->from('forum_traad');
          $this->db->join('forum_kommentare', 'forum_kommentare.fk_forum_traad = forum_traad.id');
          $this->db->join('users', 'forum_traad.brugernavn = users.profil_billed');
          $this->db->where('forum_traad.id', $id);
          $query = $this->db->get();
[/code]

og i min view fil jeg har lavet

[code lang="PHP"]
if($query)
{
echo $query->overskrift;
} else {
echo "der er ikke noget";
}
[/code]

Og den udskriver "der er ikke noget",

tak på forhånd
Avatar billede perfektus Nybegynder
16. november 2010 - 16:47 #1
Der er sikkert en fejl i din sql etc, prøv at echo en mysql_error :).

Den returnere ihvertfald ikke noget, da $query er null.
Avatar billede repox Seniormester
16. november 2010 - 16:48 #2
Jeg har godt set dit spørgsmål på stackoverflow - det der undrer mig er at du ikke har formået at løse problemet endnu.
Må jeg foreslå at du dropper Active Record metoden? Den er mere resourcekrævende - hvilket også står i dokumentationen - men også fordi der er ikke helt en rigtig Active Record implementering i CI.
Avatar billede repox Seniormester
16. november 2010 - 16:50 #3
Og ja, som #1 også nævner, så bruger du ikke $query rigtigt - du kan med fordel præsentere de relevante dele i din controller og dit view samt din model for at vi kan give et bud der giver mening.
Avatar billede sijmonj Nybegynder
16. november 2010 - 16:59 #4
har du gjort sådan her


        $this->db->select('*,forum_traad.indhold as traad_indhold,
                          forum_kommentare.indhold as kommentare_indhold,
                            forum_traad.brugernavn as traad_brugernavn,
                            forum_traad.id as traad_id
                          ');
        $this->db->from('forum_traad','users');
        $this->db->join('forum_kommentare', 'forum_kommentare.fk_forum_traad', 'forum_traad.id');
        $this->db->where('forum_traad.id', $id);
       
        $query = $this->db->get();


og det virker fint, men jeg mangler så at kunne udskrive "profil_billed" feltet som ligger i min users tabel.

og jeg har prøvet at print_r min query med det jeg har lavet nu, og der udskriver den

CI_DB_mysql_result Object ( [conn_id] => Resource id #24 [result_id] => Resource id #29 [result_array] => Array ( ) [result_object] => Array ( ) [current_row] => 0 [num_rows] => 155 [row_data] => )

så hvad foreslår i jeg helt præcist skal gøre :)?

og tusind tak fordi i gider hjælpe, har siddet med det her problem i 2-3 dage nu
Avatar billede perfektus Nybegynder
16. november 2010 - 17:07 #5
Jeg har aldrig selv brugt code igniter før, men så vidt som jeg kan se har du fået dit result, og det ser ud som om du har fået 155 rows..

Hvis du har 155 results, bliver du nød til at loope igennem dem..

som sagt har jeg ikke brugt codeigniter før, men du kan jo prøve med noget ala.

while($query = $this->db->get())
{
if($query)
{
echo $query->overskrift;
} else {
echo "der er ikke noget";
}
}
Avatar billede perfektus Nybegynder
16. november 2010 - 17:14 #6
Var lige inde og tjekke op på det


foreach ($query->result() as $row)
{
if($row)
{
echo $row->overskrift;
} else {
echo "der er ikke noget";
}
}

Sådan skal den vidst se ud. held og lykke :)
Avatar billede repox Seniormester
16. november 2010 - 17:15 #7
Prøv dette i stedet:
                    $sql = "
                    SELECT
                        forum_traad.indhold as traad_indhold,
                        forum_kommentare.indhold as kommentare_indhold,
                        forum_traad.brugernavn as traad_brugernavn,
                        forum_traad.id as traad_id,
                        users.profil_billed as billed
                    FROM
                        forum_traad,
                        forum_kommentare,
                        users
                    WHERE
                        forum_kommentare.fk_forum_traad = forum_traad.id
                    AND
                        forum_traad.brugernavn = users.profil_billed
                    AND
                        forum_traad.id = ?
                    ";
                    $query = $this->db->query($sql, array($id));


Men jeg vil stadig gerne se de relevante model funktioner, det view du bruger samt controlleren der viser dit view, for hvis jeg husker rigtigt fra SO, så gør du mange ting helt forkert...
Avatar billede repox Seniormester
16. november 2010 - 17:19 #8
Dine WHERE klausuler giver i øvrigt ikke meget mening? Hvilket sikkert er det oprindelige problem:
forum_traad.brugernavn = users.profil_billed

eller
$this->db->join('users', 'forum_traad.brugernavn = users.profil_billed');

Her fortæller du at users tabellen skal hente data frem når den finder et forum_traad.brugernavn der matcher users.profil_billed
Med lidt sund fornuft vile jeg antage at du ikke navngiver din brugers navn med samme indhold som i brugerens profil_billed felt?
Avatar billede sijmonj Nybegynder
16. november 2010 - 18:04 #9
viser lige mine MVC og mine tabeller i databasen

controller:

<?php

class Forum extends Controller
{
   
    function index()
    {
        $this->load->model('forum_model');
        $data['query'] = $this->forum_model->kategori();
       
        $data['content'] = 'forum_view';
        $this->load->view('includes/template', $data);
    }
   
    function thread_list()
    {
        $this->load->model('forum_model');
        $data['query'] = $this->forum_model->forum_list($this->uri->segment(3));
       
        $data['content'] = 'forum_list_view';
        $this->load->view('includes/template', $data);
       
    }
   
    function post($id)
    {
        $this->load->model('forum_model');
        $data['query'] = $this->forum_model->posts($this->uri->segment(3));
       
        $data['content'] = 'forum_post_view';
        $this->load->view('includes/template', $data);
    }
}


?>

model:

<?php

class Forum_model extends Model {
   
    function kategori()
    {
        $this->db->where('godkendt', 'ja');
        $query = $this->db->get('forum_kategori');
       
        //Hvis den fandt noget så return true
        if($query->num_rows > 0)
        {
            return $query->result();
        } else {
            return false;
        }
    }
   
    function forum_list($id)
    {
        $this->db->where('fk_forum_kategori', $id);
        $query = $this->db->get('forum_traad');
       
        if($query->num_rows > 0)
        {
            return $query->result();
        } else {
            return false;
        }
    }
   
    function posts($id)
    {
        $this->db->select('*,forum_traad.indhold as traad_indhold,
                          forum_kommentare.indhold as kommentare_indhold,
                            forum_traad.brugernavn as traad_brugernavn,
                            forum_traad.id as traad_id
                          ');
        $this->db->from('forum_traad','users');
        $this->db->join('forum_kommentare', 'forum_kommentare.fk_forum_traad', 'forum_traad.id');
        $this->db->where('forum_traad.id', $id);
       
        $query = $this->db->get();
       
       
        if($query->num_rows > 0)
        {
            return $query->row();
        } else {
            return false;
        }
       
    }
   
}

View:

<div id="forum">
   
        <?php
        if($query)
        {
        ?>
        <div class="forum_headline">Forum kategori - Forum tråde - <?php echo $query->overskrift; ?></div><!-- forum_headline -->
        <div class="forum_profil_img"><?php ?></div><!-- forum_profil_img -->
        <div class="forum_post_content">
            <span style="font-size:15px;"><?php echo anchor('profil/'.$query->traad_brugernavn, $query->traad_brugernavn); ?></span>
            <span style="font-size:11px; margin-left:3px; color:#686868;"><i> Siger</i></span><br>
            <?php echo nl2br($query->traad_indhold);
            ?>
        </div><!-- forum_post_content -->
   

       
        <?php
        } else {
            echo "Der blev ikke fundet nogen tråd";
        }
        ?>
       
</div><!-- forum -->



CREATE TABLE `forum_kommentare` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fk_forum_traad` int(11) NOT NULL,
  `brugernavn` text NOT NULL,
  `indhold` mediumtext NOT NULL,
  `dato` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `godkendt` varchar(4) NOT NULL DEFAULT 'ja',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=156 ;


CREATE TABLE `forum_traad` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `overskrift` text NOT NULL,
  `indhold` mediumtext NOT NULL,
  `fk_forum_kategori` int(11) NOT NULL,
  `brugernavn` text NOT NULL,
  `dato` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `godkendt` varchar(4) NOT NULL DEFAULT 'ja',
  `status` varchar(8) NOT NULL DEFAULT 'aaben',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;


CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(80) NOT NULL,
  `password` text NOT NULL,
  `kon` varchar(5) NOT NULL,
  `alder` int(11) NOT NULL,
  `hood` varchar(4) DEFAULT NULL,
  `fornavn` varchar(60) DEFAULT NULL,
  `efternavn` varchar(100) DEFAULT NULL,
  `city` text,
  `ip` varchar(20) DEFAULT NULL,
  `level` text,
  `email` text,
  `point` int(11) NOT NULL,
  `hjemmeside` text NOT NULL,
  `oprettet` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `vis_email` varchar(3) NOT NULL,
  `fritekst` mediumtext NOT NULL,
  `profil_billed` text NOT NULL,
  `online` varchar(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;
Avatar billede repox Seniormester
16. november 2010 - 18:08 #10
Har du taget stilling til mine kommentarer i #7 og #8?
Avatar billede sijmonj Nybegynder
16. november 2010 - 22:15 #11
repox, jeg har prøvet at lave det lidt om, sådan at nu viser den tråden og det, men mangler at kunne udskrive "profil_billed" feltet fra min users tabel, tror du at du kan hjælpe mig med det
Avatar billede sijmonj Nybegynder
17. november 2010 - 00:49 #12
nu har jeg fået lavet det her

        $this->db->select('*,forum_traad.indhold as traad_indhold,
                            forum_traad.brugernavn as traad_brugernavn,
                            forum_traad.id as traad_id,
                            users.profil_billed as profil_billed
                          ');
        $this->db->from('forum_traad');
        $this->db->join('users', 'forum_traad.brugernavn = users.username', 'left');
        $this->db->where('forum_traad.id', $id);
       
        $query = $this->db->get();
       
        echo $this->db->last_query();


det virker fint, men den henter ikke nogen felter fra users tabellen.

jeg har valgt at hente kommentare til tråden og selv tråden hver for sig, så håber jeg det er "nemmere" med det join noget
Avatar billede repox Seniormester
17. november 2010 - 09:37 #13
#12
Jeg har nu sat et standard CI miljø op og bare puttet din model, controller og view ind for at løbe dit problem igennem; og umiddelbart virker det fint herfra, når man bare husker at rette den til $this->db->join('users', 'forum_traad.brugernavn = users.username', 'left');. At din løsning så ikke er videre elegant er en helt anden sag. At du ikke kan få det til at virke, forstår jeg så ikke.
Avatar billede sijmonj Nybegynder
17. november 2010 - 13:55 #14
#13
når jeg så prøver at  echo $query->profil_billed;
i min view så udskriver den ingenting, og er sikker på at der er noget i mit profil_billed felt i database tabellen, det lidt det problem jeg har
Avatar billede repox Seniormester
17. november 2010 - 18:48 #15
Som sagt, så fungerer det ganske fint hos mig med den lille ændring som jeg nævnte før. Det er svært at løse et problem som ikke kan reproduceres.
Mit bedste bud er at forum_traad.brugernavn ikke stemmer overens med users.brugernavn - kontroller at begge felter indeholder nøjagtigt det samme...
Avatar billede sijmonj Nybegynder
17. november 2010 - 19:12 #16
ahh nu virker det os her :D Tusind mange tak ! :p så kan jeg endelig komme videre, smid svar
Avatar billede repox Seniormester
17. november 2010 - 20:37 #17
Det fik du her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester