Avatar billede flashnoob Nybegynder
17. november 2004 - 18:06 Der er 22 kommentarer og
1 løsning

Udtræk alt fra 2 tabeller

Hej. Hvordan trækker jeg alt ud fra 2 tabeller?
Lige nu har jeg det her:

$query="SELECT * FROM blog ORDER BY blogid DESC";
        $db = new database('mysql');
        $result=$db->query($query,"rows");
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
        {
            echo "<hr />"."<div id='timestamp'>Skrevet ".$row[time]."</div> <br />";
            echo "<div id='headline'>".$row[maintxt]."</div>";
            echo "<br /> <div id='text'>".$row[text]."</div> <br />";


1. Men jeg vil gerne i samme åndedrag trække alt ud fra tabellen comments. Hvordan gør jeg det?

2.Og er det muligt at finde ud af hvor mange comments der er for en blogid. Jeg har på fornemmelsen at man bruger et array til det og kalder størrelsen på det, ik'?!
Avatar billede Slettet bruger
17. november 2004 - 18:14 #1
1. SELECT * FROM blog,comments ORDER BY blogid DESC


2. forstår jeg ikke? hvordan ser dine tabeller ud?
Avatar billede hmortensen Nybegynder
17. november 2004 - 18:16 #2
I tabellen comments har du vel et felt der refferere til et id i blogid:

SELECT * FROM blog b, comments c WHERE b.id = c.reffelt GROUP BY b.id ORDER BY b.id DESC
Avatar billede flashnoob Nybegynder
17. november 2004 - 18:46 #3
Hm...
OKay, mine tabeller er simple

blog
--------------------------------
blogid | time | text | maintxt |
--------------------------------

comments
---------------------------------------------------------------
commentid | blogid | text | author | comment | commentmaintxt |
---------------------------------------------------------------

Jeg vil så trække alt ud af begge tabeller og lægge dem ind så jeg kan kalde dem med f.eks. $row[time] eller $row[comment].
Dog skal kommentarerne med i while-løkken, så de kommer under det blogid de tilhører.
håber du forstår nu gartzen.

hmortensen -> Hm, jeg kan ikke få det til at virke. Den kommer med en fejl når arrayet bliver lavet ( while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) ).
Avatar billede hmortensen Nybegynder
17. november 2004 - 19:10 #4
SELECT * FROM blog b, comments c WHERE b.id = c.blogid GROUP BY b.id ORDER BY b.id DESC

Prøv at sætte en or die(mysql_error()); efter din query
Avatar billede flashnoob Nybegynder
17. november 2004 - 19:33 #5
Nej, jeg kan stadig ikke få det til at virke...

fejl:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\appserv\www\blaa\cb\index.php on line 29


linie 29 er linien med --> while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
Avatar billede hmortensen Nybegynder
17. november 2004 - 19:59 #6
Så prøv med or die(mysql_error()); så du kan få en mysql fejl d kan bruge til noget
Avatar billede flashnoob Nybegynder
17. november 2004 - 20:38 #7
Så kommer fejlen "Unknown column 'b.id' in 'where clause'", men hvad betyder det sidste i den?
Avatar billede hmortensen Nybegynder
17. november 2004 - 20:40 #8
Måske sådan her så:
SELECT * FROM blog b, comments c WHERE b.blogid = c.blogid GROUP BY b.blogid ORDER BY b.blogid DESC
Avatar billede flashnoob Nybegynder
17. november 2004 - 20:43 #9
Ja, det prøvede jeg også, så er fejlen der heller ikke mere, men skærmen er tom...
Avatar billede flashnoob Nybegynder
17. november 2004 - 20:45 #10
Og der skal vel f.eks. skrives $row[b.time]? eller hvordan?
Avatar billede hmortensen Nybegynder
17. november 2004 - 20:46 #11
Mener at det er $row['b_time']
Avatar billede flashnoob Nybegynder
17. november 2004 - 20:47 #12
Næh.. virker heller ikke..
Avatar billede hmortensen Nybegynder
17. november 2004 - 20:48 #13
Prøv at skrive din kode som den er nu
Avatar billede flashnoob Nybegynder
17. november 2004 - 20:49 #14
$query="SELECT * FROM blog b, comments c WHERE b.blogid = c.blogid GROUP BY b.blogid ORDER BY b.blogid DESC";
        $db = new database('mysql');
        $result=$db->query($query,"rows");
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC)or die(mysql_error()));
        {
            echo "<hr />"."<div id='timestamp'>Skrevet ".$row['b.time']."</div> <br />";
            echo "<div id='headline'>".$row['b.maintxt']."</div>";
            echo "<br /> <div id='text'>".$row['b.text']."</div> <br />";
}
Avatar billede flashnoob Nybegynder
17. november 2004 - 22:04 #15
Jeg slettede lige or die(mysql_error()); og så kom der et resultat på skærmen... men kun ét enkelt, hvilket er den første fra DB. Hvordan kan det være?
Avatar billede jakoba Nybegynder
29. november 2004 - 12:05 #16
Der skal aldrig  or die  på mysql_fetch_array  den skal have lov til at returnere false tilsidst.

