Teen tässä erään skriptin, jossa erilaisia raportteja tulostuu. Haluaisin, että uusin raportti tulostuu ensimmäisenä. Tietokannassa on "ottelupaiva", jonka tyyppi on "datetime". Sitten "...ORDER BY ottelupaiva DESC..."
Se tulostaakin vaan päivien mukaan, eli ei ota huomioon eri kuukausia...
Mikä siis oikeatapa tulostaa, pitääkö tuo datetime muuttaa joksikin muuksi?
Varmasti olisi parempiakin tapoja, mutta voit tallentaa PHP:n aikaleiman kantaan(tyypiksi INT) ja sitten järjestää sen mukaan. Mutta kuten sanoin MySQL:ssä on varmasti, jokin hieno ominaisuus tuohon ongelmaasi, jota en nyt satu tietämään.
Hmm... Joo, ja siinä on sellainen juttu vielä, että admin kun kirjoittaa raportin niin hän joutuu itse täyttämään ottelupaiva-kentän, johon laittaa muodossa "vuosi-kuukausi-päivä" päiväyksen, koska ottelu on pelattu.
Taitaa olla niin, että jos muotoilet tuota aikakenttää kyselyssä (esimerkiksi kotimaiseen muotoon 2.7.2006), se järjestelee rivit kentän mukaan merkkijonotyylisesti. Eli ratkaisuna on hakea päivämäärätieto tyyliin DATE_FORMAT(pvm, '%d.%m.%Y jne) AS uusiPvm ja sit laittaa se järjestely ORDER BY pvm. Eli järjestely alkuperäisen kentän nimen mukaan, mut aikatieto haetaan aliaksella.
Olinkohan tarpeeksi epäselvä? :)
Mites se tonne kyselyyn sitten lisättiinkään, että tallentaa "kotimaisesti"? :) Tietokantavirhettä pukkaa.
$sql_lauseke = "insert into Otteluraportit (nimi, ottelijat, lopputulos, raportti, DATE_FORMAT(ottelupaiva, '%d.%m.%Y')) values ('$nimi','$ottelijat','$lopputulos','$raportti','$ottelupaiva')";
Niin, ja tietokantaan (MySQL) muutin tuon DATETIME -> DATE (kun tarvitsee vain päivän tarkkuudella)
Niin siis tuo olga tarkoitti, sitä että tieto haetaan(ei lisätä) kotimaisessa muodossa. Eli jotenkin näin
//Varmaan ei toimi, mutta suunnilleen "SELECT DATE_FORMAT(ottelupaiva, '%d.%m.%Y') AS uusiPvm FROM Otteluraportit ORDER BY uusiPvm"
Aah, mielestäni ekaksi testasin niin, mutta tuli virhe tai ei tapahtunut mitään. Testaanpa uudestaan ->
sh kirjoitti:
//Varmaan ei toimi, mutta suunnilleen "SELECT DATE_FORMAT(ottelupaiva, '%d.%m.%Y') AS uusiPvm FROM Otteluraportit ORDER BY uusiPvm"
Niin ja siis ORDER BY ottelupaiva
, ei uusiPvm
heh, sitä minäkin :)
Jep, mut joku mättää. Ei tapahdu tollakaan muutoksella mitään.
Tutkitaan ->
-------------------------- EDIT:
Eli admin kirjoittaa raporttinsa ja lisää ottelupaiva kenttään päiväyksen muodossa "2006-07-02" (vuosi-kuukausi-päivä). Tuo tallennetaan tietokantaan (MySQL) ottelupaiva -sarakkeeseen, jonka tyyppi on "date".
Raportit sitten halutaan tulostaa päivämäärän mukaan, tuorein ylimpänä:
if (!$haeviestit = mysql_query("SELECT nimi, ottelijat, lopputulos, raportti, SELECT DATE_FORMAT(ottelupaiva, '%d.%m.%Y') AS uusiPvm FROM Otteluraportit ORDER BY ottelupaiva DESC",$yhteys))
Silti raportit tulostuvat vain päivän mukaan... Ei ota huomioon eri kuukausia (eikä vuosia?)
Yks jännä tossa ainakin pistää silmään: Ota DATE_FORMATin edestä pois tuo SELECT.
Sitä pitikin kysyä, että miks joku sitä siihen tarjosi. :) Otin pois, mutta ei vaikutusta mihinkään.
Ainakin yksi turha SELECT oli tuolla, en tiennytkään, että MySQL toimii noinkin :) Mutta siis kyllä kaiken järjen mukaan seuraavan pitäisi toimia ja ottaa huomioon niin kuukaudet kuin vuodetkin.
if (!$haeviestit = mysql_query(" SELECT nimi, ottelijat, lopputulos, raportti, DATE_FORMAT(ottelupaiva, '%d.%m.%Y') AS uusiPvm FROM Otteluraportit ORDER BY ottelupaiva DESC ",$yhteys))
No onpa omituista. Se nyt vain jostain syystä listaa sen päiväyksen numerosarjana eikä päivämääränä, joten esim: 30.05.2006 on ylempänä kuin 03.07.2006
Btw... mulle menee vähän ohi toi "uusiPvm", miksi tuollain? Eihän tuota "uusiPvm" oli tietokannassa eikä missään. :)
Noh, ajv. Mä luotan että ratkaiset tämänkin. :)
-------------------
Laitetaas koko koodi tosta tulostuksesta. Voihan tossakin jokin olla vikana?
<?php //avataan yhteys tietokantaan // Sensuroitu if (!$haeviestit = mysql_query("SELECT nimi, ottelijat, lopputulos, raportti, DATE_FORMAT(ottelupaiva, '%d.%m.%Y') AS uusiPvm FROM Otteluraportit ORDER BY ottelupaiva DESC",$yhteys)) { print "Raporttien listaaminen epäonnistui."; } else { while($row = mysql_fetch_assoc($haeviestit)) { print "<table=otteluraportit><tr><td class=otttelupaiva><b>" . $row['ottelupaiva']; print "<td class=ottelijat><font color=#33A1DE> " . $row['ottelijat']; print "</b></font></td></td><td class=lopputulos> " . $row['lopputulos']; print "</td></tr><tr><td class=raportti><p> " . $row['raportti']; print "</p></td></tr><tr><td class=nimi><p><i>Kirjoitti:" . $row['nimi']; print "</p></i></td></tr></table>"; } } ?>
Niin siis tuo uusiPvm on alias (kuten olgakin jo mainitsi) tuolle DATE_FORMAT(...:lle
Niin ja se muokattu päivämäärä löytyy tuolla PHP:n puolella siis $row-taulukon alkiosta 'uusiPvm'. $row['ottelupaiva'] pitäisi kaiken järjen mukaan olla tyhjä.
Selkeetä :)
Sitten vielä ratkaiset koko ongelman? :)
No se on sitten hieman vaikeampi homma, sillä minulla vastaavanlainen kysely toimii aivan oikein :)
Tässä vielä miten se lisää tiedot kantaan:
$sql_lauseke = "insert into Otteluraportit (nimi, ottelijat, lopputulos, raportti, ottelupaiva) values ('$nimi','$ottelijat','$lopputulos','$raportti','$ottelupaiva')";
Tietokannasta ottelupaiva:
ottelupaiva date Ei 0000-00-00
Noissa mitään vikaa?
----------------------------- EDIT:
Hohhoijaa. *hakkaa päätä seinään* Mulla olikin toi tulostus-tiedosto 2 eri paikkaa ja tarkastelin koko ajan väärää. Sinnekin se teki muutoksia, mutta ei oikein.
Eli pelittää nyt oikein! :))
Nyt ainoastaan se ongelma, että haluaisin että päiväys näkyy myös sivuilla. Nyt tulostuu oikeassa järjestyksessä, mutta päiväyksiä ei näy...
Eli mistäs saan ton päiväyksen vielä tulostumaan?
print "<table=otteluraportit><tr><td class=otttelupaiva><b>" . $row['ottelupaiva'];
Miksi ei tolla tulostu?
Pitäisi varmaan jaotella raportteja. Kuukausi-jaottelu olisi varmaan paras? Mites saisi tulostumaan eri kuukausittain?
Nythän et hae tuota ottelupaiva-kenttää, vaan sen päivämäärätiedon uusiPvm-aliaksella. Eli 'ottelupaiva' -> 'uusiPvm'.
Kiitos Olga.
Nyt menee vähän ohi viestin aiheen, mutta parempi tässä jatkaa kysymyksiä samasta skriptistä.
Olisi hyvä jos voisi vielä voitot ja tappiot eritellä. Admin-alueelle voisi laittaa 2 kpl checkboxia, rastita oliko voitto vai tappio. Sitten tulostus esim. if voitto tulosta solun taustaväri vihreällä, if tappio tulosta solun taustaväri punaisella.
Osaako kukaan auttaa vai googlettamaan: php+checkbox
En nyt ihan ymmärtänyt kokonaan, mutta tästä pystyt ainakin soveltamaan :)
<form action="<?php echo $PHP_SELF;?>" method="post"> <input type="checkbox" name="nappi1">Voitto<p> <input type="checkbox" name="nappi2">Häviö<p> <input type="submit" value="Paina"> <?php if(isset($_POST["nappi1"])) // Onko checkboksi ruksitettu... { /* .. jos on tulostetaan jotain, tässä tapauksessa taulukko */ ?> <table> <tr> <td bgcolor="green">Yes voitto gg!</td> </tr> </table> <?php } if(isset($_POST["nappi2"])) // Onko checkboksi ruksitettu... { /* .. jos on tulostetaan jotain, tässä tapauksessa taulukko */ ?> <table> <tr> <td bgcolor="red">Häviö :((</td> </tr> </table> <?php } ?> </form>
Kiitos Ravver, ymmärsit ainakin perusidean. Nyt väsyttää niin etten ole varma vastasitko ihan kaikkeen... :)
Minulla kuitenkin 3 eri filua:
1. kirjoita_raportti
2. raportin_tiedot_tallenna_kantaan
3. tulosta_raportit
Eli kirjoita osuudessa rastitetaan joko voitto tai tappio checkbox. Jokaiseen eri raporttiin sitten pitäisi tietokantaan yksi sellainen sarake tallentua, missä selvii oliko voitto vai tappio.
Sitten sinne tulosta_raportit sivulle tulostuu raportit. Pitäisi tulosta esim niin, jos tietokannan rivissä on voitto niin tulosta solu vihreänä (älä tulosta: "voitto") jos siellä tappio niin tulosta solu punaisena (älä tulosta: "tappio").
Pitää tuota "isset" -juttua tutkia...
Tuossa Ravverin esimerkissä oli siis vain lomake, jonka jälkeen palautetaan sivu, jossa tulostuu sitten taulukkoon punaiseksi tai vihreäksi väritetyllä solulla voitto- tai häviö-teksti. isset() on funktio, joka tarkistaa, onko jossakin muuttujassa jotain vai onko se tyhjä.
Tohon sun ongelmaas: sun täytyy siis siinä kyselyn ohella napata kannasta myös se voittovaitappio-sarake - tai miks nyt kutsutkaa sitä. Sitte sen mukaan laittaa se <td>-alotustagi. Jos on voitto, laitat <td bgcolor="#00FF00"> (vihreä väri). Häviön kohalla vastaavasti <td bgcolor="#FF0000"> (punainen väri taustalle)
Ja sitten pistä se valintapalluroilla sinne admin-sivulle niin, että ei voi valita ku toisen vaihtoehon. Sitten tallennat vaan kantaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.