Ääkkösten kanssa olen onnistunut taas jonkin sortin ongelmia hankkimaan. Minulla on siis lomakesivu netissä, joka lähettää tietoa tietokantaan. Lopulta tiedot vielä tulostuvat erilliselle sivulle.
- lomakesivu ja käsittelijä UTF-8
- tietokanta UTF-8
- tulostussivu UTF-8
Nyt siis tiedot tallentuvat kantaan oikein kirjaimin, mutta tulostuvat lopulta ääkköset vinksallaan?
-------
Lisäksi ongelmia on textarean kanssa, kun sinne heittää enteriä niin lähettäessä tekstistä tietokantaan tallentuu vain teksti ensimmäiseen enteriin saakka - muut ei tallennu... Mikä mahtaa olla vikana? Ja miten siihen saisi säädettyä sellaisen käsittelysivun-koodiin, että aina enteriä käytettäessä kantaan tallentuu <br />, ettei tarvitse turhaa textareaan heittää koodia?
merlin kirjoitti:
Lisäksi ongelmia on textarean kanssa, kun sinne heittää enteriä niin lähettäessä tekstistä tietokantaan tallentuu vain teksti ensimmäiseen enteriin saakka - muut ei tallennu... Mikä mahtaa olla vikana? Ja miten siihen saisi säädettyä sellaisen käsittelysivun-koodiin, että aina enteriä käytettäessä kantaan tallentuu <br />, ettei tarvitse turhaa textareaan heittää koodia?
Laitta koodisi tänne, niin olisi paljon helpompi auttaa.
Rivin vaihdot saat seuraavalla koodilla:
$str = str_replace('\n', '<br>', $str);
Rivinvaihdon korvaukseen käy myös nl2br-funktio.
Hoppistakeikkaa, ääkkösongelma korjaantui kun muutin vielä tulostussivun koodauksen utf:äksi, oli muistiossa joku muu oletuksena :D
Minne mun pitäis tuo str tunkea, oon ihan peukalo keskellä kämmentä näiden kanssa. Käsittelijäsivulle varmaankin ja textarea kohdan käsittelyn yhteyteen, mutta miten?
Ja miten saisin lomakkeella lähetetyn rivin idiksi aina järjestyksessä seuraavan numeron? Pitäisikö hakea sillä hetkellä suurin numero ja lisätä yksi vai onko siihen helpompikin - tähän asti oon vaan kiltisti pitäny kirjaa ideistä ja merkannu ne ylös (alla olevassa koodissa kokeilin tuota randomjuttua, mutta se nyt ei ihan palvele asiaa ...)
............... //syötetään tieto kantaan $id = rand(0,300); mysql_query("INSERT INTO hevoset (id, virallinennimi, lempinimi, tiedostonimi, rotu, sukupuoli, sakakorkeus, syntymaaika, varijamerkit, painotus, kapasiteetti, kaytto, kasvattaja, maahantuoja, arvonimet, en_rotu, en_sukupuoli, en_painotus, en_varijamerkit, isa, ii, iii, iie, ie, iei, iee, ema, ei, eii, eie, ee, eei, eee, luonne, sukuselvitys, kuvaaja, muuta, jalostusinfo) VALUES ($id, '".mysql_real_escape_string($_POST['virallinennimi'])."', '".mysql_real_escape_string($_POST['lempinimi'])."', '".mysql_real_escape_string($_POST['tiedostonimi'])."', '".mysql_real_escape_string($_POST['rotu'])."', '".mysql_real_escape_string($_POST['sukupuoli'])."', '".mysql_real_escape_string($_POST['sakakorkeus'])."', '".mysql_real_escape_string($_POST['syntymaaika'])."', '".mysql_real_escape_string($_POST['varijamerkit'])."', '".mysql_real_escape_string($_POST['painotus'])."', '".mysql_real_escape_string($_POST['kapasiteetti'])."', '".mysql_real_escape_string($_POST['kaytto'])."', '".mysql_real_escape_string($_POST['kasvattaja'])."', '".mysql_real_escape_string($_POST['maahantuoja'])."', '".mysql_real_escape_string($_POST['arvonimet'])."', '".mysql_real_escape_string($_POST['en_rotu'])."', '".mysql_real_escape_string($_POST['en_sukupuoli'])."', '".mysql_real_escape_string($_POST['en_painotus'])."', '".mysql_real_escape_string($_POST['en_varijamerkit'])."', '".mysql_real_escape_string($_POST['isa'])."', '".mysql_real_escape_string($_POST['ii'])."', '".mysql_real_escape_string($_POST['iii'])."', '".mysql_real_escape_string($_POST['iie'])."', '".mysql_real_escape_string($_POST['ie'])."', '".mysql_real_escape_string($_POST['iei'])."', '".mysql_real_escape_string($_POST['iee'])."', '".mysql_real_escape_string($_POST['ema'])."', '".mysql_real_escape_string($_POST['ei'])."', '".mysql_real_escape_string($_POST['eii'])."', '".mysql_real_escape_string($_POST['eie'])."', '".mysql_real_escape_string($_POST['ee'])."', '".mysql_real_escape_string($_POST['eei'])."', '".mysql_real_escape_string($_POST['eee'])."', '".mysql_real_escape_string($_POST['luonne'])."', '".mysql_real_escape_string($_POST['sukuselvitys'])."', '".mysql_real_escape_string($_POST['kuvaaja'])."', '".mysql_real_escape_string($_POST['muuta'])."', '".mysql_real_escape_string($_POST['jalostusinfo'])."' )"); //siirretään käyttäjä etiäpäin header('Location: http://sivu.php'); ...............
Lisäys: Ja siis kohdat luonne ja sukuselvitys on pitkiä textareoita.
Älä korvaa tietokantaan tallennettaessa rivinvaihtoja HTML-tageilla. Muuta ne vasta, kun tulostat.
$luonne = nl2br($rivi["luonne"]);
Mutta mites se ongelma, että koko teksti ei edes päädy tietokantaan - yksikään rivinvaihtokaan ei sinne päädy kun ensimmäisestä se katkeaa?
Mahtaaako kentille olla jotain pituusrajoituksia?
Muuten, ID-numero arvotaan? Mitä jos tulee päällekkäisyyksiä? ID-kentän tulisi olla AUTO_INCREMENT PRIMARY_KEY, käsin sen arvoa ei pitäisi asettaa.
Ps. Tutustu PDO:hon.
Macro kirjoitti:
Rivinvaihdon korvaukseen käy myös nl2br-funktio.
Nl2br() ei korvaa rivinvaihtoja vaan lisää jokaisen viereen <br/>-tagin. Alkuperäiset \n:t jäävät tekstiin.
MySQL sallii tallentaa tietokantaan merkkijonokenttiin rivinvaihtojakin. Ne eivät edes tarvitse eskapointia. Evotat jossain muualla.
P.S. php-kommenteissa on html-enkoodattuja ääkkösiä? Oikeasti?
Mitä jos kysely epäonnistuu.
qeijo kirjoitti:
Mitä jos kysely epäonnistuu.
Siitä tulee virheilmoitus (jonka voi käsitellä, lokittaa tai näyttää käyttäjälle tai edellisten yhdistelmä)
Ähh, mikäköhän mulla nyt kusee ton rivinvaihtosysteemin kanssa... Testaan vielä kerran :D Ja noi koodiääkköset on ihan vaan korvaa toiminnon myötä tulleet tuonne.
Macro, mulla on nuo pitkää tekstiä sisältävät kohdat isoina teksteinä tietokannassa, ja kaipa nyt 30 lausetta menisi ihan normaaliin TEXT:iinkin?
Ja mulla ei ilmeisesti ole ollut auto_increment valittuna - nyt kun on niin otanko vaan id-lähetyksen pois ja se tekee ne idit itse uutta riviä lisätessä?
Grez kirjoitti:
qeijo kirjoitti:
Mitä jos kysely epäonnistuu.
Siitä tulee virheilmoitus (jonka voi käsitellä, lokittaa tai näyttää käyttäjälle tai edellisten yhdistelmä)
Kaikkeahan sitä voisi tehdä.
Vieläkään ei ääkköset toimi, heitän nyt tän teille koodeineen esille josko onnistuis:
uusihevonen.php - tiedoston koodaus on UTF-8 <form method="post" action="tiedosto.php" onSubmit="submitonce(this)" name="horseregistery"> <b>Virallinen nimi:</b> <input type="text" name="nimi" size="35" /><br /> <b>Tiedostonimi:</b> <input type="text" name="tiedostonimi" size="35" /><br /> <b>Rotu:</b> <br /><select size="15" name="rotu"> <option value="englantilainen täysiverinen">englantilainen täysiverinen</option> <option value="quarter">quarter</option> <option value="arabialainen täysiverinen">arabialainen täysiverinen</option> <option value="laukka">laukkaratsastus</option> <option value="askellaji">askellajipainotteinen</option> </select><br /> <b>Sukupuoli:</b> ori <input name="sukupuoli" value="ori" type="radio" /> || tamma <input name="sukupuoli" value="tamma" type="radio" /> || ruuna <input name="sukupuoli" value="ruuna" type="radio" /><br /> <b>Väri ja merkit:</b> <input type="text" name="vari" /><br /> <b>Syntymäaika:</b> 1-vuotias <input name="syntymaaika" value="2012-06-11" type="radio" /> || 2-vuotias <input name="syntymaaika" value="2012-03-19" type="radio" /> || 3-vuotias <input name="syntymaaika" value="2011-12-26" type="radio" /> || 4-vuotias <input name="syntymaaika" value="2011-10-03" type="radio" /> <br /> <b>Ikääntyminen:</b> <input type="text" name="ikaantyminen" value="CAS" /><br /><br /> <b>Säkäkorkeus:</b> <input type="text" name="saka" /> cm<br /><br /> <b>Kasvattaja:</b> <input type="text" name="kasvattaja" size="35" /><br /> <b>Maahantuoja:</b> <input type="text" name="maahantuoja" value="" size="45" /> <a href="mailto:"></a><br /><br /> <b>Talli:</b> <br /><select size="5" name="painotus"> <option value="ratsu">ratsastus</option> <option value="western">western</option> <option value="ravi">ravit</option> <option value="laukka">laukkaratsastus</option> <option value="askellaji">askellajipainotteinen</option> </select><br /> <b>Painotus:</b> <input type="text" name="painotus" size="35" /> <i>(laukka, sileät, semistayer // este)</i><br /> <b>Kapasiteetti:</b> <input type="text" name="koulutus" size="35" /> <i>(maiden // HeA / 150cm)</i><br /> <b>Käyttö:</b> varsa <input name="kaytto" value="varsa" type="radio" /> || kilpailut <input name="kaytto" value="kisa" type="radio" /> || siitos <input name="kaytto" value="siitos" type="radio" /></p> <hr /> <p><b>Luonne:</b><br /><textarea rows="10" cols="80" name="luonne"></textarea></p> <p><table width="100%" border="0" style="text-align:center;"> <tr><td rowspan="4" class="sire"><b>i.</b> <input type="text" name="isa" size="20" /></td> <td rowspan="2" class="sire"><b>ii.</b> <input type="text" name="ii" size="20" /></td> <td class="sire"><b>iii.</b> <input type="text" name="iii" size="20" /> </td></tr> <tr><td class="dam"><b>iie.</b> <input type="text" name="iie" size="20" /></td></tr> <tr><td rowspan="2" class="dam"><b>ie.</b> <input type="text" name="ie" size="20" /></td> <td class="sire"><b>iei.</b> <input type="text" name="iei" size="20" /></td></tr> <tr><td class="dam"><b>iee.</b> <input type="text" name="iee" size="20" /></td></tr> <tr><td rowspan="4" class="dam"><b>e.</b> <input type="text" name="ema" size="20" /></td> <td rowspan="2" class="sire"><b>ei.</b> <input type="text" name="ei" size="20" /></td> <td class="sire"><b>eii.</b> <input type="text" name="eii" size="20" /></td></tr> <tr><td class="dam"><b>eie.</b> <input type="text" name="eie" size="20" /></td></tr> <tr><td rowspan="2" class="dam"><b>ee.</b> <input type="text" name="ee" size="20" /></td> <td class="sire"><b>eei.</b> <input type="text" name="eei" size="20" /></td></tr> <tr><td class="dam"><b>eee.</b> <input type="text" name="eee" size="20" /></td></tr> </table></p> <p><b>Sukuselvitys:</b><br /><textarea rows="10" cols="80" name="sukuselvitys"></textarea></p> <p><b>Jalostusinfo:</b><br /><textarea rows="10" cols="80" name="jalostusinfo">ei ole tarjolla jalostukseen.</textarea></p> <input type="submit" name="submit" value="Luo uusi hevonen" /> </form>
tiedosto.php - tiedoston koodaus on UTF-8 <?php //avataan yhteys kantaan ................ //valitaan tietokanta ................ //syötetään tieto kantaan mysql_query("INSERT INTO hevoset (nimi, tiedostonimi, rotu, sukupuoli, saka, syntymaaika, ikaantyminen, vari, talli, painotus, koulutus, kaytto, kasvattaja, maahantuoja, isa, ii, iii, iie, ie, iei, iee, ema, ei, eii, eie, ee, eei, eee, luonne, sukuselvitys, jalostusinfo) VALUES ( '".mysql_real_escape_string($_POST['nimi'])."', '".mysql_real_escape_string($_POST['tiedostonimi'])."', '".mysql_real_escape_string($_POST['rotu'])."', '".mysql_real_escape_string($_POST['sukupuoli'])."', '".mysql_real_escape_string($_POST['saka'])."', '".mysql_real_escape_string($_POST['syntymaaika'])."', '".mysql_real_escape_string($_POST['ikaantyminen'])."', '".mysql_real_escape_string($_POST['vari'])."', '".mysql_real_escape_string($_POST['talli'])."', '".mysql_real_escape_string($_POST['painotus'])."', '".mysql_real_escape_string($_POST['koulutus'])."', '".mysql_real_escape_string($_POST['kaytto'])."', '".mysql_real_escape_string($_POST['kasvattaja'])."', '".mysql_real_escape_string($_POST['maahantuoja'])."', '".mysql_real_escape_string($_POST['isa'])."', '".mysql_real_escape_string($_POST['ii'])."', '".mysql_real_escape_string($_POST['iii'])."', '".mysql_real_escape_string($_POST['iie'])."', '".mysql_real_escape_string($_POST['ie'])."', '".mysql_real_escape_string($_POST['iei'])."', '".mysql_real_escape_string($_POST['iee'])."', '".mysql_real_escape_string($_POST['ema'])."', '".mysql_real_escape_string($_POST['ei'])."', '".mysql_real_escape_string($_POST['eii'])."', '".mysql_real_escape_string($_POST['eie'])."', '".mysql_real_escape_string($_POST['ee'])."', '".mysql_real_escape_string($_POST['eei'])."', '".mysql_real_escape_string($_POST['eee'])."', '".mysql_real_escape_string($_POST['luonne'])."', '".mysql_real_escape_string($_POST['sukuselvitys'])."', '".mysql_real_escape_string($_POST['jalostusinfo'])."' )"); //siirretään käyttäjä etiäpäin header('Location: uusihevonen.php'); ?>
Tietokanta on utf-8_general_ci?
Et varmaankaan ole asettanut tietokantayhteyden merkistöä, mysql_set_charset("utf8").
Metabolix, oi kiitos - sen kun lisäsin niin eipä ääkköset enää vaivaa :D
Lisäys:
Tulostuksessa vielä häikkää, käytössä seuraavanlainen yhteydenmuodostus, missä kohtaa pitäisi nyt yhteyden merkistö ilmoittaa?
<?php // muodostetaan yhteys tietokantaan try { $yhteys = new PDO("mysql:host=localhost;dbname=.....", ".....", "....."); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // valmistetaan kysely $kysely = $yhteys->prepare("SELECT * FROM hevoset WHERE tiedostonimi=?;"); // suoritetaan kysely $kysely->execute(array($nimi)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { .....................
Lisäys:
Lisäksi vielä kyselisin, että millä tavalla voisin hakea kannasta tähän koodiin kaikkien rivien "tiedostonimi" kohdat?
<?php $nimi = $_GET ['nimi']; $nimit = array ("sageclaw", "rightrecon", "hotterthancup" ,"kissorrun" ,"makemyday" ,"sorcererl"); if (!in_array ($nimi, $nimit)) $nimi = "sageclaw"; ?>
Nyt joudun aina käsin muokkaamaan kun lisään rivejä kantaan ja haluan ne tuonne tulostumaan.
merlin kirjoitti:
Metabolix, oi kiitos - sen kun lisäsin niin eipä ääkköset enää vaivaa :D
Lisäys:
Tulostuksessa vielä häikkää, käytössä seuraavanlainen yhteydenmuodostus, missä kohtaa pitäisi nyt yhteyden merkistö ilmoittaa?
[ koodi poistettu ]
Kokeile tällä koodilla:
<?php // muodostetaan yhteys tietokantaan try { $yhteys = new PDO("mysql:host=localhost;dbname=....;charset=utf8", ".....", "....."); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // valmistetaan kysely $kysely = $yhteys->prepare("SELECT * FROM hevoset WHERE tiedostonimi=?;"); // suoritetaan kysely $kysely->execute(array($nimi)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { .....................
lainaus:
Lisäys:
Lisäksi vielä kyselisin, että millä tavalla voisin hakea kannasta tähän koodiin kaikkien rivien "tiedostonimi" kohdat?
<?php $nimi = $_GET ['nimi']; $nimit = array ("sageclaw", "rightrecon", "hotterthancup" ,"kissorrun" ,"makemyday" ,"sorcererl"); if (!in_array ($nimi, $nimit)) $nimi = "sageclaw"; ?>Nyt joudun aina käsin muokkaamaan kun lisään rivejä kantaan ja haluan ne tuonne tulostumaan.
Järkevämpää olisi, jos get-parametrina olisi ID, mutta voi sen nimelläkin tehdä:
Olli sinullekin suuret kiitokset, tuo GET haku toimii nyt :) Ainoastaan tuo merkistön määritys taisi jotenkin kusaista kun ei nyt tulosta mitään sivulle - ihan tällä mainitsemallasi tavalla sen laitteli o_o
// muodostetaan yhteys tietokantaan try { $yhteys = new PDO("mysql:host=localhost;dbname=TIETOKANTA;charset=utf8", "KÄYTTÄÄTUNNUS", "SALASANA"); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // valmistetaan kysely $kysely = $yhteys->prepare("SELECT * FROM hevoset WHERE id=?;"); // suoritetaan kysely $kysely->execute(array($id));
Kannattaa ottaa virheilmoitukset käyttöön.
Sulla on ylimääräinen puolipiste kyselyssä.
Macro, esitän nyt niinkin tyhmän kysymyksen kuin että "miten saan virheilmoitukset käyttöön?". Eikös minulla kuitenkin ole jo ainakin tuosta yhteyden muodostuksesta tuo jo tuolla? Googlailin ja yritin selvittää täältä oppaistakin, mutta eipä löytynyt muuta ratkaisua? Oon ihan uuno näiden kanssa :D
Ja mikä mahtaa olla ylimääräinen puolipiste, miten tuo cahrset tulisi tuolla esittää, ilman tuota puolipistettä?
Lisäys: Ylimääräinen puolipiste löytyi, kuten sanoit - kyselystä :D Nyt kun sen poistin niin ongelma ei kuitenkaan poistunut?
Lisäys:
Mahtaakohan mulla olla tuolla GET-lauseessa jotain häikkää? Sivun yläreunaan jää nyt ylimääräinen Array() teksti?
<?php try { $yhteys = new PDO("mysql:host=localhost;dbname=TIETOKANTA;charset=utf8", "KÄYTTÄJÄ", "SALASANA"); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $kysely = $yhteys->prepare("SELECT tiedostonimi FROM hevoset WHERE tiedostonimi = ?"); $kysely->execute($_GET['nimi']); // TODO: Virhetilanteiden käsittely. $nimet = array(); foreach($kysely->fetch() as $rivi) { $nimet[] = $rivi["tiedostonimi"]; } print_r($nimet); ?>
Jos tulostuu pelkästään Array(), kysely ei silloin löytänyt yhtään tulosta haulle, jossa tiedostonimi = $_GET["nimi"].
Ja eikös rivin 11 pitäisi olla $kysely->execute(array($_GET["nimi"]));
?
Muuten, aika erikoisesti nimetty kenttä, jos puhutaan hevosista...?
Syy siihen, miksei oma koodisi toimi, on että käytät foreach-silmukkaa väärin. Tai oikeastaan yrität iteroida väärää taulukkoa.
PDOStatement::fetch() palauttaa seuraavan rivin tulosjoukosta. Eli siis annat foreachille parametriksi yhden rivin. Tosin tuloksia ei tule ollenkaan, koska jo executea kutsuessa annat vääriä parametreja.
PDOStatement-olion sisältämää tulosjoukkoa voi iteroida eri tavoin:
// "Klassinen tapa" 1990-luvulta while ($row = $smt->fetch()) { ... } // "Aloittelijan tapa" foreach ($smt->fetchAll() as $row) { ... } // PDOStatement toteuttaa Traversable-rajapinnan, joten tämäkin toimii foreach ($smt as $row) { ... }
...mutta minkäänlainen käsin iterointi on tässä tapauksessa purkkaa.
Tietojen tulostus bugitti ihan omasta mokasta, olin pyyhkinyt tuolta GET-juttua muuttaessani $nimi arvon pois joten eipä se osannut mitään tietojakaan hakea kun ei tiennyt että mitä hakea.
Nyt ongelmana on enää GET-systeemissä array-herja, nyt se selittää sivun ylälaidassa seuraavaa: Array ( [0] => s [1] => s )
Lisäksi ääkköset kusee vieläkin?
Lisäys:
Unohdin vielä esitellä uusimman kysymykseni :D Nyt siis pohdin, että miten saisin kilpailukalenterin laskemaan itsekseen, että mille ikäkaudelle kilpailu kuuluu. Minulla on siis hevosen ikä laskettuna syntymäaika -> nykyinen päivä / 84pv (yksi virtuaalivuosi kestää 84 IRL päivää). Lisäksi minulla on kilpailut taulu, jossa on merkittynä kilpailupäivä. Haluaisin siis merkitä kilpailut sivuille tyylillä:
2-vuotiskausi
2v:nä kisatut kisat
3-vuotiskausi
3v:nä kisatut kisat
jne...
Miten saisin kalenterin laskemaan, että mikä kisa kuuluu mihinkin ikäkauteen ja miten saisin ne vielä tuolla tavalla järjestettyä (jos ikäkaudella ei ole kilpailuja niin sitä väliotsikkoa ei näytetä kalenterissa)?
Taas uutta ongelmaa peliin, nyt kun minulla on seuraava if-lauseke (tosi tönkkö, mutta ei voi mittään :D)
$painotus = $rivi['painotus']; if( $painotus == 'laukka, sileät, semistayer') {echo "sileät, semistayer";} elseif( $painotus == 'laukka, sileät, sprinter') { echo "sileät, sprinter";} elseif( $painotus == 'laukka, sileat, stayer') { echo "sileät, stayer";} elseif( $painotus == 'laukka, risut, semistayer') { echo "risuesteet, semistayer";} elseif( $painotus == 'laukka, risut, stayer') { echo "risuesteet, stayer";} else { echo "";};
Niin miten pärjään tämän kanssa kun nuo ääkköset tuntuu sen verran haittaavan, että tuo ei edes käsittele "sileät" sanan omaavia kohtia? "risut" -kohdat menee ja tulostuu ihan no-problem?
Ei pitäis olla ääkköseten kanssa ongelmi if-lauseissa. Katoppa missä muodossa nuo ääkköset on kannassa ja kokeileppa miltä ne näyttää tulostettuina:
echo $painotus;
Ja sitten koodin selkeyden vuoksi kannattaa laittaa pääsääntöisesti kaikki komennot omille riveilleen.
dartvaneri, taitaa olla mulla vieläkin ääkkösongelmia, phpMyAdminillä katsottaessa tekstit ihan samanlaisia kuin tuossa if-lauseessakin. Kun tulostan ne ilman ifiä tuonne sivulle niin ääkköset kusasee... (sile�t, stayer) ?
Onko sulla tiedostojen alussa seuraava koodi:
header('Content-Type: text/html; charset=UTF-8');
Ja tiedostojen koodaus on myös UTF-8?
Mulla on koodaus jo määritelty html:nä, tuonkin lisäsin ja silti ei vaikutusta... Tiedostot on myös muutettu utf8:ksi muistion puolella - liian kinkkistä nyt tän merkistön kanssa :D
Mahtaako yhteys olla vielä väärin?
$yhteys = new PDO("mysql:host=localhost;dbname=tietokanta;charset=utf8", "käyttäjätunnus", "salasana");
Käyttämäsi charset-parametri on tullut vasta PHP:n versiossa 5.3.6, joten se ei ehkä toimi palvelimellasi. Vanhemmissa versioissa MySQL-yhteyden merkistö asetetaan PDO:lla ajamalla kysely SET NAMES 'utf8'
.
On aika hölmöä käyttää samassa projektissa sekaisin erilaisia tietokantayhteyksiä (MySQL-funktiot, PDO, ties mitä vielä?).
Metabolix, tuo versio taitaakin sitten olla syynä - pitääpä laittaa palveluntarjoajalle vähän vinkkiä että sillä vuosihinnalla voisi heitellä uusimman versionkin käyttöön. Kokeilen tuota mainitsemaasi tapaa :D
Mulla on tasan tuota kahta versiota tuonne tungettuna, johtuu ihan vaan siitä - että en koskaan ole päässyt php:n ja tietokantojen rakenteen kanssa sujuiksi kuten esimerkiksi javascriptin, html:n ja css:än kanssa olen päässyt => käytän lähinnä valmiita palasia eri koodeista ja siinä nyt sitten saattaa tulla monenlaista mukaan :D
Onkohan mulla käynyt tuolle lomakkeen tietojen tallennuksessa joku fiba kun kaikki hevosten nimet joissa on ' merkki on tallentunu kantaan \ -merkin kanssa - nyt tulostuu sitten sivuille \' joka kerta kun pelkkä heittopilkku pitäisi olla? Vai onko ihan tietokannan oma juttu ja pitäis ne jotenkin itse napsia pois?
Lisäys: Ääkköset toimii kiitos tuon vihdoin toimivan merkistönmääritykset <3
Lisäys:
Ainiin, se array keikkuu vieläkin siellä tulostussivulla, jossa minulla oli se GET-ongelma? Array ( [0] => b [1] => b ) = tuollaista herjaa, mistä kumman syystä? Sivu toimii eikä mitään virheilmoitusta tule. Koodi on tässä:
yhteys.... // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $kysely = $yhteys->prepare("SELECT tiedostonimi FROM hevoset WHERE tiedostonimi = ?"); $kysely->execute(array($_GET["nimi"])); // TODO: Virhetilanteiden käsittely. $nimet = array(); foreach($kysely->fetch() as $rivi) { $nimet[] = $rivi["tiedostonimi"]; } print_r($nimet); $nimi = $_GET["nimi"] ?>
Olin unohtanut että minua tässä asiassa jo autettiin, heti kun ei tee muokkauksia koodiin niin unohtuu :D
$kysely = $yhteys->prepare("SELECT tiedostonimi FROM hevoset WHERE tiedostonimi = ?"); $kysely->execute(array($_GET["nimi"])); $nimet = $kysely->fetchAll(PDO::FETCH_COLUMN, 0); print_r($nimet);
Tuolta näyttää nyt ja sanoo Array ( [0] => fsuperstition ) ?
Lisäys: Ja tosiaan tuo fsuperstition on haetun hevosen tiedostonimi.
Enpä itse ainakaan aiemmin lukenut tuota SQL-kyselyäsi. Miksi mahdat olla yllättynyt tuloksesta? Haet tietokannasta tiedostonimeä mutta käytät hakuehtona samaisen sarakkeen arvoa, joten tulosjoukko ei suinkaan herätä kummastusta...
The Alchemist, en nyt osaa itse tuota lähteä korjaamaan - mitä pitäisi muuttaa, mikä pitäisi asettaa hakuehdoksi/haettavaksi nykyisen sijaan? Se kuitenkin toimii tarkoituksessaan, mutta heittää tuon arrayn tuonne näkyviin?
Jos ainoa ongelma on, että se "heittää arrayn tuonne näkyviin", niin suosittelisin poistamaan rivin, jossa array tulostetaan näkyviin, eli:
print_r($nimet);
Grez, kiitos !
Ilmeisesti jossain välissä lomakkeenkäsittelijä muuttaa noiden ' -merkkien viereen \-merkit (= \') ja tallentaa ne sellaisena kantaan. Miten saisin tämän muutettua, pitäisi ilmeisesti tuohon tallennuskohdan tiedosto.php -sivun koodiin tehdä jotain muutosta? Vai tuleeko nuo \ jossain muussa vaiheessa sinne/tietokanna oma juttu?
Taidat käyttää todella vanhanaikaista PHP:tä. Auttaisiko magic quotes -ominaisuuden poisto?
Metabolix, sen käyttö ei kyllä aukea yhtään o_o? Mihinkän vaiheeseen minä nyt lähden sitä tunkemaan, tuonne tiedosto.php:hen?
Ei kyllä mulle vieläkään aukea tuo magic quotes, pitäisikö käsitellä lähettäessä vai tulostaessa ja millä tavalla - tämän kanssa saa auttaa ihan käsikädessä kun niin oudolta tuo koodi tuolla näyttää (miten if lause tähän sisältyy?).
Lisäksi tämä ongelma vielä ratkaisematta. Itse kun pohdin niin pitäisi siis laskea hevosen syntymäpäivästä ne jaksot eri kausille - miten sen saisi tehtyä?
syntymäpäivä +84pv +84pv = milloin 2-vuotiskausi alkaa ja se loppuu 84 päivän päästä sen alkamisesta (yksi "vuosi"/kausi on aina 84 IRL-pv).
Jokin silmukkahaku tähän varmaan pitäisi kehittää tietyillä ehdoilla (vain ne kaudet näytetään jolloin on kilpailtu jne). Lisäksi tästä pitäisi vielä saada tulostettua yhteenveto taulukkoon.
Kyseinen if-lause tarkistaa vain onko magic quotes käytössä vai ei ja sen perusteella poistaa ylimääräiset kenoviivat. Kyseinen koodi pitäisi olla jokaisessa tiedostossa ennen kohtaa, jossa käytät superglobaaleja $_GET, $_POST jne.
Voisitko käyttää esimerkiksi seuraavan tyylistä funktiota vuosien laskemiseen
<?php function hevosenIka($syntymapaiva, $verrattavaPaiva = null) { /** * Muutetaan päivämäärät sekunneiksi laskemista varten */ $syntymapaiva = strtotime($syntymapaiva); /** * Jos verrattavaa päivää ei ole määritetty, käytetään nykyistä päivää */ if ($verrattavaPaiva === null) { $verrattavaPaiva = time(); } else { $verrattavaPaiva = strtotime($verrattavaPaiva); } $paiviaVirtuaaliVuodessa = 84; $sekunttejaPaivassa = 60 * 60 * 24; /** * Lasketaan erotus, jaetaan, että saadaan päiviä, jaetaan, että saadaan virtuaalivuosia ja pyöristetään alaspäin kokonaisluvuksi */ return floor(($verrattavaPaiva - $syntymapaiva) / $sekunttejaPaivassa / $paiviaVirtuaaliVuodessa); } ?>
Sitten vain käyt kisapäivät järjestyksessä lävitse, tulostat väliotsikot tarvittaessa jne.
Ah ihanaa, ajattelin taas kerran liian monimutkaisesti ja jätin tekstit kunnolla lukematta, olipa tuohon kenoviivaongelmaan helppo ratkaisu x) Kiitos!
Nyt alan testailemaan tuota kisajuttua ->
Lisäys:
Ää, miten mä määrittelen tuohon sen verrattavan päivän (onko automaattisesti kisapäivä?) ja miten laitan ton nyt toimimaan - oon ihan urpo :D Samaten tuo syntymäpäivän määritys mietityttää, miksi tuolla on tuo strtotime?
Kisat on siis taulussa 'kilpailut' (kisapäviä on siellä nimellä 'pvm') ja hevosen syntymäpäivä on nimellä 'syntymaaika' taulussa 'hevoset'. Lisäksi 'kilpailut' taulusta tulostetaan: paikka, luokka, laji, jaos tulos, osallistujat, voittosumma.
Strtotime muuttaa päivämäärän sekunneiksi 1.1.1970 lähtien jolloin päivämäärillä on huomattavasti helpompi laskea keskenään. Kun vastaan tulee tuntematon funktio niin kannattaa lähes poikkeuksetta kääntyä php.net dokumentaation puoleen.
Olisi pitänyt tehdä dokumenttilohko tosiaan tuolle funktiolle, mutta tein nyt sitten esimerkki koodin kyseisen funktion toiminnasta. Tuli pidempi mitä aluksi ajattelin, mutta toivottavasti havainnollistaa edes hieman.
<?php /** * Lasketaan hevosen ikä "virtuaali vuosina" kahdesta päivämäärästä * Päivämäärät syötetään muodossa "pp.kk.vvvv" * * @param string $syntymapaiva * @param string $verrattavaPaiva * @return int $hevosenIka */ function hevosenIka($syntymapaiva, $verrattavaPaiva = null) { /** * Muutetaan päivämäärät sekunneiksi laskemista varten */ $syntymapaiva = strtotime($syntymapaiva); /** * Jos verrattavaa päivää ei ole määritetty, käytetään nykyistä päivää */ if ($verrattavaPaiva === null) { $verrattavaPaiva = time(); } else { $verrattavaPaiva = strtotime($verrattavaPaiva); } $paiviaVirtuaaliVuodessa = 84; $sekunttejaPaivassa = 60 * 60 * 24; /** * Lasketaan erotus, jaetaan, että saadaan päiviä, jaetaan, että saadaan virtuaalivuosia ja pyöristetään alaspäin kokonaisluvuksi */ return floor(($verrattavaPaiva - $syntymapaiva) / $sekunttejaPaivassa / $paiviaVirtuaaliVuodessa); } /** * Luodaan mallidataa */ $kilpailut = array(); for ($i = 0; $i < 10; $i++) { $kilpailut[$i]['pvm'] = date('Y-m-d', rand(1199145600,1325376000)); $kilpailut[$i]['paikka'] = 'Paikka ' . $i; $kilpailut[$i]['luokka'] = 'Luokka ' . $i; $kilpailut[$i]['laji'] = 'Laji ' . $i; } foreach ($kilpailut as $avain => $arvo) { $pvm[$avain] = $arvo['pvm']; } array_multisort($pvm, SORT_ASC, $kilpailut); foreach ($kilpailut as $arvo) { $arvo['pvm'] = date('d.m.Y', strtotime($arvo['pvm'])); } $hevosenSyntymapaiva = '1.1.2008'; ?><!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Kilpailut</title> <style type="text/css"> table { border-collapse: collapse; width: 300px; } caption, td, th { border: 1px solid black; padding: 5px; } </style> </head> <body> <?php if (!empty($kilpailut)) { ?> <table> <tr> <th colspan="3">Kilpailut</th> </tr> <?php /** * Käydään kilpailut lävitse */ foreach ($kilpailut as $kilpailu) { /** * Laitetaan hevosen ikä kilpailupäivänä muistiin, jotta voidaan tulostaa väliotsikot oikein */ $hevosenIka = hevosenIka($hevosenSyntymapaiva, $kilpailu['pvm']); /** * Tulostetaan väliotsikko, jos ehdot täyttyvät */ if (!isset($luokka) || $luokka !== $hevosenIka) { $luokka = $hevosenIka; ?> <tr> <th colspan="3"><?php echo $luokka; ?>-vuotiskausi</th> </tr> <tr> <th>Paikka</th> <th>Luokka</th> <th>Laji</th> </tr> <?php } /** * Tulostetaan loput tiedot */ ?> <tr> <td><?php echo $kilpailu['paikka']; ?></td> <td><?php echo $kilpailu['luokka']; ?></td> <td><?php echo $kilpailu['laji']; ?></td> </tr> <?php } ?> </table> <?php } ?> </body> </html>
Koodi toimii mainiosti, nyt vaan kämmäsin siinä kohtaa kun pitäisi hakea tiedot tietokannasta, miten korvaan tuon keinodatan tietokantadatallani? ("foreach ($kilpailut as $kilpailu)" kohta sai mut ihan sekasin?)
Tuohon koodiin soveltuu mainiosti
<?php while ($row = $result->fetch()) { $kilpailu[$row['id']]['pvm'] = $row['pvm']; $kilpailu[$row['id']]['paikka'] = $row['paikka']; $kilpailu[$row['id']]['luokka'] = $row['luokka']; // ...jne }
mutta suosittelen käyttämään sinulle mieluisinta tapaa ja muokkaamaan koodin siihen soveltuvaksi. Muista myös, että tuo koodi olettaa kilpailu päivämäärien tulevan järjestyksessä, sekä tietokannasta tulostettaessa kannattaa tiedot ajaa htmlspecialchars-funktion lävitse.
Othnos: öh? Mites vaikka tämä:
Sanoisin aika paljon selvemmäksi lukea ja vähemmän purkaksikin.
Toisaalta, mikäli ei ole ihan ehdoton pakko saada taulukon indekseiksi tietokantarivien ID-numeroa, niin laittaisin vain juoksevasti numeroituun taulukkoon rivit:
$competition = $result->fetchAll(PDO::FETCH_ASSOC);
Othnosin koodin sain vihdoin toimimaan (liian yksinkertainen taas minulle, luulin että tuota täytyisi kamalasti venkslata ja säätää :D).
Voisiko kuiten The Alchemist kuitenkin kertoa että miten tuo sinun laittamasi koodi eroaa tuosta aikaisemmasta (en saanut sitä toimimaan, mikä tuo $result on kun row on minun koodeissani rivi ja competion on kilpailu?)
Eipä se minusta eroa mitenkään. Mutta voithan sinä sen itsekin selvittää purkamalla taulukot auki ja katsomalla sitä, miten ne eroavat toisistaan. Joko manuaalisesti foreach-harjoitteena, jota vaikutit kaipaavan, tai sitten valmiisiin funktioihin turvautumalla.
Iskostunut aika vahvasti tuo mainitsemani tapa itselleni, koska aina sillä tehnyt, enkä koskaan ole vaihtoehtoista tapaa miettinytkään. Kiitosta vaan The Alchemistille kyseisestä paremmasta ja selkeämmästä tavasta. Helpottaa varmasti itseänikin tulevaisuudessa.
Kuten Othnos sanoi niin tuo koodi vaatii kilpailujen olevan järjestyksessä, jotta se ei ala tulostelemaan samoja väliotsikoita uudestaan kun joku aikaisemmin kisattu kisa lisätään jälkikäteen. Olisiko tähän mitään mahkua saada sellaista koodia joka ei tällaista vaatisi, monesti kilpailut tulee lisättyä ties missä järjestyksessä ja kilpailuita kun kuitenkin tulee olemaan paaaaljon kolmelle sadalle hevoselle (lajista riippuen 20-500 starttia <3) niin ihanaa on jälkikäteen niitä idejä siellä muokata...
Lisäys: Juu ja tämän sain itse korjattua, taas liian hätäisesti tänne pyytämään apua - ORDER BY suoritti tämän tehtävän :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.