17. november 2004 - 18:06Der 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'?!
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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?
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)) ).
$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 />"; }
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?
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)
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");
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
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_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>"; }
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.
$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");
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 :-))
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");
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).
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.