09. april 2007 - 18:36Der er
29 kommentarer og 1 løsning
20 nyeste, der ikke er i en anden database
Ok, jeg har et script til at hente de 20 nyeste beskeder i mit forum.
Mit problem er at jeg nu har lavet en section der kun er for admins, og denne kode skriver også de 20 nyeste beskeder i admin forummet sammen med de andre.
I virkeligheden bygger mit forum på et noget specielt system jeg udviklede for en del år siden og forummet har nu over 20.000 posts, så der er ikke så meget jeg kan ændre der.
Jeg har 3 databaser, en med kategorier (den er i og for sig lige meget), en med tråde og til sidst den med alle beskederne i.
Ok, mere specifict skal koden:
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%y %T') AS date FROM LovehinaForum3 where status = '0' order by id desc limit $offset,$range") or die(mysql_error());
ændres så den kun henter de indlæg fra LovehinaForum3 hvor OverId passer til en id på en post i LovehinaForum2 hvor Status er 0 :S
Ved godt det lyder noget kompliceret, men håber aligevel en af jer eksperter forstår hvad jeg mener og har en løsning på problemmet :S
LovehinaForum2 CREATE TABLE `LovehinaForum2` ( `id` int(11) NOT NULL auto_increment, `OverId` int(11) NOT NULL default '0', `UserId` int(11) NOT NULL default '0', `header` varchar(255) NOT NULL default '0', `date` datetime NOT NULL default '0000-00-00 00:00:00', `LastWriter` varchar(255) NOT NULL default '0', `Status` int(11) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM
LovehinaForum3 CREATE TABLE `LovehinaForum3` ( `id` int(11) NOT NULL auto_increment, `OverId` int(11) NOT NULL default '0', `UserId` int(11) NOT NULL default '0', `text` text NOT NULL, `date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=MyISAM
Koden: <?php
$range = 20; // Antal resultater pr. side $offset = isset($_GET['offset']) ? $_GET['offset'] : 0;
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%y %T') AS date FROM LovehinaForum3 where status = '0' order by id desc limit $offset,$range") or die(mysql_error()); if (mysql_num_rows($query) == 0) { echo 'Wups, something is wrong..<br>'; } else { echo '<table width="100%" id="list"><tr><td></td><td></td></tr>'; while($row = mysql_fetch_array($query)) {
$hent2 = mysql_query("SELECT * FROM LoveHinaUSERS WHERE id = '$row[UserId]'") or die(mysql_error()); $vis2 = mysql_fetch_array($hent2); if ($vis2[img] == 0) { $theimg = "nopicture"; } else { $theimg = $vis2[id]; } $besked = $row[text];
$query = mysql_query(" SELECT lf3.*, DATE_FORMAT(lf3.date,'%e/%c-%y %T') AS date FROM LovehinaForum3 AS lf3 INNER JOIN LovehinaForum2 AS lf2 ON lf3.OverId = lf2.id WHERE lf3.status = '0' ORDER BY lf3.id DESC LIMIT $offset,$range ") or die(mysql_error());
ups, har lige fundet ud af at det slet ikke virkede :S doh, troede bare det virkede frodi jeg ikke lige kunne finde det jeg havde skrevet i admin forummet, men det virker ikke..
Den skriver det bare helt alm. ud :S
Ligesom den gjorde det før.
$query = mysql_query(" SELECT lf3.*, DATE_FORMAT(lf3.date,'%e/%c-%y %T') AS date FROM LovehinaForum3 AS lf3 INNER JOIN LovehinaForum2 AS lf2 ON lf3.OverId = lf2.id WHERE lf2.Status = '0' ORDER BY lf3.id DESC LIMIT $offset,$range ") or die(mysql_error());
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%y %T') AS date FROM LovehinaForum3 order by id desc limit $offset,$range") or die(mysql_error());
Ud :)
Hvad jeg gerne vil have er at den skal skrive
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%y %T') AS date FROM LovehinaForum3 where XXXXX order by id desc limit $offset,$range") or die(mysql_error());
hvor XXXXX er at den tjekker i LovehinaForum2 på LovehinaForum3's OverId og LovehinaForum2's id, og ser om Status i LovehinaForum2 er = 0 :)
Det er godt nok svært at forklare :S
Eksempel:
Lad os sige at der er en post i LovehinaForum3 med OverId=20 og en post i LovehinaForum2 med id=20 og Status=1 så skal den ikke skrive ud.
hvis der så er en post i LovehinaForum3 med OverId=21 og en post i LovehinaForum2 med id=21 og Status=0 så SKAL den skrives ud :)
Måske kan flg. bruges, hvis din mySQL version understøtter subselect: SELECT * FROM LovehinaForum3 WHERE OverId IN (SELECT Id FROM LovehinaForum2 WHERE Status = 0)
$query = mysql_query(" SELECT lf3.*, DATE_FORMAT(lf3.date,'%e/%c-%y %T') AS date FROM LovehinaForum3 AS lf3 INNER JOIN LovehinaForum2 AS lf2 ON lf3.OverId = lf2.id WHERE lf2.Status = '0' ORDER BY lf3.id DESC LIMIT $offset,$range ") or die(mysql_error());
Prøv at køre flg. kode og smid resultat her: <?php
//connect til db
$q1 = mysql_query("SELECT Id FROM LovehinaForum2 WHERE Status = 0 ORDER BY Id LIMIT 20"); while ($r1 = mysql_fetch_assoc($q1)) { echo $r1['Id']."<br>"; }
echo "<hr>";
$q2 = mysql_query("SELECT OverId FROM LovehinaForum3 WHERE OverId IN (SELECT Id FROM LovehinaForum2 WHERE Status = 0 ORDER BY Id) LIMIT 20"); while ($r2 = mysql_fetch_assoc($q2)) { echo $r2['OverId']."<br>"; }
Argh, nu fandt jeg fejlen :O Det er jeg altså virkelig ked af, det er mig der har haft lavet en fejl fra starten af, af en eller anden grund har den kun skreivet Status in i LovehinaForum1 og ikke i LovehinaForum2 :S Så aller har kunne læse det, hvis ellers de havde fået et link :O
Det er jeg altså virkelig ked af, føler mig godt nok dum nu :)
Synes godt om
Ny brugerNybegynder
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.