Aluksi hieman taustatietoa.
Teen nettisivuille arvostelu-databasea, johon tallennetaan sarjoja ja leffoja, linkit niistä, sekä arvostelut.
Minun pitäisi vertailla kahta taulukkoa: linkkitaulukkoa ja arvostelutaulukkoa.
Haetaan tiedot linkeistä:
$kysely = mysql_query("SELECT * FROM {$tbl_sarjalinkit} ORDER BY linkkiteksti",$lnk); $maara = mysql_result(mysql_query("SELECT COUNT(*) FROM {$tbl_sarjalinkit}"), 0);
Haetaan kaikki käyttäjän kirjoittamat arvostelut:
$arvostelija=$user['tunnus']; $haku = mysql_query ("SELECT * FROM kayttajaarvostelut WHERE arvostelija='".$arvostelija."'",$lnk); $rivi = mysql_fetch_array($haku, MYSQL_ASSOC); //"numero" tarkoittaa sarjaa, jota käyttäjä on arvostellut $numero=$rivi['numero'];
Sarjojen ja leffojen linkit tulostetaan sivulle for silmukalla:
for ($i = 0; $i < $maara; $i++) { $linkki = mysql_result($kysely, $i, "linkki"); $linkkiteksti = mysql_result($kysely, $i, "linkkiteksti"); echo "<a href=\"/index.php?sarja=$linkki\">$linkkiteksti</a>"; }
Sivuilla on linkki, jota käyttäjä voi halutessaan painaa.
<a href="?show=reviews&piilota=kylla">Piilota äänestämäsi sarjat</a>. Linkillä on siis tarkoitus piilottaa kaikki sarjat mitä käyttäjä on äänestänyt.
Seuraavaksi ongelmaan..
Käyttäjä painaa piilotuslinkkiä:
for ($i = 0; $i < $maara; $i++) { $linkki = mysql_result($kysely, $i, "linkki"); $linkkiteksti = mysql_result($kysely, $i, "linkkiteksti"); if($_GET['piilota']=="kylla" && $linkki==$numero){ echo""; }else{ echo "<a href=\"/index.php?sarja=$linkki\">$linkkiteksti</a>"; } }
Yllä mainittu koodi ei toimi oikein. Koodi vertaa arvosteluiden "numero"-sarakkeen ensimmäistä riviä kaikkiin "linkki"-sarakkeen riveihin. Se ei siis piilota kaikkia sarjoja, joita käyttäjä on äänestänyt, vaan pelkästään ensimmäisen. Olen jo kauan miettinyt millä koodinpätkällä vertailusta saisi tehtyä sellaisen, että se ottaisi huomiin kaikki "numero"-sarakkeen rivit, eikä pelkästään sitä ensimmäistä. Toivottavasti ymmärsitte ongelman. Kysyä saa, jos jäi jotain epäselväksi ;)
Otan kaikki neuvot ja vinkit ilolla vastaan! :)
jos nyt oikein koodia tajusin, niin asetat $numeron vain kerran - joten vain yksi sarjoista piilottuu.
Tästä on vaikea katsoa täysin mitä haet, mutta yksi tapa olisi laittaa numerot arrayhyn, ja viimeisessä loopissa tarkistaa onko arrayssä kyseistä numeroa. Pieni koodinpätkä, tähän lootaan on vaikea koodata joten en ole varma toimivuudesta.
$numero = array(); $arvostelija=$user['tunnus']; $haku = mysql_query ("SELECT * FROM kayttajaarvostelut WHERE arvostelija='".$arvostelija."'",$lnk); while ($rivi = mysql_fetch_array($haku, MYSQL_ASSOC)) { //"numero" tarkoittaa sarjaa, jota käyttäjä on arvostellut $numero[] = $rivi['numero']; }
sitten tarkistus:
for ($i = 0; $i < $maara; $i++) { $linkki = mysql_result($kysely, $i, "linkki"); $linkkiteksti = mysql_result($kysely, $i, "linkkiteksti"); if($_GET['piilota'] != "kylla" && !in_array($linkki, $numero)){ echo "<a href=\"/index.php?sarja=$linkki\">$linkkiteksti</a>"; } }
noh, toimivuudesta ei voi sitten sanoa mitään. :)
koita tätä ja kysy sitten (jos tämä edes näyttää yhtään siltä mitä haet)
Kyllähän tuo suurimmaksi osaksi on sitä mitä haen.
Kertaan kuitenkin vielä.. Kun käyttäjä painaa "piilota"-nappulaa, for-silmukka ei tulosta niitä sarjoja, joita käyttäjä on äänestänyt.
Sovelsin koodivinkkiäsi eri tavoin, mutta en saanut sitä toimimaan. Saan vain ilmoituksen virheestä:
"Warning: in_array(): Wrong datatype for second argument in /home/www/....".
Lisäyksenä vielä voisin laittaa tietoa arvostelutaulukon rakenteesta:
//numero on siis arvostellun sarjan id +-------+-------+-----------+-----------+ | id |numero |arvostelija| arvosana | +-------+-------+-----------+-----------+ | 1 | 2 |killerfox | 5 | +-------+-------+-----------+-----------+ | 2 | 56 |pekka | 10 | +-------+-------+-----------+-----------+ | 3 | 465 |pekka | 7 | +-------+-------+-----------+-----------+
Aina kun käyttäjä arvostelee jotakin sarjaa, tauluun tulee siis yksi rivi lisää. (Ei vieläkään edistystä koodin saamisessa toimivaksi). Ehdotuksia kehiin :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.