det skal på  mysql_query .  Men siden du har din mysql_query gemt indeni dit $db objekt kan vi kun gætte på hvordan det skal gøres.

din  GROUP BY er noget tvivlsom, for at kunne gruppere skal ALLE felter i de rækker der grupperes have samme værdi i hele gruppen (ellers kan mysql ikke vide hvilken værdi den skal vælge at returnere for felter hvor der er flere mulige værdier i gruppen)

mvh JakobA
Avatar billede flashnoob Nybegynder
29. november 2004 - 21:50 #17
Hej jakoba, tak for afklaringen med hensyn til or die.
Jeg fandt en løsning på problemet med at der kun kom ét resultat ud. Nu ser min kode således ud (men tror det er noget shit-kode, kan det skrives bedre( jeg mener i stedet for at åbne til databasen 2 gange)??) :

$query="SELECT * FROM blog ORDER BY blogid DESC";
        $db = new database('mysql');
        $result=$db->query($query,"rows");
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
        {
            $query2="SELECT * FROM comments WHERE blogid =".$row[blogid];
            $db2 = new database('mysql');
            $result3=$db2->query($query2,"rows");
           
            echo "<hr />"."<div id='timestamp'>Skrevet ".$row[time]."</div> <br />";
            echo "<div id='headline'>".$row[maintxt]."</div>";
            echo "<br /> <div id='text'>".$row[text]."</div> <br />";
}
Avatar billede jakoba Nybegynder
29. november 2004 - 22:02 #18
Jeg er nødt til at gætte her for jeg ved jo stadig ikke hvordan dine $db objekter er opbygget indeni. men 99% sikker på at det er unødvendigt at oprette nyt objekt
    $db2 = new database('mysql');
hver gang du vil have en query
    $result3=$db->query($query2,"rows");  // samme $db, blot andet navn til resultatsæt
skulle være nok (og spare en hel del tid).

på den anden side bruger du da vist overhovedet ikke data fra $result3 til noget

mvh JakobA
Avatar billede flashnoob Nybegynder
29. november 2004 - 22:30 #19
Okay. Jeg indsætter lige min database-connect fil:

class database
{   
    var $dbHost="localhost";
    var $dbName="min-database";
    var $dbUser="root";
    var $dbPass="";
   
    var $conn;
    var $dbType;
    var $dbResult;   
    var $dbselected;   
    var $errmsg;
    var $rs;
    var $returnType;

    function database($dbType='mysql')
    {
        $this->dbType = $dbType;       
    }

    function query($sql='', $returnType='')
    {
   
        $this->returnType=$returnType;
        $this->conn = $this->priv_openDbCon();
        if (!$this->conn) {       
            return $this->conn;
        }       
        $this->dbselected=$this->priv_selectDb();
        if(!$this->dbselected) {
            return $this->dbselected;
        }       
        $this->rs = $this->priv_sqlQuery($sql);   
        if(!$this->rs) {
            return $this->rs;
        }
        //now we have connection, selected db and the sql ok
        //now we ask what program want to have returned
        switch($this->returnType)
        {
            case "rows":                   
                return $this->rs;           
                break;
            case "lmnt":
                  //return only one row
                  $data = mysql_fetch_row($this->rs);
                  return $data[0];
                  break;
            case "insert":
                return $this->rs;
                break;
            case "replace":
                return $this->rs;
                break;
            case "update":           
                return $this->rs;
                break;
            case "delete":
                return $this->rs;
                break;
        }
        unset($this->rs);
        mysql_close($this->conn);
    }

    function priv_openDbCon()
    {
        $dbCon = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass);
        if(!$dbCon)
        {             
            $this->errmsg="Connection Error: Unable to Connect!\n";
        }else {
            $this->errmsg="No errors";
        }
        return $dbCon;
    }

    function priv_selectDb()
    {
        $dbselected=mysql_select_db($this->dbName);
        if(!$dbselected) {
            $this->errmsg="Db error: Unable to Select!\n";
        }else {
            $this->errmsg="No errors";
        }
        return $dbselected;
    }

    function priv_sqlQuery($sql)
    {
        //$sqlOutput can be ressource - SELECT,SHOW,EXPLAIN or DESCRIBE statements or false
        //$sqlOutput can be true or false for other type of SQL statements
        //always false if not working
        $sqlOutput    = mysql_query($sql);
        if(!$sqlOutput) {
            $this->errmsg="Query error: Unable to Query!";
        }else {
            $this->errmsg="No errors";
        }
        return $sqlOutput;       
    }
}

--> det er en jeg har fundet, så jeg ved ikke helt hvordan den fungerer. Men man kan da se hvad $db bliver brugt til. Jeg kan se din pointe mht. "samme $db, blot andet navn til resultatsæt" og laver det om.

