Pangaea Skrevet 19. mai 2004 Del Skrevet 19. mai 2004 (endret) Jeg er ikke akkurat noe reser i SQL må jeg innrømme, og lurer derfor på hvordan SQLen her ser ut? Er det mye som kan/bør forandres for å få det litt mer "økonomisk"? <?php $query = "SELECT * FROM acdc_rumour, acdc_user WHERE acdc_rumour.user_id = acdc_user.user_id ORDER BY created DESC"; $result = mysql_query($query) or die("Query failed : " . mysql_error()); while ($record = mysql_fetch_assoc($result)) { $created = strtotime($record['created']); $created = date("jS F Y @ H:i", $created); echo $created." by <a href='mailto:".$record['email']."'>".$record['username']."</a>"; if($record['updated'] <> NULL) { $query2 = "SELECT * from acdc_user, acdc_rumour WHERE acdc_rumour.updated_by = acdc_user.user_id AND acdc_rumour.rumour_id = ".$record['rumour_id']; $result2 = mysql_query($query2) or die("Query failed : " . mysql_error()); $record2 = mysql_fetch_assoc($result2); $updated = strtotime($record['updated']); $updated = date("jS F Y @ H:i", $updated); echo " - Last updated: ".$updated." by <a href='mailto:".$record2['email']."'>".$record2['username']."</a><br/><br/>"; } else { echo "<br/><br/>"; } echo "<b>".$record['title']."</b><br/><br/>"; echo make_html(nl2br($record['rumour']))."<br/><br/>"; $user_id = $record['user_id']; $rumour_id = $record['rumour_id']; if($_SESSION['loggedin'] == "true" && ((usercheck() && $_SESSION['user_id'] == $user_id) || admincheck())) { echo "<a href='index.php?page=rumour_edit&id=$rumour_id'>Edit Rumour</a> - "; } $query3 = "SELECT COUNT(*) as num FROM acdc_comment WHERE rumour_id=$rumour_id"; $result3 = mysql_query($query3) or die("Query failed : " . mysql_error()); $record3 = mysql_fetch_assoc($result3); $num = $record3['num']; echo "<a href='index.php?page=rumour_comment&id=$rumour_id'>Add/View Comments (".$num.")</a><hr>"; } ?> Endret 19. mai 2004 av Pangaea Lenke til kommentar
sven-o Skrevet 19. mai 2004 Del Skrevet 19. mai 2004 Herregud for en kodesuppe! Prøv heller å forklare db-strukturen din, og hva du ønsker å få ut. Lenke til kommentar
rogbiff Skrevet 19. mai 2004 Del Skrevet 19. mai 2004 Det er også mye bedere å bruke functions, indenting, switch. Et helt kapittel i php-bibelen min heter "Organazing your code". Din kode er et eksempel på spagetti Prøv å strukturere koden din mer "ryddig" først , så noen orker å lese den. Det kan også som sagt over, være greit om du viste oss db-strukturen din. Lenke til kommentar
Pangaea Skrevet 19. mai 2004 Forfatter Del Skrevet 19. mai 2004 Ok, db struktur... CREATE TABLE acdc_rumour ( rumour_id INTEGER(6) UNSIGNED NOT NULL AUTO_INCREMENT, user_id INTEGER(6) UNSIGNED NOT NULL, created DATETIME NOT NULL, updated DATETIME NULL, updated_by INTEGER(6) UNSIGNED NULL, title Varchar(100) NOT NULL, rumour TEXT NOT NULL, PRIMARY KEY(rumour_id), INDEX acdc_rumour_FKIndex1(user_id) ); CREATE TABLE acdc_user ( user_id INTEGER(6) UNSIGNED NOT NULL AUTO_INCREMENT, username Varchar(50) NOT NULL, pass Varchar(100) NOT NULL, email Varchar(100) NOT NULL, firstname Varchar(50) NULL, lastname Varchar(50) NULL, bday_day INTEGER(2) UNSIGNED NULL, bday_month INTEGER(2) UNSIGNED NULL, bday_year INTEGER(4) UNSIGNED NULL, country_id INTEGER(3) UNSIGNED NOT NULL, location Varchar(50) NULL, url Varchar(100) NULL DEFAULT 'http://', icq Varchar(50) NULL, msn Varchar(100) NULL, notes TEXT NULL, user_active ENUM('0','1') NOT NULL, user_level ENUM('0','1','2','3') NOT NULL, joined DATETIME NOT NULL, last_login DATETIME NOT NULL, PRIMARY KEY(user_id), INDEX acdc_user_FKIndex1(country_id) ); CREATE TABLE acdc_comment ( comment_id INTEGER(6) UNSIGNED NOT NULL AUTO_INCREMENT, name Varchar(100) NOT NULL, date DATETIME NOT NULL, text TEXT NOT NULL, book_id INTEGER(3) UNSIGNED NULL, rumour_id INTEGER(6) UNSIGNED NULL, trader_id INTEGER(6) UNSIGNED NULL, release_id INTEGER(6) UNSIGNED NULL, album_id INTEGER(2) UNSIGNED NULL, member_id INTEGER(2) UNSIGNED NULL, song_id INTEGER(4) UNSIGNED NULL, bootleg_id INTEGER(6) UNSIGNED NULL, news_id INTEGER(6) UNSIGNED NULL, article_id INTEGER(6) UNSIGNED NULL, PRIMARY KEY(comment_id), INDEX acdc_comment_FKIndex1(article_id), INDEX acdc_comment_FKIndex2(news_id), INDEX acdc_comment_FKIndex3(bootleg_id), INDEX acdc_comment_FKIndex4(song_id), INDEX acdc_comment_FKIndex5(member_id), INDEX acdc_comment_FKIndex6(album_id), INDEX acdc_comment_FKIndex7(release_id), INDEX acdc_comment_FKIndex8(trader_id), INDEX acdc_comment_FKIndex9(rumour_id), INDEX acdc_comment_FKIndex10(book_id) ); Har en tabell for alle kommentarer, som jeg så kobler mot hva hva som blir kommentert. Synst det ble for mye å ha en egen kommentartabell til alle tingene man kan legge inn kommentarer til. Jeg ønsker å få ut nyhetene (eller rykter i dette tilfellet) på en side. Først skal det stå når det ble lagt inn i databasen og av hvem, med email. Om ryktet har blitt oppdatert skal det også komme med med hvem som har oppdatert, når og med email. Så kommer selve ryktet. Til slutt en link til hvor man kan se/legge inn kommentarer til artikkelen, med hvor mange kommentarer som er lagt inn til hver artikkel. Det fungerer sånn som det er nå, men det er vel ganske klønete kodet. Hvordan skal man løse SQL-biten? Join og subselect er ganske gresk for meg, må det brukes? Lenke til kommentar
dagatle Skrevet 19. mai 2004 Del Skrevet 19. mai 2004 Ikke for å være frekk eller noe men jeg ville foreslå at du begynner med et enkelt oppsett og får mere kjøtt på beina vedrørende programmering og sql. Dette er ikke vondt ment men den koden du presenterte der minner veldig om noe ferdig kvernet kode fra modelator eller lignende. Min mening er at du bør skrive mer av dette selv så vil du kjapt se løsningene. Prøv phpmyadmin et utrolig bra værktøy for mySQL databaser. Lenke til kommentar
Pangaea Skrevet 19. mai 2004 Forfatter Del Skrevet 19. mai 2004 Nå har jeg skrevet alt selv, bare lurte på hva jeg må gjøre for å få SQL-biten bedre siden jeg er dårlig på det. Lenke til kommentar
buskmann Skrevet 20. mai 2004 Del Skrevet 20. mai 2004 Ingen grunn til å fikse noe som fungerer. Lenke til kommentar
jorgis Skrevet 20. mai 2004 Del Skrevet 20. mai 2004 Jo. Kan man spare en spørring eller to, evt. tredve millisekunder eller to er det toppers. Lenke til kommentar
Pangaea Skrevet 20. mai 2004 Forfatter Del Skrevet 20. mai 2004 Sorry for å bumpe denne her, men lurer fortsatt på om noen har forslag til hvordan jeg eventuelt kan spare litt på sql-biten. Jeg ser det ikke selv, siden alle har ulike where... Sånn som det er nå, blir det 2 eller 3 queries per nyhet, hadde selfølgelig vært bedre med en query per nyhet. Er det mulig å få det til? Lenke til kommentar
rogbiff Skrevet 21. mai 2004 Del Skrevet 21. mai 2004 Det første jeg legger merke til, er at $query1 = $query2 = "SELECT * from acdc_user, acdc_rumour" ! Hvorfor har du brukt 2 like spørringer ? For det andre er det heller ikke veldig smart å bruke * i select queries, da dette tar lenere tid og hvis du enevtuelt skulle legge til et felt i tabellen, så ville også denne bli valgt. Bruk derfor : "SELECT username,news,posted..... FROM ......" dette er mye raskere. Vis det er nyheter som shal "printes", kan det jo være greit å ha flere sider og bruke LIMIT i mysql queries, da dette også sparer på resursene. Vil også informere at mysql_fetch_row() er mye raskere enn mysql_fetch_assoc(). Lenke til kommentar
Pangaea Skrevet 21. mai 2004 Forfatter Del Skrevet 21. mai 2004 Okay, takk for tips. Grunnen til de to ganske like spørringene er at først tar den inn hvem som har skrevet nyheten, og etterpå hvem som eventuelt har oppdatert den. Kan dette gjøres i en spørring? Lenke til kommentar
Torbjørn Skrevet 21. mai 2004 Del Skrevet 21. mai 2004 (endret) Det første jeg legger merke til, er at $query1 = $query2 = "SELECT * from acdc_user, acdc_rumour" ! Hvorfor har du brukt 2 like spørringer ? For det andre er det heller ikke veldig smart å bruke * i select queries, da dette tar lenere tid og hvis du enevtuelt skulle legge til et felt i tabellen, så ville også denne bli valgt. Bruk derfor : "SELECT username,news,posted..... FROM ......" dette er mye raskere. hvorfor er det raskere? jeg kjenner ikke detaljene, men å ukritisk bare hente alt kan høres kjappere ut enn å måtte gå inn og finne de spesifike kolonnene man er ute etter. Vil også informere at mysql_fetch_row() er mye raskere enn mysql_fetch_assoc(). Dette er feil, det står i manualen at alle tre mysql_fetch_* metodene er like kjappe. Endret 21. mai 2004 av Torbjørn Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå