Avatar billede spidr Nybegynder
09. april 2007 - 18:36 Der 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];

        echo '<tr>';
        echo "<td></td><td>Skrevet i forum threat <a href=http://www.lovehina.dk/LHlaes.php?OverId=$row[OverId]>#$row[OverId]</a><br><hr></td></tr><tr><td width='20%' valign=top><a href='profiles.php?for=$row[UserId]'><img src=css/pics/ppl/$theimg.jpg width=110 border=0><br><b><div class=stor align=center>$vis2[Nickname]</div></b></a></td>";
        echo "<td width=80% valign=top>$besked<br><br><br></td></tr>";
        echo '<tr><td width="20%" valign=top><br>Posts: '.$vis2[posts].'<br>Level: '.$vis2[lvl].'</td><td width="80%"><div align=right><i>Written: '.$row[date].'</i></div><hr>'.$vis2[signature].'</td></tr><tr><td COLSPAN=2><hr><br></td></tr>';
    }
    echo '</table>';
$antal = mysql_result(mysql_query("SELECT COUNT(*) FROM LovehinaForum3"),0);
if ($offset >= $range) {
    $forrige = $offset-$range;
    echo "<a href='?offset=$forrige'>Last</a> | ";
} else {
    echo 'Back | ';
}
if ($antal > $offset+$range) {
    $naeste = $offset+$range;
    echo "<a href='?offset=$naeste'>Next</a> ";
} else {
    echo 'Next ';
}

}
?>
Avatar billede jakobdo Ekspert
09. april 2007 - 18:47 #1
Måske noget i denne stil:

$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());
Avatar billede spidr Nybegynder
09. april 2007 - 18:54 #2
Den siger:
Unknown column 'lf3.Status' in 'where clause'

Og jeg har aldrig leget med inner join, så har ikke rigtigt nogen ide om hvad der er gået galt :S
Avatar billede jakobdo Ekspert
09. april 2007 - 18:56 #3
Du har skrevet status med STORT S.
Det skal være som du har det i din tabel.
WHERE
    lf3.status = '0'
Avatar billede spidr Nybegynder
09. april 2007 - 19:04 #4
Jeg startede med at prøve med lille s, derfeter stort, for det er stort i min database :)
Avatar billede spidr Nybegynder
09. april 2007 - 19:06 #5
Oh, Det skulel være lf2.status og ikke lf3 :D

mange tak Jakobdo, det virkede :)

Får jeg et svar :)?
Avatar billede jakobdo Ekspert
09. april 2007 - 19:08 #6
Kan du tro...
Et svar!
Avatar billede spidr Nybegynder
09. april 2007 - 19:11 #7
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());
Avatar billede jakobdo Ekspert
09. april 2007 - 19:16 #8
Hvad er det så du vil have?
Avatar billede spidr Nybegynder
09. april 2007 - 19:21 #9
Det du har lavet skriver jo bare:

$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 :)

håber det hjalp :)
Avatar billede hmortensen Nybegynder
09. april 2007 - 19:25 #10
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)
Avatar billede spidr Nybegynder
09. april 2007 - 19:29 #11
Næh, det skriver vidst også bare dem alle ud :S ..
Avatar billede jakobdo Ekspert
09. april 2007 - 19:33 #12
Skal det ikke være: WHERE OverID NOT IN (SELECT Id FROM LovehinaForum2 WHERE Status = 0) ??
Avatar billede hmortensen Nybegynder
09. april 2007 - 19:34 #13
Ikke ud fra beskrivelsen, så skal dem med "status = 0" udskrives.
Avatar billede jakobdo Ekspert
09. april 2007 - 19:34 #14
Så forstår jeg ikke hvad der er galt med denne:

$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());

Den burde kun udskrive dem som har lf2.status = 0
Avatar billede spidr Nybegynder
09. april 2007 - 19:36 #15
Nemlig, dem med status = 0 skal udskrives :)

Men det virker ikke hmortensen, den skriver dem ud lige meget hvad Status de har :)
Avatar billede spidr Nybegynder
09. april 2007 - 19:37 #16
Jakobdo, men den udksriver dem alle :/
Avatar billede hmortensen Nybegynder
09. april 2007 - 19:40 #17
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>";
}

?>
Avatar billede spidr Nybegynder
09. april 2007 - 19:42 #18
Avatar billede spidr Nybegynder
09. april 2007 - 19:42 #19
wups, glemte at connecte haha :D
Avatar billede spidr Nybegynder
09. april 2007 - 19:43 #20
Prøv den nu :)
Avatar billede hmortensen Nybegynder
09. april 2007 - 19:44 #21
I det resultat er der ikke nogle af de nederste som ikke fremkommer øverst, så kan ikke lige se problemet.
Avatar billede spidr Nybegynder
09. april 2007 - 19:46 #22
Holda op det er svært at forklare..

Forstår ikke helt hvad du vil poientere :S
Avatar billede spidr Nybegynder
09. april 2007 - 19:48 #23
Jeg prøvede lige at desc dem begge, men det kunne jeg ikke få til at virke, det er jo kun de 20 nyeste der skal visses, ikke de 20 første :)
Avatar billede hmortensen Nybegynder
09. april 2007 - 19:49 #24
Du siger at der kommer poster frem, som ikke har "Status = 0", hvilke poster gør det?
Avatar billede spidr Nybegynder
09. april 2007 - 19:50 #25
Så fik jeg det til at virke, men ok, syntes jeg heller ikke beviser det store :S
Avatar billede spidr Nybegynder
09. april 2007 - 19:50 #26
POsts skrevet i threat 752 landt andet..
Avatar billede spidr Nybegynder
09. april 2007 - 19:53 #27
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

Men mange tak for hjælpen :)
Avatar billede hmortensen Nybegynder
09. april 2007 - 19:54 #28
Kunne heller ikke forstå hvis det ikke virkede :)
Avatar billede jakobdo Ekspert
09. april 2007 - 19:55 #29
Haha, takker for point.
Avatar billede spidr Nybegynder
09. april 2007 - 19:55 #30
Det er jeg altså virkelig ked af, føler mig godt nok dum nu :)
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