Moro!
Laitoin vähän aika sitten viestiä tagejen tekemisestä, mutta kun tyhmyyttäni en sitä ennen kokeillut kaikkia hakusanoja ja löysin vanhan aiheen siitä, poistin koko ketjun. Olen saanut kyllä lähes kaikki muut tarvittavat tagit tehtyä, mutta mitenkä saisi kooditagit? Voisiko se onnistua jotenkin, että kirjoitetusta tekstistä etsitään ensiksi vaikka tagit
[ko] ja [/ko]
ja sitten niiden välissä olevasta tekstistä muutettaisiin kaikki
[ ja ]
merkit merkkijonoiksi (en muista miten ne nyt merkitään), eli samalla tavalla kuin html:n estofunctiolla.
Siiiis.... mitä eroa sun kooditägeillä on muuhun tekstiin nähden? Tarkoitushan kuitenkin on vain näyttää koodi esim. tasalevyisellä fontilla, jotta se on helpommin luettavissa.
Se, että jos esim. minulla on itse tekemiä tagejan ja kirjoitan tekstikenttään ohjeen, että saat lihotuksen kirjoittamalla
[l] [/l]
. Jos en kirjoita tuota kooditagien sisään, mitään ei näy.
Voithan tehdä kuten Putkassa, eli hakasuluille omat tagit, esim. [[] ja []]
Kiitos!
Mitenkäs sitten kun pitää saada rivinvaihdot tallentumaan tietokantaan..? Jos tekee sen niin, että aina pitää kirjoittaa vaikka
[ur]
että menee uudelle riville. Voisiko sen tehdä niin, että aina kun painaa enteriä, se lisää vaikka merkit >> rivin alkuun ja muuttaa ne sitten näytettäessä <br>:rräksi... En tämänkään toteuttamista osaa, mutta kertokaas miten se on esim täällä ohjelmointiputkassa toteutettu?
ZuBer kirjoitti:
Voisiko sen tehdä niin, että aina kun painaa enteriä, se lisää vaikka merkit >> rivin alkuun ja muuttaa ne sitten näytettäessä <br>:rräksi...
Tallenna rivinvaihdot kantaan ilman mitään kikkailuja ja tulostusvaiheessa muuta ne br-tagiksi.
$teksti = str_replace (array ("\r", "\n"), array ("", "<br>"), $teksti);
Tallentuvatko ne sinne ihan vain että kirjoitan tekstikenttään jotain ja tietokannassa ne ovat rivinvaihtoina?
"Tekstikenttä":
Eka rivi Toka rivi Ja kolmas rivi.
Tallentaa tuon tuollaisena tietokantaan tietotyyppiin LONGTEXT ja kun tulostan sen pistän tuon koodin vain siihen eteen? Osaako tuo koodi siis poimia rivinvaihdot ja välilyönnit?
Ei se poimi mitään välilyöntejä eikä rivinvaihtoja. Se muuttaa rivinvaihtomerkit <br>-tageiksi. -tossu-:n koodi vastaa PHP:n omaa funktiota, nl2br:ää, mutta PHP:n oma toteutus huomioi kaikki muutkin rivinvaihtomerkit.
1. Tallenna teksti tietokantaan niin kuin käyttäjä se on antanut. Muista silti ajaa se mysql_real_escape_string-funktion läpi.
2. Hae tieto kannasta, aja funktiosi läpi, joka käsittelee tagit.
3. Muuta rivinvaihtomerkit <br>-tageiksi nl2br-funktiolla.
Mikä hyöty mysql_real_escape_string:istä siis on? Ja pitääkö minun tehdä omat rivinvaihtotagit (esim [ur]) vai riittääkö, että riviä vaihdettaessa painaa enteriä?
ZuBer kirjoitti:
Mikä hyöty mysql_real_escape_string:istä siis on?
Mysql_real_escape_string estää SQL-injektiot. Niitä on käsitelty tälläkin foorumilla tarkemmin ainakin n+1 kertaa. Lue ensiksi vaikka PHP-oppaan kappale aiheesta: https://www.ohjelmointiputka.net/oppaat/opas.
ZuBer kirjoitti:
Ja pitääkö minun tehdä omat rivinvaihtotagit (esim [ur]) vai riittääkö, että riviä vaihdettaessa painaa enteriä?
Ei tarvitse. Enterin painaminen vastaa merkkien Carriage return
ja Line feed
kirjoittamista. Monesti ne merkitään \r\n
. Antamani koodi tai nl2br-funkio muuttaa rivinvaihdot br-tageiksi. Vaikka pieni toiminnallinen ero niillä onkin, sillä ei ole tässä yhteydessä merkitystä.
Jos sitten aikoo tehdä sellaisen systeemin, että sitä aiemmin kirjoitettua tekstiä voi muokata ja haluaa ladata sen merkkijonon textarea-kenttään, tulostetaanko br-tagit sinne, vaiko saako ne tulostumaan rivinvaihtoina?
Kannattaa ladata se muotoilematon versio, jotta se muokkaus toimisi aina samalla tavalla ja jottei tekstiä muotoiltaisi kahdesti. Niin ja ne rivinvaihdot näkyvät textareassa sellaisenaan ilman br-tagia.
Vaikka laitan tuon
$teksti = str_replace (array ("\r", "\n"), array ("", "<br>"), $teksti);
siihen koodiin, ei tapahdu mitään. Siellä tulostuksen joukossa vaan näkyy \r\n merkkejä rivivaihtojen tilalla...
ZuBer kirjoitti:
Siellä tulostuksen joukossa vaan näkyy \r\n merkkejä rivivaihtojen tilalla...
Ei \r\n -"merkkiä" voi mitenkään nähdä. Se on koodi, joka saa tekstin jatkumaan seuraavalta riviltä, ja jonka saa "kirjoitettua" painamalla enteriä. Ethän vaan ole kirjoittanut siihen textareaan "\r\n"? Se ei nimittäin toimi.
En. Olen kirjoittanut siihen:
Ensimmäinen rivi Toka rivi Ja kolmas rivi
Tulos:
Ensimmäinen rivi\r\nToka rivi\r\nJa kolmas rivi\r\n
Millä tavalla olet tämän tuloksen saanut? Oletko käsitellyt tekstiä jollain funktiolla?
Ennen kantaan tallennusta mennyt htmlspecialchars ja mysql_real_escape_string läpi.
Tietokannassa näkyy myös nuo \r\n jutut.
Ja miten käytät tietokantaa?
Yksinkertaistettuna:
Kun käyttäjä kirjoittaa tekstiä textareaan ja painaa lähetä, kulkee teksti htmlspecialchars ja mysql_real_escape_string läpi ja tallentuu tietokantaan longtextiin. Kun käyttäjä menee sivulle missä näitä "viestejä" voi katsella, ladataan tietokannasta GETtin antamaa id:tä vastaava sisältö, korvataan muutamia (esim. [l]) tageja (esim. <b>) tageilla ja sitten yritetään korvata \r\n br:rrällä tossun antaman koodin avulla. Sitten tulostus näytölle.
mysql_real_escape_string funktio escapettaa kenoviivat, joilloin \n -> \\n ja \r -> \\r.
Bravo! Kiitos! Nyt toimii!
ZuBer kirjoitti:
Kun käyttäjä kirjoittaa tekstiä textareaan ja painaa lähetä, kulkee teksti htmlspecialchars ja mysql_real_escape_string läpi ja tallentuu tietokantaan longtextiin.
Käytätkö tietokantaa mysql_-alkuisilla funktioilla vai PDO:lla?
Macro kirjoitti:
mysql_real_escape_string funktio escapettaa kenoviivat, joilloin \n -> \\n ja \r -> \\r.
Rivinvaihtokoodit eivät kyllä ole escapetettuja kun ne lomakkeelta tulevat, mutta mysql_real_escape_string escapettaa ne. Mikäli tekstin tallentaa sen jälkeen tietokantaan PDO:n avulla, escapetetaan ne vielä toisen kerran, jolloin koodit tallentuvat tietokantaan escapettetuina.
<p>Sisältö<FONT COLOR = "red">*</FONT>: <br> <textarea NAME="sisalto" TYPE=textarea ROWS="30" COLS="70"> <?php echo $sisalto; ?> </textarea>
Noin ei ainakaan toimi tuo \r\b tagien muuttaminen rivinvaihdoiksi muuttamalla ne <br> tageiksi. Miten tuo textarean sisällön asettaminen kuuluisi hoitaa?
Edit. Käytän PDO:ta.
-tossu- kirjoitti:
Macro kirjoitti:
mysql_real_escape_string funktio escapettaa kenoviivat, joilloin \n -> \\n ja \r -> \\r.
... mutta mysql_real_escape_string escapettaa ne.
Enkös juuri sanonut niin?
ZuBer kirjoitti:
Noin ei ainakaan toimi tuo \r\b tagien muuttaminen rivinvaihdoiksi muuttamalla ne <br> tageiksi. Miten tuo textarean sisällön asettaminen kuuluisi hoitaa?
Hae sisältö tietokannasta, aja htmlspecialchars funktion läpi ja tulosta juuri tuolla tavalla se textareaan. Älä aja nl2br-funktiota, koska <br> tageilla ei ole textareassa merkitystä. Ne näkyvät siellä tekstinä.
ZuBer kirjoitti:
Käytän PDO:ta.
Sitten sinun ei tarvitse (eikä pidäkkään) käyttää mysql_real_escape_string-funktiota, koska PDO hoitaa sen escapetuksen puolestasi. Rivinvaihdot näkyvät tietokannassa siksi omilla koodeillaan, koska olet escapettanut ne kahdesti.
Kiitos. Nyt toimii!
Macro kirjoitti:
Enkös juuri sanonut niin?
Sanoit, että mysql_real_escape_string escapettaa kenoviivat. Niinhän se tekee, mutta tekstissä ei ole kenoviivoja ellei niitä joku sinne kirjoita, sillä rivinvaihtokoodeja ei ole vielä tässä vaiheessa escapetettu. Rivinvaihdoille siis tapahtuu seuraavaa: rivinvaihtokoodi (ASCII dec. 10) -> merkkijono \n
. Aika turhaa pilkunviilaustahan tämä oli. :)
Minulle tuli ongelma, kun lataan merkkijonon jossa on sanaväli tekstikenttään (text), kaikki sanavälin jälkeen häviää. Vain eka sana jää. Kun taas käytän textarea:a, kaikki toimii. En vain haluaisi käyttää sitä, sillä se ladattava merkkijono on "aihe" ja aiheessa on vain yksi rivi.
<INPUT NAME="aihe" TYPE="text" SIZE=40 VALUE=<?php echo $aihe ; ?>></p>
Se häviää, koska HTML-koodisi virheellistä.
<input type="text" name="aihe" size="40" value="<?php echo $aihe; ?>">
Opettele kirjoittamaan tagit ja attribuutit pienillä kirjaimilla, laittamalla attribuuttien arvot lainausmerkkeihin ja lopettamaan rivitys tagin sisällä.
Mod. vaihtoi oikeat kooditagit!
Kiitos! Ja kiitos opetuksesta, koitan opetella. Se onkin helpompaa, ettei tarvitse capsia naputella. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.