Eli olen tässä kohta 1,5kk työstänyt foorumia ja törmännyt ensimmäiseen todelliseen ongelmaan. Tämä koodini ei näytä kuin yhden erillaisen kuvan, mihin on tullut uusia viestejä, vaikka kahteen alueeseen on tullut uusia viestejä.
Pistin pari kommenttia selvittämään mitä missäkin tehdään.
<?php $query301 = "SELECT Data, Topick, Aihe, Viesteja, Katsottu, Saapunut FROM foorumi_topicks WHERE Topick = '$forum' ORDER BY Saapunut DESC"; $result305 = mysql_query($query301, $connection); $tulos5 = array(); while ($table = mysql_fetch_array($result305, MYSQL_ASSOC)) { $tulos5[] = $table; } foreach ($tulos5 as $f) { $aihe=$f["Aihe"]; $query302 = "SELECT Alue, Aihe, Viesteja_uusia FROM foorumi_uusia_viesteja WHERE ID = $tempid and Alue='$forum'"; //$forum on get funktiolla haettu. Kertoo millä alueella ollaan. $result302 = mysql_query($query302, $connection); $tulos6 = array(); while ($table = mysql_fetch_array($result302, MYSQL_ASSOC)) { $tulos6[] = $table; } echo "<br>"; foreach ($tulos6 as $R) { $alue = $R["Alue"]; $viesteja_uusia = $R["Viesteja_uusia"]; //Käytännössä turha if ($aihe!=$vanha_aihe) //Tämä on siksi, kun tuo engineni kirjoitti aluksi kaksi kertaa kaikki niin tässä tarkistan onko aihe jo kirjoitettu { if ($R["Aihe"] == $aihe)//mielestäni tässä on selväsi, että jos tietokannasta "foorumi_uusia_viesteja" löytyy vastaava $aihe muuttujan kanssa kirjoitetaan se uusi viesti kuvan kera, mutta silti se kirjoittaa vain sen mihin on viimeisimpänä lähetetty viesti eikä molempia missä on uusi viesti. { echo '<td><img src="kuvat/uusi_viesti.png"><td width=200><b><a href="topicks.php?topick='.$forum.'&forum='.urlencode( $f["Aihe"] ).'">'.htmlentities( $f["Aihe"] ).'</a></b><td width=50><font face="Palatino Linotype" color="#06F91A">'.$f["Viesteja"].'<td width=50><font face="Palatino Linotype" color="#06F91A">'.$f["Katsottu"].'<td><font face="Palatino Linotype" color="#06F91A">'.$f["Saapunut"].'</td><tr>'; } elseif ($R["Aihe"] != $aihe) { echo '<td><img src="kuvat/ei_uusi_viesti.png"><td width=200><b><a href="topicks.php?topick='.$forum.'&forum='.urlencode( $f["Aihe"] ).'">'.htmlentities( $f["Aihe"] ).'</a></b><td width=50><font face="Palatino Linotype" color="#06F91A">'.$f["Viesteja"].'<td width=50><font face="Palatino Linotype" color="#06F91A">'.$f["Katsottu"].'<td><font face="Palatino Linotype" color="#06F91A">'.$f["Saapunut"].'</td><tr>'; } } elseif ($aihe==$vanha_aihe) { } $vanha_aihe=$aihe; //Palautetaan vanha aihe } } } ?>
Koodin luettavuuteen on todella syytä kiinittää huomiota - jouduin lukemaan koodin moneen kertaan ennen kuin sain siitä mitään tolkkua. Koodissa on myös hämäävää terminologiaa - pyri määrittelemään johdonmukaisemmin, mitä tarkoittaa 'forum', 'topick' ja 'aihe'. Koska englannin kielen sana topic (huom. oikeinkirjoitus) on suomeksi aihe sekoittaa lukija helposti nämä termit keskenään.
Ulomman silmukan on ilmeisesti tarkoitus käydä läpi kaikki aiheet. Kullekin aiheelle yrität selvittää, löytyykö
talusta foorumi_uusia_viesteja riviä, jolla olisi aihetta vastaava aihe-kentän arvo. Nykyinen ratkaisusi tähän on virheellinen - sisempi foreach-silmukka toimii vain kerran, jonka jälkeen $aihe ja $vanha_aihe saavat saman arvon, ja mitään ei enää tapahdukaan. Tavoittenahan on vain selvittää, onko ehdot täyttävää riviä olemassa - ei käydä läpi kaikkia tällaisia viestejä.
Ehdotan, että poistat sisemmän foreach-silmukan sisältöineen kokonaan ja korvaat sen SQL-kyselyllä tyyliin
<?php $q = "SELECT Alue, Aihe, Viesteja_uusia FROM foorumi_uusia_viesteja WHERE ID = $tempid and Alue='$forum' and Aihe=$aihe"; ?>
Tämän jäkeen voit mysql_num_rows-funktiolla selvittää, löytyikö tällaisia rivejä ollenkaan eli onko kyseisessä aiheessa uusia viestejä.
Mistä tulee muuttuja $tempid, sitähän ei aseteta missään?
EDIT: Vastaus kirjoitettu uudestaan
- Mitä tietoja sen on tarkoitus hakea ja mistä tauluista?
ensimmäinen taulu "foorumi_topicks": Etsii kaikki alueen aiheet.
Toinen taulu "foorumi_uusia_viesteja": Etsii kaikki käyttäjän ID:llä varustetut ja alueella löytyvät uudet viestit ja niiden aiheiden nimet, jonka jälkeen verrataan jos "foorumi_topicks" löysi aiheen "TEST" ja "foorumi_uusia_viesteja" löytyy sama aihe samasta alueesta niin se asettaa sinne kuvan "uusi_viesti.png".
- Mikä on sisemmän foreach-silmukan tarkoitus? Sen sisällä oleva varsinainen logiikka suoritetaan vain kerran $vanha_aihe==$aihe tarkistuksesta johtuen.
Logiikka on siinä, että ensimmäisessä foreach:ssä etsitään Alueen aiheet ja tallennetaan Aiheiden nimet muuttujaan $aihe, jotta voidaan verrata löytyikö vastinetta uusista viesteistä. Ja saadaan kirjoitettua aiheen nimellä tiedot ylös.
- Mistä tulee muuttuja $tempid, sitähän ei aseteta missään?
Asetetaan, mutta en muistanut ilmoittaa tuosta.
- Miksi ulompi silmukka vertaa topick-kenttää $forum muuttujaan? Aiheen ja foorumin nimet/id:t lienevät eri?
$forum = $_GET['forum'] //Eli etusivulta klikattu joku Alue, mikä tallentuu tuohon muuttujaan ja näin saan etsittyä alueelle tarkoitetut aiheet.
Topick on taas vahinkossa väärä nimitys ja se kuvaa Aluetta. Ei Aihetta.
Tästä taas on se hyöty, että jos teen uuden foorumin tuolta pohjalta vaihdan vain Alueiden nimet ja tuo järjestelmä tekee kaiken puolestani. Eli etsii oikeat Aiheet. (asiasta kolmanteen. Kolme päivää suunnittelin, miten saisin siitä tuollaisen, että vain Alueen nimeä vaihtamalla järjestelmä tekee kaiken puolestani, koska pyrin tekemään kaikesta lähes automaattista laiska kun olen, mutta se nyt ei liittynyt aiheeseen.) Eli riittikö nuo vastaukset selventämään? =)
Jeps, kerkesitkin jo vastaamaan aikaisempaan versioon viestistäni ennen kuin kirjoitin sen uusiksi. Pidä nuo selvennykset kuitenkin näkyvillä. Käsitykseni tosiaan on se, että tuo sisempi foreach-silmukka on kirjoitettu virheellisesti ja olisi helpompaa korvata se esim. tuossa edellisessä viestissä mainitsemallani sql-kyselyllä.
Koodiasi selkeyttäisi huomattavasti myös se, että siirtyisit käyttämään PDO:ta PHP:n oman rajapinnan sijasta.
Triton kirjoitti:
PDO:ta PHP:n oman rajapinnan sijasta.
Erikoisesti sanottu – PDO kuitenkin tulee sanoista PHP Data Objects ja on huomattavasti suuremmassa määrin PHP:n oma rajapinta kuin nuo tavalliset MySQL-funktiot, jotka on tehty suoraan C-kielisen rajapinnan päälle.
Siitä olen kuitenkin samaa mieltä, että PDO:n käyttö kannattaisi. Yksinkertainen esimerkki löytyy Ohjelmointiputkan MySQL ja PHP -oppaan toisesta osasta.
Olen totisesti unohtanut tuon num_rows:in käytön... Eli siis
<?php $q = "SELECT Alue, Aihe, Viesteja_uusia FROM foorumi_uusia_viesteja WHERE ID = $tempid and Alue='$forum' and Aihe=$aihe"; $resulttia = mysql_query($q, $connection); $num_rows = mysql_num_rows($resulttia); ?>
Ei toimi:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/web00439/public_html/foorumi/
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/web00439/public_html/foorumi/
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/web00439/public_html/foorumi/
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/web00439/public_html/foorumi/
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/web00439/public_html/foorumi/
Laitapa viel:
echo $q;
Lisäks muutenkin voisit harjotella debuggaamaan koodias, mysql errorit voisit myös ittelles tulostaa.
Ja toivottavasti yleista_hopinaa.php ei tarkoita, että koodaat jokaiselle aiheelle oman sivun...
Ei tarkoita. Aloitin aikoinani foorumin teon puhtaalta pöydältä (virheellisesti ilman suunnitelmia) silloin 1,5kk sitten. Tein ensin tuon "yleista_hopinaa.php" sivun ja koodasin sinne kaiken liittyen yleiseen höpinään. Sitten huomasin, että menee vaikeaksi jos joka alueella on omansa, joten pidin sen 3 päivän suunnittelu tauon ja suunnittelin täysin automaattisesti toimivan foorumin, mutta en jaksanut vaihtaa tuota nimeä enää, koska sinne pääsy on monen eri linkin alla. Eli mieluiten pidän sen tuon nimisenä. :D
E: MySQL errori:
Unknown column 'TEST' in 'where clause'
Nyt en tajua, koska TEST on siellä. :O
Ja toinen:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON PAKOLLINEN!' at line 1
ja tuo "ON PAKOLLINEN" on aiheen otsikko.
Esimerkissäni oli pieni virhe. Kentän arvo pitää ympäröidä heittomerkein.
<?php $q = "SELECT Alue, Aihe, Viesteja_uusia FROM foorumi_uusia_viesteja WHERE ID = $tempid and Alue='$forum' and Aihe='$aihe'"; ?>
Perhana enkä itse sitten huomannut. :D
Kiitos.
mika132: etkö huomannut edes virheilmoituksen jälkeen. Siinä kerrotaan ettei TEST nimistä saraketta ole olemassa.
Mielestäni myös olisi selkeämpää kun kirjottaisit myös and -sanat isolla. Samoin tuo echo $q oli tarkoitettu myös, jotta näkisit mitä arvoja muuttujista tulee, mutta myös että näkisit millainen generoitu MySQL -kysely on, jolloin myös puuttuvat lainausmerkit/hipsut näkyisivät paremmin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.