$result3 bliver brugt i en while-sætning under den jeg skrev tidligere:

    while ($row2= mysql_fetch_array($result3, MYSQL_ASSOC))
                {
                    if ($row2[email] != NULL)                     {
                        $email = "<a href='mailto:".$row2[email]."' target='_top'><img src='email_ikon.gif' border='0' alt='Email' title='Skriv en mail til ".$row2[author]."'> <span title='Skriv en mail til ".$row2[author]."' class='program_ikon_inaktiv'>Email</span></a>";
                    }
Avatar billede jakoba Nybegynder
29. november 2004 - 23:01 #20
Fint.  Og gættet var korrekt, ingen grund til at oprette nyt db ojekt hver gang.

Hvad der altid forbløffer mig ar et folk der skriver den slags tror de gør det *nemmere* at bruge en database. Alt hvad de opnår er at gøre det sværere for folk at lære at bruge den ordentligt. Som regel har de heller ikke lært det selv (hvorfor oprette ny connection for hver query?). Men det ser ud til den virker.

Det ser ud til det er strukturen i din kode der er gal.  din øverste while løkke slutter i den kode du gav først:

$query="SELECT * FROM blog ORDER BY blogid DESC";
        $db = new database('mysql');
        $result=$db->query($query,"rows");
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
        {
            $query2="SELECT * FROM comments WHERE blogid =".$row[blogid];
            $result3=$db->query($query2,"rows");
         
            echo "<hr />"."<div id='timestamp'>Skrevet ".$row[time]."</div> <br />";
            echo "<div id='headline'>".$row[maintxt]."</div>";
            echo "<br /> <div id='text'>".$row[text]."</div> <br />";
      }
      // nu er den while løkke slut så det der står i $result3 er blevet overskrevet igen og igen af anden, tredie, osv gemmengang. Det der nu er i den er det der kom i den allersidste tur igennem løkken.

og det bliver så udskrevet (een gang) i den løkke der kommer nedenunder.
Avatar billede jakoba Nybegynder
29. november 2004 - 23:11 #21
Det du menere er nok snarere noget i retning af:

$query="SELECT * FROM blog ORDER BY blogid DESC";
        $db = new database('mysql');
        $result=$db->query($query,"rows");
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
        { //her starter while_1
            $query2="SELECT * FROM comments WHERE blogid =".$row[blogid];
            $result3=$db->query($query2,"rows");
       
            echo "<hr />"."<div id='timestamp'>Skrevet ".$row[time]."</div> <br />";
            echo "<div id='headline'>".$row[maintxt]."</div>";
            echo "<br /> <div id='text'>".$row[text]."</div> <br />";

            while ($row2= mysql_fetch_array($result3, MYSQL_ASSOC))
            { // her starter while_2
                if ($row2[email] != NULL)
                { // her starter while_2's if
                    $email = "<a href='mailto:".$row2[email]."' target='_top'><img src='email_ikon.gif' border='0' alt='Email' title='Skriv en mail til ".$row2[author]."'> <span title='Skriv en mail til ".$row2[author]."' class='program_ikon_inaktiv'>Email</span></a>";
                } // her slutter while_2's if
            } // her slutter while_2
        } // her slutter while_1

Det der med at markere start og slut er ofte en god ide for at få styr på programmets struktur, jeg er øvet nok til ofte at kunne klare mig uden, men nogen gange gør jeg det alligevel for at være sikker på hvad jeg laver :-))

mvh JakobA
Avatar billede flashnoob Nybegynder
29. november 2004 - 23:14 #22
Det er heller ikke meningen at den whileløkke skal slutte der :) Det var bare en }-jeg satte på for at, I ikke skulle kommentere at den manglede :)

Her er hele koden...:

$query="SELECT * FROM blog WHERE blogid=".$id."";
        $db = new database('mysql');
        $result=$db->query($query,"rows");
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
        {
            $query2="SELECT * FROM comments WHERE blogid =".$row[blogid];
            $db2 = new database('mysql');
            $result3=$db2->query($query2,"rows");

            echo "<hr />"."<div id='timestamp'>Skrevet ".$row[time]."</div> <br />";
            echo "<div id='headline'>".$row[maintxt]."</div>";
            echo "<br /> <div id='text'>".$row[text]."</div> <br />";

                while ($row2= mysql_fetch_array($result3, MYSQL_ASSOC))
                {
                    if ($row2[email] != NULL) //Vi kører lige en if for at se om der er tilknyttet en email til kommentaren, hvis der er, tildeles den $email
                    {
                        $email = "<a href='mailto:".$row2[email]."' target='_top'><img src='email_ikon.gif' border='0' alt='Email' title='Skriv en mail til ".$row2[author]."'> <span title='Skriv en mail til ".$row2[author]."' class='program_ikon_inaktiv'>Email</span></a>";
                    }

                        if ($row2 !=" ")
                                    {

                                        echo "Her står en hel masse";
                                    }
                    $email=NULL; //Vi sætter email til NULL, da der ellsrs ville stå sidst fundne email, ved email=Null fra databasen.
                }
        }


--> Med hensyn til "(hvorfor oprette ny connection for hver query?)." Så er det mig selv der puslede med det og dermed ikke 'forfatteren' til databasefilen :) (Så jeg er den skyldige).
Avatar billede flashnoob Nybegynder
01. maj 2006 - 23:25 #23
Svarer I lige så jeg kan lukke spørgsmålet ;}
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