Pitkästä aikaa pitää vääntää php-koodia. Aika tehnyt tehtävänsä ja olen aivan pihalla. :) Jos vähän jeesaatte niin ehkä muistini virkistyy ja saan loput ongelmista itse ratkottua.
Ensiksi ihan tiedon hakeminen kannasta.
Taulun nimi on "sivusto" ja siellä on rivi "harjoitusajat_sisalto".
Se pitää nyt sisällään vain paljon teksiä.
<?php //avataan yhteys tietokantaan $yhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$yhteys) or die ("Tietokannan valitseminen epäonnistui!"); $kysely = "SELECT harjoitusajat_sisalto FROM sivusto"; echo "$harjoitusajat_sisalto"; ?>
Näin muistelen ulkoota, mutta mitään ei tulosta.
Mitä ihmettä olen unohtanut tuosta?
https://www.ohjelmointiputka.net/oppaat/opas.
Olet unohtanut käyttää funktioita kuten mysql_query(); sekä mysql_fetch_assoc(); Eli itse asiassa koodisi vain avaa yhteyden, määrittää yhden muuttujan, eikä mitään muuta.
<?php //avataan yhteys tietokantaan $yhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$yhteys) or die ("Tietokannan valitseminen epäonnistui!"); $kysely = "SELECT harjoitusajat_sisalto FROM sivusto"; $haku = mysql_query($kysely, $yhteys); $tiedot = mysql_fetch_assoc($haku); echo $tiedot["harjoitusajat_sisalto"]; ?>
Tuo ehkä tepsii, en kokeillut.
Kiitos, tuo toimi.
mysql_query, tuohan se oli mitä hain takaa. :)
Hmm...yhden asian hakeminen kannasta olikin siis noin "monimutkaista",
ei tuota varmaan helpommin (lue: vähemmän koodia) voi tehdä?
Joka tapauksessa pitää vielä tarkkaan sulatella tuokin koodinpätkä, että
varmasti ymmärrän mitä joka kohdassa tapahtuu...
--
Jos vain tuo yksi rivi on tuossa kyseisessä taulussa niin enhän silloin tarvitse sinne laittaa mitään riviä "id"? Otin sen pois niin se herjailee phpmyadmin sivuilla, että "indeksi puuttuu". Enkä voi laittaa indeksiksi tuota "harjoitusajat_sisalto" riviä? Onko mitään väliä vai miten tuo puoli oikein pelas?
Indeksillä ei minun mielestäni ole kauheasti väliä. Ei ainakaan minun hommia ole ennen häirinnyt. Joku guru optimointihommiltaan varmastikin ampuu mielipiteeni alas ja kertoo sinulle, miksi se kuitenkin olisi tärkeä.
Itse tykkään tehdä tekstitiedostoja mieluummin kuin mysql-tauluja tuollaiseen tarkoitukseen, mutta tokihan tietokanta on turvallisempi. Jos sinulla on vain yksi rivi ja yksi arvo tuossa taulussa, en usko että kuitenkaan tarvitset mitään ID:itä. Vai ymmärsinkö väärin?
On melkeinpä fiksuinta tehdä oma funktio hakujen tekemiseen:
<?php function suoritaKysely($kysely) { if ($haku = mysql_query($kysely)) { return mysql_fetch_assoc($haku); } else { exit("<p>Kyselyn suoritus epäonnistui!</p>"); } } $tiedot = suoritaKysely("SELECT harjoitusajat_sisalto FROM sivusto"); ?>
Heitin tuon hatusta, mutta tuolla periaatteella homma menee kertaluokkaa järkevämmäksi (vähemmän koodia, ylläpidettävyys paranee jne.), ja saa haluamansa virheenkäsittelijän helposti kyselyille.
Samoin kannattaa tehdä oma funktio tietokantaan yhdistämiselle, ja laittaa sitten nämä tietokantafunktiot omaan tiedostoon ja laittaa sitä käyttäville sivuille require_once("tietokantafunktiot.php"); jolloin koodi selkenee edelleen:
<?php require_once("tietokantafunktiot.php"); yhdistaTietokantaan(); $tiedot = suoritaKysely("SELECT harjoitusajat_sisalto FROM sivusto"); ?>
Sen yhteys-muuttujan kuljetus on aika turhaa, mysql_query kun osaa nuuskia automaattisesti skriptin avaaman yhteyden, ja käyttää sitä automaattisesti.
Jos tietokannassa on vain yksi rivi, voidaan toki miettiä onko tietokannan käyttö järkevää ;) Mutta ne indeksit eivät ole pakollisia, ne vain nopeuttavat tiedon löytymistä erittäin paljon. Sillä tosin ei sinänsä ole huomattavaa eroa suorituskyvyssä (0.0001sec vs 0.001sec) ennenkuin rivejä on tuhansia, ja eritoten kun relaatioita (eli viitteitä eri taulujen välille) tulee.
Kiitos kaikille hyvistä vinkeistä.
Pitää ajan kanssa lukea vielä viestinne ja tutkia koodit läpikotoisin, että vielä kunnolla ymmärrän mistä kyse.
Teen yhdelle sivustolle siis admin paneelin, jotta kuka tahansa
voi muuttaa erään sivuston teksisisältöjä. Siksi tälläistä koodaileen.
Ehkä olisi järkevää tehdä kaikki "muutettavat jutut" taulun "sivusto" sisään, eikä tehdä jokaisesta asiasta omaa taulua. Eli siinä mielessä minun on pakko ottaa se "id-rivi" käyttöön vai onnistuuko se ilman sitä?
(Oletan, että jokaisella asialla on se yksi rivi kannassa, joten mitään "tulosta niin kauan kun dataa löytyy" ei tarvitse tehdä...kai)
Tarkoitan siis, että enkö voi tulostaa kaikille nettisivuston eri sivuille näin.
harjoitusajat-sivu:
<?php require_once("tietokantafunktiot.php"); yhdistaTietokantaan(); $tiedot = suoritaKysely("SELECT harjoitusajat_sisalto FROM sivusto"); ?>
Sitten vaikka uutiset:
<?php require_once("tietokantafunktiot.php"); yhdistaTietokantaan(); $tiedot = suoritaKysely("SELECT uutiset FROM sivusto"); ?>
Noin onnistuu ilman mitään id-juttuja?
Jos funktiot on oikein, kyllä tuon pitäisi nopealla vilkaisulla toimia, ihan ilman mitään id-juttuja.
Pitäisi kai toimia, paitsi että eihän tuossa vielä tulosteta mitään :) Sinänsä tietokannan rakenne noissa esimerkeissäsi näyttää hieman vääristyneeltä.
Sinun pitäisi hyvän tietokantasuunnittelun mukaisesti tehdä yhden kaltaiselle asialle yksi taulu, kuten uutisille oma, harjoitusajoille oma jne. Taulun sarakkeet sitten ovat kyseisen asian ominaisuuksia. Kuten uutiset taulussa sarakkeet voisivat esimerkiksi olla "kirjoittaja" - "kirjoitusaika" - "uutinen".
Kun tietokannan rakenne on sitten järkevästi muodostettu, on sieltä hakeminen helppoa ja nopeaa, ja samoin siinä olevien tietojen muokkaaminen, lisääminen sekä poistaminen.
Tärkeintä tässä vaiheessa siis olisi että ymmärtäisit relaatiotietokannan idean (googlella löytyy artikkeleita hakusanalla "relaatiotietokanta").
JTS: ok, hyviä pointteja. Tästä piti vain tulla todella alkeellinen admin työkalu, että vain eri sivujen puhdasta tekstisisältöä voi vain muuttaa. Toisaalta voisi kuitekin fiilistellä ja laittaa uutisiin juuri nuo ehdottamasi ideat. Ok, teen jokaiselle muutettavalle jutulle oman taulun.
Ainiin, mutta silloin jokaiselle sivulle pitää tehdä oma config.php, koska jokaisella sivulla oma taulunsa käytössä. No ei kai se iso vaiva.
Tämä niin pieni projekti ettei sillä nyt juuri väliä miten teen tietokannan, tärkeintä olisi saada php-koodi edes jotenkin järkeväksi ja niin, että saan taas php-koodauksesta jotenkin kiinni.
Pitää tutkia ja hutkia vielä, laitan tänne koodia niin voitte sitten kommentoida.
En tiedä, mitä tarkoitat config.php:llä, mutta jos tarkoitat noissa esimerkeissä olevaa "tietokantafunktiot.php", niin eihän niitä tarvitse mitenkään muutella, ne käy ihan mihin vain.
Eikä muutenkaan ole mitään järkeä, että teet joka sivulle jonkun eri tiedoston jossa on tyyliin kolme riviä. Silloin jos sivustollasi on esim. 47 php-tiedostoa (erittäin, erittäin mahdollista), sinulla onkin yhtäkkiä miltei 100 tiedostoa vain configejesi takia. Erillisen config.php -tiedoston (tai funktiot.php -tiedoston tms.) ideahan juuri on, että jos asiat muuttuvat, sinun tarvitsee muuttaa vain yhtä ainutta tiedostoa. Mutta jos sinulla on oma config joka sivulle, tämä idea on ihan sama, kuin sisällytäisit configisi jokaiseen tiedostoon jo valmiiksi sisälle, koska sinun tarvitsisi joka tapauksessa muokata 47 tiedostoa käsin.
Antti80 kirjoitti:
JTS: ok, hyviä pointteja. Tästä piti vain tulla todella alkeellinen admin työkalu, että vain eri sivujen puhdasta tekstisisältöä voi vain muuttaa.
Jos tuollaisen teet niin yksi taulu toki riittää, jossa olisi sarakkeina vaikka ihan vain "Nimi" ja "Sisältö". Tulkitsin vain aiemmasta viestistäsi että haluaisit esimerkiksi tehdä uutiset omaksi kokonaisuudekseen.
SysRq868:
Ok. Vielä melkeinpä alkeita opettelen php:n saralla, joten juuri tuo "helpon koodin" tekeminen on minulle vaikeeta. Hienoa, että teiltä saan vinkkejä niihin.
config.php tiedostossa on siis ne kaikki päätiedot kannasta: tunnus, salasana, taulun nimi jne.
Sitä hain takaa, että jos teen kaikista (noin 7 eri sivusta) sivuista tietokantaan oman taulun niin enkö silloin tarvitse 7 eri config.php tiedostoa, jossa jokaisessa on eri taulun nimi?
Koska php-koodissa on aina näin:
<?php //avataan yhteys tietokantaan $yhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$yhteys) or die ("Tietokannan valitseminen epäonnistui!"); ?>
Vai onko jotenkin mahdollista, että voisin samaan config.php tiedostoon laittaa ne eri taulujen nimet ja jotenkin koodata, että tuo koodinpätkä tietäisi aina mistä taulusta kyse?
Vaikka onnistuisi niin tuleepahan koodia edes sen 7 "rivin" verran enemmän config.php tiedostoon.
Korjatkaa jos olen hakoteillä? :)
JTS:
Sori, vähän epäselvää itsellenikin, että miten oikein teen. Yritän ensiksi tehdä yhden sivun kunnolla (tulostaminen ja admin-sivuilla tekstin muokkaaminen) ja sitten vasta lopullisesti päätän minkälaiseksi rakennan tietokannat. Se olkoon pienin murhe, yritetään nyt edes koodia saada oikeanlaiseksi. :)
Helppo ratkaisu: jätä käyttökohtaiset muuttujat pois config.php:stä, ja määritä ne vasta siinä, kun niitä tarvitaan. Esimerkki:
config.php
<?php $db_user = "esimerkki"; $db_password = "1234"; $db_server = "localhost"; $db_db = "kanta"; ?>
uutiset.php
<?php include("config.php"); //avataan yhteys tietokantaan $yhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$yhteys) or die ("Tietokannan valitseminen epäonnistui!"); $kysely = mysql_query("SELECT * FROM uutiset", $yhteys); // ... ?>
aikataulut.php
<?php include("config.php"); //avataan yhteys tietokantaan $yhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$yhteys) or die ("Tietokannan valitseminen epäonnistui!"); $kysely = mysql_query("SELECT * FROM aikataulut", $yhteys); // ... ?>
Vain yksi config.php on helpompi ratkaisu, koska jos joudut esim. muuttamaan MySQL-käyttäjän salasanaa joskus, sinun tarvitsee vain muuttaa yhtä tiedostoa.
Tämä tietenkin olettaa, että sinulla on yksi tietokanta jossa on eri taulu jokaiselle sivuston toiminnolle. Tekstistäsi voisi ymmärtää, että olet luonut oman tietokannan jokaiselle toiminnolle.
SysRq868 kirjoitti:
Helppo ratkaisu: jätä käyttökohtaiset muuttujat pois config.php:stä, ja määritä ne vasta siinä, kun niitä tarvitaan. Esimerkki:
Aivan. Hetkonen miksiköhän minulle on tullut semmoinen tapa aikojen alusta, että myös taulun nimi pitäisi määrittää myös moiseen config.php tiedostoon. Tämähän nyt ratkaisi monen ongelman. :)
SysRq868 kirjoitti:
aikataulut.php
<?php include("config.php"); //avataan yhteys tietokantaan $yhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$yhteys) or die ("Tietokannan valitseminen epäonnistui!"); $kysely = mysql_query("SELECT * FROM aikataulut", $yhteys); // ... ?>
Hetkonen. Siis tuossakaan kohden ei missään määritetä mitään taulun nimeä mihkään muuttujaan? Eli riittää, että on tuo "FROM tähänjokutaulunnimi" niin se hoituu sillä. Olenko oikeassa?
SysRq868 kirjoitti:
Tämä tietenkin olettaa, että sinulla on yksi tietokanta jossa on eri taulu jokaiselle sivuston toiminnolle. Tekstistäsi voisi ymmärtää, että olet luonut oman tietokannan jokaiselle toiminnolle.
Ok. Joo, koko ajan vehtaan edestakas, että kumman toteutuksen teen siksi vähän ristiriitaisesti kirjoittelen, kun tuppaan mielipidettä vaihtamaan koko ajan. Mutta esimerkkisi innoittamana kannattaisi tehdä koodi juuri noin ja kantaan eri taulu jokaiseen "muutokseen" mitä halutaan voida sivuille tehdä.
Tähän väliin sopiikin heittää se kuuluisa SELECT * IS EVIL.
Antti80: Olet täysin oikeassa. MySQL-kysely kannattaa itse asiassa tehdä muuttujaan vain, jos haet kyselyyn tietoja jostain toisesta muuttujasta, kuten
<?php $rivi = "SELECT ".$haettavat." FROM ".$_GET["tid"]." LIMIT ".($_POST["limit"]+1); $kysely = mysql_query($rivi, $yhteys); ?>
Toimiihan se suoraan mysql_query:nkin sisällä (kai), mutta ainakin minulle tuo on selvempää luettavaa, ja yleensä moni virheilmoitus korjaantuu sillä, kun laitan kyselyn erilliseen muuttujaan.
tsuriga: Eikä sovi. Se oli vain nopea heitto, enkä tiedä taulun sarakkeita. Mutta kiitos vinkistä tosin, en tiennytkään tuollaista olevan olemassa (kaipa sitä joku nörtti aina jossain vinkuu jostakin).
SysRq868:
Muista sitten escapoida (ja siistiä) nuo $_GET ja $_POST -muuttujat ennen kuin tyrkkäät ne queryyn.
edit:
ja riippuen mistä tuo $haettavat -muuttujakin tulee, niin tehdä sille myös temput, jottei aivan omituisuuksia sinne pääse.
Huoh, meinas jo hermo mennä kun ei vaan luonnistu yksinkertaisten funktioiden teko. Ehkä on parempi palata ihan alkuun ja unohdetaan funktiot vähäksi aikaa.
<?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); //1,2,3 $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; $haku = mysql_query($mitahaetaan, $tietokantayhteys); $tiedot = mysql_fetch_assoc($haku); //4. Tulostetaan haluttu asia echo $tiedot["harjoitusajat_sisalto"]; ?>
Yhteyden ottaminen kantaan on selvää kauraa.
Vielä yritän ymmärtää loppuosaa.
1.Sitten tehdään muuttuja, että mitä haetaan ja mistä.
2.Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta.
3.Mitä tuo mysql_fetch_assoc tekee?
4.Lopulta tulostetaan haluttu tieto. Miksi piti olla tälläiset "[]" sulkeet, eikä esim "()" tuossa kohden?
Vaikka tuossakin vain neljä riviä niin saako sitä vielä yksinkertaisemmin koodattua? (Siis ilman mitään funktioita)
Heh, jotenki vaikea hyväksyä tuota vaikka se on ihan oikein.
Allekirjoittaneen omassa php-kielessä näin yksinkertainen koodaus näyttäisi paljon järkevämmälle ja helpommalle:
$mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; echo $mitahaetaan
Loogista, mutta tuosta siis puuttunee kokonaan tietokantayhteys
ja kaikki muut mahdolliset muuttujien "putsaajat" :)
Koodissa muuttuja $haku sisältää tavallaan kaikki kyselyn hakemat rivit. Funktiolla mysql_fetch_assoc noudetaan sitten yksi rivi (seuraava rivi) käsittelyyn. Jos rivejä on useita, funktiotakin täytyy kutsua monta kertaa. Funktio palauttaa rivin tiedot taulukossa, jonka indekseinä ovat kenttien nimet ja arvoina niiden sisällöt. Tavalliset sulkeet viittaavat funktioon, hakasulkeet taas taulukkoon.
Funktioiden käyttö on aika välttämätöntä tietokannan käsittelyssä, mutta kyllä funktioihin tottuu, kun ohjelmoi vähän enemmän. Valmiiden funktioiden päälle voi kuitenkin luoda omat selkeämmät funktiot JTS:n mallin mukaan. Yleensä tietokannasta haetaan kerrallaan useita kenttiä ja monta riviä, jolloin ehdottamasi yksinkertaistus ei kelpaisi sellaisenaan.
Antti Laaksonen kirjoitti:
Funktiolla mysql_fetch_assoc noudetaan sitten yksi rivi (seuraava rivi) käsittelyyn.
Hmm...Eli tuo on aivan pakollinen, vaikka fakta on se, että kannassa on vain se "yksi taulukko ja yksi rivi". Eli tässä mun huvittavan yksinkertaisessa koodissa/tietokannassa niin tuo on pakollinen juttu? Jos ymmärsit mitä haen takaa? =)
Kiitos selvennöksistä, osan ehkä jopa tajusin. :)
---
EDIT:
Tässä pätkä eräästä vieraskirja koodista:
// tulostetaan tietokannasta luetut viestit for ($i = 0; $i < $vps; $i++) { // varmistetaan, että viimeisellä sivulle ei tule ylimääräistä if ($i + $sivu * $vps < $maara) { // tulostetaan viestin tiedot yksinkertaisesti muotoiltuna $aika = mysql_result($viestit, $i, 0); $nimi = mysql_result($viestit, $i, 1); $viesti = mysql_result($viestit, $i, 2); echo "<tr><td class=nimi_kirjoitti><b>$aika</b><br>$viesti</b><br> </td><td class=viesti>$nimi</td></tr><td class=tyhja></td></tr>"; } } ?>
Miksi esim. tuossa ei ole missään kohdassa käytetty sitä "associa"?
Yritän sitä kohtaa siis vielä sulatella.
Antti80 kirjoitti:
Eli tuo on aivan pakollinen, vaikka fakta on se, että kannassa on vain se "yksi taulukko ja yksi rivi".
Tiedot täytyy noutaa erillisellä funktiolla myös tässä erikoistapauksessa.
Antti80 kirjoitti:
Miksi esim. tuossa ei ole missään kohdassa käytetty sitä "associa"?
Funktio mysql_fetch_assoc on yksi monista tavoista tutkia tietokannasta haettuja tulosrivejä. Toinen tapa on funktio mysql_result, joka näkyy tuossa koodissa. Siinä rivejä ei käsitellä yksi kerrallaan, vaan funktiolla voi hakea minkä tahansa rivin minkä tahansa kentän.
ok, kiitos.
---
Sitten admin-sivuston pariin. Sinne vain linkkejä, joita klikkaamalla pääsee ainoastaan eri sivujen teksisisältöä muuttamaan. Tehdäänpä siis seuraavaksi harjoitusajat-sivun muokkaus lomake. No hitto, eli se näyttää toimivan lähes samalla koodilla kuin mitä käytin tulostamiseen, kas näin:
<?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); //Sitten tehdään muuttuja, että mitä haetaan ja mistä. $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta. $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa. $tiedot = mysql_fetch_assoc($haku); ?> <form method="post" action="admin_harjoitusajat_tallenna.php"> Harjoitusajat-sivun sisältö tällä hetkellä. Voit muokata sivun tekstisisältöä, jos haluat. <br><textarea name="harjoitusajat_sisalto" cols="100" rows="15"><?php print $tiedot["harjoitusajat_sisalto"]; ?></textarea><p> <input type=submit name="toiminto" value="Tallenna"> </form>
Näyttää toimivan, mutta onko silti jotain huomautettavaa?
(Tää onnistui liian helposti ;) )
Onko tuossa kaikki koodi? Nimittäin jos tietokantaa on tarkoitus muuttaa, jossain pitäisi olla UPDATE-lause.
Kohta saat lisää koodia, tuo admin muokkaus kun on kahdessa eri sivussa.
Siis tuo on vaan se eka sivu, missä lomakkeen textarea-kenttään tulostuu sen kyseisen sivun tekstisisältö ja siihen sitten voi kirjoitella/muokata mitä haluaa ja sitten painetaan "tallenna"...
------------
EDIT:
Ja tässä kaipaamasi lisäkoodit, mitä tapahtuu kun painetaan "tallenna" napista:
admin_harjoitusajat_tallenna.php
<?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); if ($toiminto == "Tallenna") { $sql_lauseke = "update harjoitusajat set harjoitusajat_sisalto='$harjoitusajat_sisalto'"; if (!$haesisalto = mysql_query($sql_lauseke,$tietokantayhteys)) { $onnistuvaiei = "Tietokantavirhe: " . mysql_error(); } else { $onnistuvaiei = "Päivitys onnistui!"; } } ?> <?php print "<font color=red>$onnistuvaiei</font>"; print "<br /><br /><center>NYT SIVUN TEKSTISISÄLTÖ NÄYTTÄÄ TÄLTÄ: <br /><br /><table><tr><td class=esikatselu>"; print "$harjoitusajat_sisalto"; print "</td></tr></table></center>"; ?>
Aivan, olen tottunut (lue: en osaa muutakaan) tekemään tälläiset kahteen eri php-tiedostoon. =)
Näyttää toimivan.
Jos yhden sivun hyödyn saarnaaminen jätetään pois niin onko tuosta pahaa sanottavaa?
No saarnataan edes sen verran, että tällä lailla saisit sen yhteen sivuun:
<?php if(!isset($_POST["toiminto"])){ // Tulostus ?> <!-- lomake --> <?php } else { // Tallennus echo "Kaikki OK!"; } ?>
Vaihtoehtoisesti, jos haluat joka sivulla näyttää lomakkeen, ja tämän "kaikki OK" ilmoituksen vain staattisena viestinä (eli sama kuin nyt, paitsi nyt "esi"katselua voi muokata eteenpäin), tee näin:
<?php if(isset($_POST["toiminto"])){ // Tallennus echo "Kaikki OK!<br><br>"; } else { echo "<br><br><br>"; } // Tulostus ?> <!-- lomake -->
Kummassakin esimerkissä luonnollisesti olisi <form> -tagin action -attribuutti sivu itse, eli tässä tapauksessa varmaankin "admin_harjoitusajat.php".
***
Mitä taas tulee tuohon nykyiseen tallennuskoodiin - mielestäni se näyttää ihan hyvältä, paitsi että siinä on aika paljon turhaa. Sen voisi tiivistää vaikka tällaiseksi:
<?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); if ($toiminto == "Tallenna"){ if (!$haesisalto = mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$harjoitusajat_sisalto'",$tietokantayhteys)){ echo "<font color=red>Tietokantavirhe: ".mysql_error()."</font>"; } else { echo "<font color=green>Päivitys onnistui!</font>"; } } echo "<br /><br /><center>NYT SIVUN TEKSTISISÄLTÖ NÄYTTÄÄ TÄLTÄ: <br /><br /><div class=esikatselu>"; echo $harjoitusajat_sisalto; echo "</div></center>"; ?>
Ehkä haljon hiuksia tai sitten en.
Ok.
Testailen jossain vaiheessa.
Olisihan se tietysti parempi, että olisi tuohon vain yksi php-tiedosto.
Antti80 kirjoitti:
Jos yhden sivun hyödyn saarnaaminen jätetään pois niin onko tuosta pahaa sanottavaa?
Toimiiko päivitys, jos tekstikenttään kirjoittaa heittomerkin? Jos ei toimi, lisää muuttujaan $harjoitusajat_sisalto tarvittavat kenoviivat heittomerkkien eteen funktiolla mysql_real_escape_string. PHP:n asetuksista riippuen nämä kenoviivat lisätään automaattisesti lomakemuuttujiin tai sitten ne joutuu lisäämään itse. Kenoviivat täytyy lisätä, koska muuten muuttujassa olevat heittomerkit sekoittuisivat SQL-kyselyssä oleviin heittomerkkeihin.
Toinen ongelmallinen kohta on tiedon haku tekstilaatikkoon (textarea-elementti). Jos tekstissä lukee vaikka "abcde </textarea> edcba", tekstilaatikko päättyy virheellisesti ennen aikojaan. Tämän ongelman ratkaisee funktio htmlspecialchars, joka muuttaa mm. merkin < muotoon < ja merkin > muotoon >. Näin teksti "abcde </textarea> edcba" muuttuu muotoon "abcde </textarea> edcba" ja selain ei enää käsittele siinä olevaa tagia.
Antti Laaksonen kirjoitti:
Toimiiko päivitys, jos tekstikenttään kirjoittaa heittomerkin?
Näyttäis toimivan vaikka minkälaista merkkiä laittaa.
Antti Laaksonen kirjoitti:
Toinen ongelmallinen kohta on tiedon haku tekstilaatikkoon (textarea-elementti). Jos tekstissä lukee vaikka "abcde </textarea> edcba", tekstilaatikko päättyy virheellisesti ennen aikojaan. Tämän ongelman ratkaisee funktio htmlspecialchars, joka muuttaa mm. merkin < muotoon < ja merkin > muotoon >. Näin teksti "abcde </textarea> edcba" muuttuu muotoon "abcde </textarea> edcba" ja selain ei enää käsittele siinä olevaa tagia.
En usko, että mitään tuollaista "erikoista" html-koodia olisi sivuilla.
Pointtisi on kuitenkin niin hyvä, että pitäisi varmaan varmuuden vuoksi moinen tehdä.
Voiko tiedon hakea sitten muuhun kuin textarea-kenttään muokattavaksi?
EDIT:
Auttaisiko tämä pätkä mihinkään:
function get_user_text($data) {return get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes($data)) : mysql_real_escape_string($data);}
EDIT2:
SysRq868:
Kokeilen vinkkisi mukaan laittaa muokkauksen yhdelle sivulle, palataan siihen myöhemmin.
Kiitos kun putsasit sitä koodiani, otin sen käyttöön.
LOL...muutit table-tagit div-tageiksi. ;)
Antti80 kirjoitti:
Voiko tiedon hakea sitten muuhun kuin textarea-kenttään muokattavaksi?
Voi kyllä, mutta silloinkin pitää olla tarkkana. Esim. jos käytössä on tavallinen tekstikenttä (<input type="text">), tekstissä olevat lainausmerkit voivat katkaista value-attribuutin ennen aikojaan. Tähänkin vaivaan auttaa funktio htmlspecialchars, kunhan sille annetaan lisäparametri ENT_QUOTES.
Antti80 kirjoitti:
Auttaisiko tämä pätkä mihinkään:
Eipä se haittaakaan, mutta kun PHP:si on näköjään säädetty niin, että se lisää kenoviivat automaattisesti, tuota ei oikeastaan tarvita. Sellainen hyöty tuosta kyllä on, että kenoviivat lisätään oikein PHP:n asetuksista riippumatta. Eli jos siirrät sivun myöhemmin palvelimelle, jossa kenoviivat eivät tulekaan automaattisesti, tuota käyttämällä koodiin ei tarvitse tehdä muutoksia.
Jepjep.
Kannattaisiko esim. vielä tälläiset lisäykset tehdä?
//poistetaan ylimääräiset kenoviivat (\)
$harjoitusajat_sisalto = stripslashes($harjoitusajat_sisalto);
//estetään HTML-tagien käyttäminen
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto);
Toisaalta haluaisin, että sivua muokatessa niin voisi käyttää muutamaa html-tagia. Ainakin <b>, <a href>, <br /> ja <p>. Että sentään voisi sitä kautta linkkejä tehdä ja kappaleita jakaa jne.
Pitäisikö sitten laittaa näin:
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto), '<b><p><br><a>');
htmlspecialchars();
muuntaa kaikki erikoismerkit (joihin kuuluu HTML:ssä käytettävät pienempi kuin- ja suurempi kuin -merkit) HTML-muotoisiin merkki-ilmaisuihin, jotka kaikki alkavat et-merkillä ja loppuvat puolipisteeseen. Se ei siis sinänsä tunnista erikseen mitään HTML-tageja, vaan suruttaa muuttaa ihan kaikki sille syötetyt erikoismerkit HTML-ilmauksiin.
Itse tässä tekisin näin:
<?php // ... //poistetaan ylimääräiset kenoviivat (\) $harjoitusajat_sisalto = stripslashes($harjoitusajat_sisalto); //estetään HTML-tagien käyttäminen $harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto); //sallitut merkit takaisin $teksti = str_replace("<b>", "<b>", $harjoitusajat_sisalto); $teksti = str_replace("</b>", "</b>", $teksti); $teksti = str_replace("<i>", "<i>", $teksti); $teksti = str_replace("</i>", "</i>", $teksti); $teksti = str_replace("<p>", "<p>", $teksti); $teksti = str_replace("</p>", "</p>", $teksti); $teksti = str_replace("<br/>", "<br/>", $teksti); $teksti = str_replace("<br />", "<br />", $teksti); $teksti = preg_replace("/<a href=\"(.+)\">(.+)</a>", "<a href=\"${1}\">${2}</a>", $teksti); $harjoitusajat_sisalto = $teksti; // ... ?>
En testannut, mutta tuon kyllä pitäisi toimia. Tosin, se olettaa, että tageille ei anneta mitään attribuutteja. Jos haluat antaa niille attribuutteja kuitenkin (XHTML:möimisessäsi), joudut käyttämään kaikkiin preg_replace
a.
Totta kai tähän on olemassa joku simppelimpikin funktio, ainahan on.
Näyttää tosiaan monimutkaiselle, jos nyt edes tajusin.
Minulla on samantyylinen vieraskirja koodi ja sinne olen estänyt html-koodien kirjoittamisen, vain muutama tagi sallittu.
Ja sen juurikin näin toteutettu:
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto), '<b><p><br><a>');
Toisaalta nyt on kyse admin-osiosta niin miksipä sieltä kieltäisin html-muokkauksen. Sehän on vain hyvä, että admin voi tekstisisällön lisäksi tehdä sinne linkkejä ja kappaleenvaihtoja jne jne. Joten enpa taidakaan tuota edes laittaa.
Ai hitto, mutta Laaksosen Antti otti tämän pointin aikaisemmin esiin:
"Toinen ongelmallinen kohta on tiedon haku tekstilaatikkoon (textarea-elementti). Jos tekstissä lukee vaikka "abcde </textarea> edcba", tekstilaatikko päättyy virheellisesti ennen aikojaan. Tämän ongelman ratkaisee funktio htmlspecialchars, joka muuttaa mm. merkin < muotoon < ja merkin > muotoon >. Näin teksti "abcde </textarea> edcba" muuttuu muotoon "abcde </textarea> edcba" ja selain ei enää käsittele siinä olevaa tagia."
Äh, nyt menin jo totaalisen sekaisin... :|
htmlspecialchars estää siis html-tagien käyttämisen ja tuon Laaksosen Antin esimerkin mukaan kannattaisi tuo funktio siis ehdottamasti lisätä. Se siis selvää, jep. Mutta jos haluan, että admin voisi noi aikaisemmin mainitsemani tagit tehdä muokatessa niin sitten pitää viilata.
Tuo SysRq868 esimerkki näyttää kyllä todella "monimutkaiselta" siis paljon koodia, kun jossain aikaisemmassa vieraskirja skriptissä olen saman homman hoitanut lähes yhellä rivillä jotenkin näin:
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto), '<b><p><br><a>');
Olenko nyt ihan pihalla? :)
Antti Laaksonen kirjoitti:
Antti80 kirjoitti:
Auttaisiko tämä pätkä mihinkään:
Eipä se haittaakaan, mutta kun PHP:si on näköjään säädetty niin, että se lisää kenoviivat automaattisesti, tuota ei oikeastaan tarvita. Sellainen hyöty tuosta kyllä on, että kenoviivat lisätään oikein PHP:n asetuksista riippumatta. Eli jos siirrät sivun myöhemmin palvelimelle, jossa kenoviivat eivät tulekaan automaattisesti, tuota käyttämällä koodiin ei tarvitse tehdä muutoksia.
Tunnistin koodin omakseni ja itseasiassa tuo PHP:n magic_quotes_gpc, eli juuri nuo automaattiset takakenot eivät aja samaa asiaa, kuin mysql_real_escape_string(). (edit) Toki tuokin toimii, mutta jos haluaa tehdä asian "oikein", niin magic quotesit hemmettiin ja käyttää tietokannan *_escape_string()-funktiota tai sitten jotain tietokanta-abstraktiota (esim. pdo), jolloin ei tartte miettiä muuta kuin että tuo tyhmä takakenoasetus on pois päältä.
SysRq868 kirjoitti:
Itse tässä tekisin näin: ...
Itse käyttäisin bbcodea :)
ajv, joo aikaisemmasta vieraskirjas koodistani tuo oli kun silloinkin autit.
Äijät, virta päälle ja vastatkaa tähän:
Tuo SysRq868 esimerkki näyttää kyllä todella "monimutkaiselta" siis paljon koodia, kun jossain aikaisemmassa vieraskirja skriptissä olen saman homman hoitanut lähes yhellä rivillä jotenkin näin:
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto), '<b><p><br><a>');
Kiitos :)
Antti80 kirjoitti:
Tuo SysRq868 esimerkki näyttää kyllä todella "monimutkaiselta" siis paljon koodia, kun jossain aikaisemmassa vieraskirja skriptissä olen saman homman hoitanut lähes yhellä rivillä jotenkin näin:
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto), '<b><p><br><a>');
No toimiiko se noin? Olen ehkä puusilmä, mutta PHP:n manuaali ei tuollaisesta pukahda mitään:
string htmlspecialchars ( string string [, int quote_style [, string charset]] )
Tuo SysRq868:n versio näyttää ihan järkevältä. Pitkää koodimäärää ei kannata pelästyä, vaan funktioida se, nakata se johonkin erilliseen funktiot-tiedostoon ja includettaa kyseinen tiedosto sivun alussa (mikäli niitä funktioita tarvitaan tietty).
Sellainen koodin pätkä minulla on tosiaan vieraskirjassa, mielestäni se toimii.
Pitänee ehkä vielä illalla varmistaa, että toimiiko se varmasti oikein...
Olisiko kenties juuri "AJV" tuon koodin opettanut minulle vai kuka? :)
Pitänee kaivaa vanha vieraskirja-koodin viestiketju täältä...
EDIT:
Rupesin miettimään, että puhutaanko me kahdesta eri asiasta. =)
Kun mietin taas Laaksosen Antin sanoja...
Oli miten oli niin testaan tuon koodin pätkän illalla kotona ja
selitän sitten tarkasti miten se toimii jos toimii. =)
Kiitos kuitenkin JTS tuosta SYSRq868:n koodin selityksestä.
str_replace syö myös taulukoita.
Noniin, siellä mun vieraskirjassa koodi olikin näin:
$viesti = strip_tags ($_POST['viesti'], '<b><i>');
Eli tuolla tavalla saikin valita mitä tageja-sallii.
Tuota nyt en tähän voi soveltaa... tai pitäisi melkein alusta tehdä uusiksi jos onnistuisi? Oli miten oli niin ehkä unohdetaan tuo.
Vai oliko tämä koodin pätkä jostain Laaksosen Antin skriptistä? =)
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto), '<b><p><br><a>');
Ehkä parempi että unohdetaan tuon vääntäminen, kohta te ootte ihan sekaisin mun sekoiluista? :D
Takas ite ongelmaan, koska kyse siis admin-osiosta niin eipä haittaa vaikka en ole estänyt html-tageja, koska ihan hyvä vaan, että admin voi käyttää html-tageja sisällön muokkaamiseen/esittämiseen.
Mutta Laaksonen Antti otti tälläisen asian jo aikaisemmin esiin:
"Toinen ongelmallinen kohta on tiedon haku tekstilaatikkoon (textarea-elementti). Jos tekstissä lukee vaikka "abcde </textarea> edcba", tekstilaatikko päättyy virheellisesti ennen aikojaan. Tämän ongelman ratkaisee funktio htmlspecialchars, joka muuttaa mm. merkin < muotoon < ja merkin > muotoon >. Näin teksti "abcde </textarea> edcba" muuttuu muotoon "abcde </textarea> edcba" ja selain ei enää käsittele siinä olevaa tagia."
Eli jos admin muokatessa laittaa noita html-tageja ja esim. juuri tuon </textarea> niin tätä ongelmaa varten tarvitsen siis ratkaisun.
Laaksonen sanoi, että ratkaisu on tuo "htmlspecialchars".
Mutta sitten "SysRq868" kirjoitti koodi esimerkin jossa oli näin:
//estetään HTML-tagien käyttäminen $harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto);
Joten onko jompikumpi väärässä, vai tarkoittaako nuo molemmat samaa asiaa?
Jos tuo juuri estää html-tagit niin minunhan oli siis ne tarkoitus sallia sillä tavalla että "textarea:ssa" voi admin tehdä html-tageja niin että kaikki tallentuu loppuun asti oikein eikä kävisi niin kuten Laaksonen sanoi jos laitan "</textarea>".
Ymmärsittekö mitä haen takaa? :)
Nopeiten saat vastauksen kokeilemalla eri vaihtoehtoja.
Hyvä vastaus :) Voin toki testata miten tämä toimii:
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto);
Uskon, että se estää html-tagien käytön, mutta mitäköhän sitten Laaksosen Antti haki takaa?
Mutta testaan tuon koodin pätkän niin sittenpä varmasti tiedän, miten se toimii. :)
Ensinnäkin tiedot kannattaa tallentaa tietokantaan sellaisenaan ilman mitään muutoksia. Tulostusvaiheessa HTML-merkinnät voi sitten tarvittaessa muuttaa sellaiseen muotoon, että selain ei käsittele niitä. Tämä on tarpeen ainakin silloin, kun tiedot haetaan muokattavaksi tekstilaatikkoon. Muuten tekstissä oleva </textarea> tulkitaan HTML-tagiksi ja tekstilaatikko päättyy liian aikaisin.* Mutta kun tiedot näytetään sivulla, HTML-merkintöjä ei ole pakko estää, jos on juuri tarkoitus, että käyttäjä voi kirjoittaa niitä tekstiin.
* Tietysti voisi tehdä niinkin, että ainoastaan </textarea>-tagi, jossa voi olla sekaisin isoja ja pieniä kirjaimia, muutetaan tekstissä, mutta helpommalla varmaan pääsee, kun muuttaa saman tien kaikki HTML-merkinnät.
Heh, kohta revitte pelihousunne kun minun on vaan vaikeeta tajuta. ;)
SysRq868 koodi:
<?php // ... //poistetaan ylimääräiset kenoviivat (\) $harjoitusajat_sisalto = stripslashes($harjoitusajat_sisalto); //estetään HTML-tagien käyttäminen $harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto); //sallitut merkit takaisin $teksti = str_replace("<b>", "<b>", $harjoitusajat_sisalto); $teksti = str_replace("</b>", "</b>", $teksti); $teksti = str_replace("<i>", "<i>", $teksti); $teksti = str_replace("</i>", "</i>", $teksti); $teksti = str_replace("<p>", "<p>", $teksti); $teksti = str_replace("</p>", "</p>", $teksti); $teksti = str_replace("<br/>", "<br/>", $teksti); $teksti = str_replace("<br />", "<br />", $teksti); $teksti = preg_replace("/<a href=\"(.+)\">(.+)</a>", "<a href=\"${1}\">${2}</a>", $teksti); $harjoitusajat_sisalto = $teksti; // ... ?>
Oli miten oli niin tuolla skriptillä homman pitäisi ilmeisesti pelata juuri niin kuin haluan, eikö? Tuohon lisään vaikka sen "textarea" tagin mukaan, jos haluan että niitäkin voi käyttää?
Toisaalta jos vain textarea-tagi muodostaa ongelman tai kaikki ne jotka muodostaa ongelman Laaksosen Antin esimerkin mukaan niin PERIAATTEESSA ne kannattaisi vain laittaa tuohon skriptiin/funkitoon, muillahan ei niin "väliä".
Jos sen noin tekee niin silloin pitää tämä
$harjoitusajat_sisalto = htmlspecialchars($harjoitusajat_sisalto);
ottaa pois, jos haluan että niitä kaikkia html-koodeja voi käyttää.
Pysyittekö mukana? Ei mitään jos ette, koska itse vihdoin tajusin miten homma menee. :)
Ei, en jaksanut pysyä. Vaan väännetäänpä vielä rautalangasta: Kun lomakkeelta tulee tietoa, tallenna se ilman mitään muokkausta. Kun haet tiedon muokattavaksi, tulosta se htmlspecialchars-funktion avulla. Kun haet tiedon tulostettavaksi sivulle, voit joko tulostaa sen sellaisenaan tai ehkä poistaa jollain muulla konstilla sellaiset tagit, joita et halua tulostaa.
Ja jos tietoja ei saa lisätä kuin admin, niin silloin ei minusta kannata edes erikseen määritellä mitkä html-tagit ovat sallittuja ja mitkä eivät. Mutta jos kuitenkin haluaa ottaa käyttöön vain tietyt html-tagit, kannattaa käyttää bbcodea. Ja tosiaan data kantaan sellaisenaan ja vasta tulostusvaiheessa muotoilu.
Kerran lomakkeen kautta vai sainko tiedon (jotain siansaksaa) suoraan tietokantaan. Se siitä. Jatkossa admin painaa linkkiä "muokkaa" jolloin avautuu textarea, jossa näkyy erään sivun teksisisältö. Sitä voi sitten muokata ja sitten painaa "tallenna". Tuo vaan vielä muistutuksena.
AJV:
Sitä itsekin totesin, että kun vain admin kyseessä niin ei mitään huolta "turvallisuudesta", mutta miksi ei kukaan huomioi tota Laaksosen Antin kommenttia? =) Jos siis admin muokkaa ja laittaa vaikka näin "</textarea>" johonkin sisällön alkuun niin silloinhan se tallentaa tietokantaan vain tuohon tagiin asti. Sen takiahan tässä yritetään tallentaa juuri miten "SysRq868" ehdotti. Eikö? :)
EDIT:
Toisaalta tiedän miten yksinkertaiselle sivustolle tää tulee käyttöön, jossa admin korkeintaan tarvii <b><p><br><a href> tageja. Joten siinä mielessä ei tule tuota Laaksosen Antin ongelmaa esiin ja voin kaikki html-tagit sallia ilman mitään säätöjä. Laaksosen pointti oli kuitekin niin hyvä ja jotta voisin skriptiä muissakin projekteissa käyttää niin olisi hyvä Laaksosen huomioima juttu ottaa huomioon ja tehdä tämä skripti kunnolla.
En oo ehkä kokonaan mukana kelkassa, mutta miks ei voi käyttää strip_tags?
https://www.php.net/strip_tags
Kun tulostat sitä tekstiä tietokannasta siihen adminin muokkauslomakkeelle, niin silloin ajat sen datan htmlspecialchars()-funktion läpi.
<?php echo '<textarea name="data">'.htmlspecialchars($data).'</textarea>'; ?>
Kun tulostat tekstiä normaalisivulle, et aja sitä minkään funktion läpi.
<?php echo $data; ?>
Tulikohan nyt tarpeeksi rautalangasta :)
Kiitos kärsivällisyydestänne. Yritän kuitenkin oppia niin siksi haluan pilkkua viilata loppuun asti. :)
AJV: Joo. Tuo periaatteessa ollu mielessäni, jotenkin vain olen ymmärtänyt, että htmlspecialchars kieltää kaikki html-merkit...ja jotenkin sen takia mainitsemasi esimerkki ei ole omassa päässäni ollut uskottava. =)
Kuhan nyt pääsen testaamaan esimerkkisi niin sitten viimeistään uskon.
Minun koodi on näin, joten mitenköhän laitan kaiken tässä oikein esimerkkisi mukaisesti:
<textarea name="harjoitusajat_sisalto" cols="100" rows="15"><?php print $tiedot["harjoitusajat_sisalto"]; ?></textarea>
Testannut monta kertaa eri tavalla viimeisin näin, mutta joka kerta erroria:
<?php echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot).'</textarea>'; ?>
Saas nähdä keksinkö oikean tavan ennen kuin joku kerkee kertomaan =)
EDIT: En vaan osaa, hermot menee. Saa auttaa. =)
Olisiko näin?
<?php echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; ?>
Kiitos Ege, juuri noin. Nuo yhdet sulkeet unohdin.
Ja vihdoin pääsin testaamaan tuota. Uskottava se on. Kun tuo on lisätty niin lisätä voi vaikka näitä "</textarea>" tageja niin silti tallentaa kaiken oikein. Itse asiassa kyllä se tallentaa kaiken oikein ilman tuota htmlspecialchars funktiota, mutta kun seuraavan kerran menee muokkaamaan niin se ei näytäkään kaikea sisältöä siinä viestikentässä, joten nyt tiedän mikä hyöty tosta on.
Omaan päähäni en vielä kuitenkaan näköjään ole tuota funktiota totaalisesti ymmärtynyt. Kun sanotaan, että se POISTAA html-tagit. Niin eihän se kirjaimellisesti POISTA vaan se...hmmm... "näyttää html-koodit tavallisena tekstinä".
Huh, pitkä tie oli, mutta vihdoin saatiin tää selväksi. Eikö? :)
Jos kukaan ei keksi mitään saarnattavaa tuosta niin seuraavaksi varmaan rupean laittamaan koodin yhdelle php-sivulle kuten "SysRq868" aikaisemmin ehdotti.
SysRq868 esimerkin innottamana koitan tämän koodin saada yhdelle php-sivulle.
Sain jo onnistumaan, mutta nyt teen vielä niin, että yhdellä sivulla näkyy koko ajan molemmat sekä "esikatselu" että "muokkauslomake".
Tämä jo periaatteessa toimii, mutta:
1. Koodi on kauhean näköistä, varmaan saisi jollain tapaa sumputettua, että koko ajan ei olisi erikseen <?php ?> -koodeja.
2. Kun tallennan niin se tulee näkyviin hienosti esikatselu-taulukkoon, mutta se katoaa siitä muokkaus kohdasta (textarea). Eikö sitä pysty jättämään siihen, vai onko aina päivitettävä sivua jotta tekstin saa taas muokkaus kohtaan esille. Ei tosin sekään näyttänyt auttavan.
Tässä tämän hetken tuherrus:
<table BORDER="0" COLOR="#CCCCCC" cellspacing="6" cellpadding="6"> <tr><td> <?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); if(!isset($_POST["toiminto"])){ // Tallennus if (!$haesisalto = mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$harjoitusajat_sisalto'",$tietokantayhteys)){ echo "<font color=red>Tietokantavirhe: ".mysql_error()."</font>"; } else { echo "<font color=green>Päivitys onnistui!</font>"; } } echo "<br /><br /><center><h2>NYT SIVUN TEKSTISISÄLTÖ NÄYTTÄÄ TÄLTÄ:</h2> <table><tr><td class=esikatselu>"; echo $harjoitusajat_sisalto; echo "</td></tr></table><hr></center>"; ?> <?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); // Tulostus //Sitten tehdään muuttuja, että mitä haetaan ja mistä. $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta. $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa. $tiedot = mysql_fetch_assoc($haku); echo "<h2>HARJOITUSAJAT - MUOKKAUS</h2> <form method=post action=admin_harjoitusajat_muokkaus_yksi.php> Harjoitusajat-sivun sisältö tällä hetkellä. Voit muokata sivun tekstisisältöä, jos haluat. <br>"?> <?php echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; ?> <?php echo "<p><input type=submit name=toiminto value=Tallenna></form>";?> <center> <br /><br /> <a href="http://enkerro/admins/index.html">Takaisin admin alueelle</a> </center> </td></tr></table>
Ja kun päivitin nyt tuota sivua niin esikatselu oli tyhjä ja myös muokkaus-kohta (textarea) tyhjä. Eli taitaa mulla koodit olla oikein, mutta järjestyksessä parantamisen varaa?
------
EDIT:
Koodia vähän siistin:
<?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); if(!isset($_POST["toiminto"])){ // Tallennus if (!$haesisalto = mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$harjoitusajat_sisalto'",$tietokantayhteys)){ echo "<font color=red>Tietokantavirhe: ".mysql_error()."</font>"; } else { echo "<font color=green>Päivitys onnistui!</font>"; } } echo "<br /><br /><center><h2>NYT SIVUN TEKSTISISÄLTÖ NÄYTTÄÄ TÄLTÄ:</h2> <table><tr><td class=esikatselu>"; echo $harjoitusajat_sisalto; echo "</td></tr></table><hr></center>"; ?> <?php // Tulostus //Sitten tehdään muuttuja, että mitä haetaan ja mistä. $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta. $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa. $tiedot = mysql_fetch_assoc($haku); ?> <?php echo "<h2>HARJOITUSAJAT - MUOKKAUS</h2> <form method=post action=admin_harjoitusajat_muokkaus_yksi.php> Harjoitusajat-sivun sisältö tällä hetkellä. Voit muokata sivun tekstisisältöä, jos haluat.<br>"; echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; echo "<p><input type=submit name=toiminto value=Tallenna></form>"; ?>
Ongelmana tuossa nyt enää on se, että se näyttää toimivan oikein, mutta ei kuitenkaan tietokantaan tallenna yhtään mitään.
Missäköhän vika?
Alusta asti en ole juttua lukenut, mutta miksi avasit tietokanta yhteyden kaksi kertaa. Oliko tässä kaksi eri sivua ?
Onko tarkoitus tallentaa vai päivittää. Päivitykseen tarvitset tiedon id:n mukaan.
<table BORDER="0" COLOR="#CCCCCC" cellspacing="6" cellpadding="6"> <tr><td> <?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); if(!isset($_POST["toiminto"])) { // Tallennus if (!$haesisalto = mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$harjoitusajat_sisalto'",$tietokantayhteys)) { echo "<font color=red>Tietokantavirhe: ".mysql_error()."</font>"; } else { echo "<font color=green>Päivitys onnistui!</font>"; } } echo "<br /><br /><center><h2>NYT SIVUN TEKSTISISÄLTÖ NÄYTTÄÄ TÄLTÄ:</h2> <table><tr><td class=esikatselu>"; echo $harjoitusajat_sisalto; echo "</td></tr></table><hr></center>"; // Tulostus //Sitten tehdään muuttuja, että mitä haetaan ja mistä. $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta. $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa. $tiedot = mysql_fetch_assoc($haku); echo "<h2>HARJOITUSAJAT - MUOKKAUS</h2>"; echo "<form method=post action=admin_harjoitusajat_muokkaus_yksi.php> Harjoitusajat-sivun sisältö tällä hetkellä. Voit muokata sivun tekstisisältöä, jos haluat. <br>"; echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; echo "<p><input type=submit name=toiminto value=Tallenna></form>"; // Ohjataan sivu takaisin sille sivulle missä tämä toiminta on suoritettu header("location:$_SERVER[PHP_SELF]"); exit; ?> <center> <br /><br /> <a href="http://enkerro/admins/index.html">Takaisin admin alueelle</a> </center> </td></tr> </table>
Kerkesin jo koodia muokkaamaan nätimmäksi, et varmaan sitä kerennyt näkemään.
Tuolla sivulla/koodilla on vain tarkoitus päivittää.
(Nyt kun se tietokanta tyhjä niin pitää sinne laittaa toisella lomakkeella jotain tietoa jos se nyt siitä kiinni kun se on tyhjä nyt?)
Oli miten oli niin enhän päivitykseen tarvitse mitään id:tä?
Hyvin toimi tuo päivitys kahdella sivulla noin. Nyt kun kaikki samalla
php sivulla niin on jossain jotain ongelmaa kun ei tieto tallennu tietokantaan.
EDIT:
Olinpa huolimaton, olitkin tehnyt koodiini muutoksia.
Ainakin tämän:
// Ohjataan sivu takaisin sille sivulle missä tämä toiminta on suoritettu header("location:$_SERVER[PHP_SELF]"); exit;
Pitää siis vielä koodisi tarkemmin tutkia ja katsoa poistuuko ongelmani sillä tapaa... (kun kotiin pääsen)
Tuolla hommelilla ainkin toimii, olettaen, että sinulla on tietokannassa jo jotain tietoa.
<table BORDER="0" COLOR="#CCCCCC" cellspacing="6" cellpadding="6"> <tr><td> <?php echo '<pre>', print_r($_REQUEST) , '</pre>'; //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); if(!empty($_REQUEST["toiminto"])) { if(!empty($_REQUEST['harjoitusajat_sisalto'])) { mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$_REQUEST[harjoitusajat_sisalto]'",$tietokantayhteys); } else { echo "<font color=red>Ei ole mitään..</font>"; } } echo "<br /><br /><center><h2>NYT SIVUN TEKSTISISÄLTÖ NÄYTTÄÄ TÄLTÄ:</h2> <table><tr><td class=esikatselu>"; echo $harjoitusajat_sisalto; echo "</td></tr></table><hr></center>"; // Tulostus //Sitten tehdään muuttuja, että mitä haetaan ja mistä. $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta. $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa. $tiedot = mysql_fetch_assoc($haku); echo "<h2>HARJOITUSAJAT - MUOKKAUS</h2>"; echo "<form method='post' action='$_SERVER[PHP_SELF]' name='PaivitysLomake'> Harjoitusajat-sivun sisältö tällä hetkellä. Voit muokata sivun tekstisisältöä, jos haluat. <br>"; echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; echo "<p><input type='submit' name='toiminto' value='Tallenna'></form>"; // Ohjataan sivu takaisin sille sivulle missä tämä toiminta on suoritettu header("location:$_SERVER[PHP_SELF]"); exit; ?> <center> <br /><br /> <a href="http://enkerro/admins/index.html">Takaisin admin alueelle</a> </center> </td></tr> </table>
Äijä heittää tuollaista koodia, joten sun nimimerkki on aika väärin. ;)
Kiitos nyt toimii. Vähän itse vielä siivosin koodia ja lisäsin pari kommenttia.
Ainoa ongelma enää, että tuo sivu herjaa siis varoittaa koko ajan:
"Warning: Cannot modify header information - headers already sent by (output started at /home/www/admins/config/config.php:11) in /home/www/admins/admin_harjoitusajat_muokkaus_yksi.php on line 55"
Johtunee tästä:
header("location:$_SERVER[PHP_SELF]");
Eikö tuo rivi pitäisi olla aina php tiedoston ylimpänä vai mites se meni?
No jos ei tulosteta ennen tuota niin toimii, mutta kiertämään ton ilmotuksen pystyt käyttämällä ob_start(); alussa ennen mitään muuta. Sitten vielä ob_flush(); loppuun
Hyvään ja asiallisesti kirjoitettuun koodiin on helppo tehdä muutoksia.
Tuon ob_start();, ob_flush();
homman ajaa myös asia, jos laitat php_output_buffering = 4096, php.ini tiedostoon.
Tästä voi taas kuitenkin alkaa uusi keskustelu, sillä kaikki eivät tuosta vaihtoehdosta tykkää. :D
Itse en ole kokenut sen kanssa minkäänlaista ongelmaa.
Ja kiitoksia nimimerkki kommentista. Taidan kuitenkin vielä vasta_alkaja olla, mutta aina positiivinen kommentti mieltä lämmittää.
//sivun eka rivi:
<?php ob_start(); ?>
//kaikki koodit
//sivun vika rivi, kuuluuko tuo "end" sana mukaan?
<?php ob_end_flush(); ?>
Ymmärsinkö jotain väärin? Nyt ei tule herjoja, mutta mitään ei tapahdu, aivan valkoinen sivu noiden lisäysten jälkeen.
EDIT:
Ahaa.. se harjasi tuosta config.php tiedostosta, koska siellä oli tyhjiä rivejä.
Otin ne pois niin nyt se toki vielä herjaa samanlaisesti, mutta huomattaa eri "rivistä":
Warning: Cannot modify header information - headers already sent by (output started at /home/www/admins/
muokkaa se php_ouput_buffering sinne php.ini tiedostoon.
sieltä pitäisi löytyä tuo kohta = php_output_buffering
asetat vain sille arvon = 4096
Entä jos tuota en halua millään tehdä? :)
Eikö nuo kaksi koodinpätkää sitten aina auta?
Itse en ole koskaan tuota joutunut käyttämään, mutta nänkait sen pitäisi toimia, eikä sen käytössä pitäisi ongelmia olla.
<?php ob_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head></head> <body> <?php ob_end_flush(); ?> </body> </html>
Ok, mielestäni juuri noin tein, mutta ei auttanut.
Pitää tosiaan vielä kotona testata, että ei varmasti ollut mitään sulkuja väärässä paikassa jne...
Vasta_alkaja kirjoitti:
<?php ob_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head></head> <body> <?php ob_end_flush(); ?> </body> </html>
Laitoin tarkalleen noin niin nyt sivu on aivan valkoinen, ei mitään virheitä, ei yhtään mitään muuta kuin valkoinen sivu.
php.ini output_buffering = Off; Output buffering allows you to send header lines (including cookies) output_buffering = 4096;
Edelleenkin tarjoan tätä, mutta jos et pääse käsiksi php.ini tiedostoon, voit aina luoda .htacces tiedoston ja tehdä sillä tuon saman toiminnon. Ajaa tosin saman asian. Jos .htacces tiedoston tekeminen tuottaa ongelmia, voin lähettää sinulle semmoisen sähköpostiisi.
Huhu, melko riskiä koodia.
-$_REQUEST = $_COOKIE + $_POST + $_GET, mikäli oikein muistan. Tässä ei taida olla välttämätöntä hörppiä arvoja noin laajalta alueelta.
-Et tarvitse tässä ob:tä. Kaiken järjen mukaan tuolla koodilla syntyy loppumaton looppi, missä ohjaat käyttäjän jatkuvasti tuolle samalle sivulle.
-Uudelleenohjauksen otsikkotiedot tulisi lähettää seuraavasti (Location-headerille pitäisi syöttää absoluuttinen osoite. Huomaa myös iso alkukirjain):
<?php # oletettakoon, että olet sivulla tallennus.php $page = 'index.php'; header('Location: http://' . $_SERVER['SERVER_NAME'] . '/' . $page); ?>
-Mitään käyttäjien syötteitä ei pidä heittää suoriltaan kantaan, vaan ne tulee filtteröidä ensin. Lisätietoa manuaalin mysql_real_escape_string-sivulla.
-PHP_SELF muuttujaan saa ujutettua sekaan HTML:ää, joten sen käyttäminen ei ole suositeltavaa. Mieluummin SCRIPT_NAME, eikä sitäkään tässä kyllä tarvita mihinkään.
Ja lopuksi muutama huomio:
-HTML:ssä attribuutit tulisi sulkea lainaus-/heittomerkkien sisään.
-Taulukon arvoihin viitattaessa käytetään mieluusti heittomerkkejä.
Vasta_alkaja kirjoitti:
php.ini output_buffering = Off; Output buffering allows you to send header lines (including cookies) output_buffering = 4096;Edelleenkin tarjoan tätä, mutta jos et pääse käsiksi php.ini tiedostoon, voit aina luoda .htacces tiedoston ja tehdä sillä tuon saman toiminnon. Ajaa tosin saman asian. Jos .htacces tiedoston tekeminen tuottaa ongelmia, voin lähettää sinulle semmoisen sähköpostiisi.
'
Kiitos. Uskon, että toimii. Haluaisin silti jollain muulla tapaa korjata tuon.
Minulle kun on monissa muissakin skripteissä tullut tuo sama herja ja aina sen olen saanut pois... viimeistään teidän foorumilaisten avuilla. Joten odotan josko joku viisas tulisi vielä neuvomaan. =)
---------------------------------------------------------
EDIT:
(Miksiköhän ei anna "lainata" tsurigan viestiä)
Nyt taisi se joku viisas tulla neuvomaan, mutta valitettavasti meni puolet jutuistasi ohi minun tietotaitoni. :(
$_REQUEST muuttujan otin suoraan "vasta_alkajan" koodista, kun sillä sai heti toimimaan. Itsekin vähän harmittelen, että se ainoa kohta mitä en oikein jaksanut itselleni selvittää, että miten se tarkalleen toimii jne.
(Sinun kommenttisi tuosta oli kyllä minulle hepreaa... :| )
Pitää tuota esimerkki koodiasi testata...
Eikös se htmlspecialcharacters riitä tähän mun koodiin. Kauheasti en ole kiinnittänyt "tietoturvaan", koska vain admin pääsee kyseistä sivun muokkausta käyttämään.
Tuo lomakkeen metodi on näköjään post, joten vaihda $_REQUESTin tilalle $_POST, toimii yhtä lailla. Etu ja hyöty on se, että arvo ei tule vahingossakaan esimerkiksi osoiteriviltä taikka keksistä. Mitä tietoturvaan tulee niin kyllähän sitä vähän tykkää tuputtaa kattavinta suojausta alusta alkaen, vaikka se projekti tuntuisi kuinka pieneltä - ettei varsinkaan sitten isommissa projekteissa unohdu. Suodattamalla käyttäjien syötteet estät sen, että tietokannasta ei saa pyyhittyä kaikki tietoja, vaikka saisikin ylläpidon salasanan selville. Ja varsinkin jos ylläpidon kirjautuminen suoritetaan kannan avustuksella. Sen verran tietysti voi kyllä harkintaa käyttää, että kun ylläpidolle laitetaan captchat päälle, niin siinä on kyllä jo vähän liiottelun makua :).
Ok, kiitos.
Täytyy testata jos itse osaan "vaihtaa".
Perhanan php, miksi kaikkeen on sata erilaista mahdollisuutta!? ;)
Aina kun saa jonkun koodin valmiiksi niin aina tulee joku kommentoimaan "miksi et tehnyt näin, ei tuo ole hyvä tapa" :D
Totta turiset tsuriga, perusturvallisuus jutut pitäisi aina tehdä.
Mutta ne nyt viimeisin huoli, joita voin lopussa lisätä. Saisipa tuon peruskoodin edes teidän gurujen hyväksymälle tasolle.
------------
EDIT:
- $_POST otettu käyttöön.
- En ymmärtänyt yhtään mitä tsuriga haki tuolla antamallaan "header" esimerkillä. :|
Mutta hetkonen, otin vain tämän pois:
// Ohjataan sivu takaisin sille sivulle missä tämä toiminta on suoritettu header("location:$_SERVER[PHP_SELF]"); exit;
Niin nyt ei tule enää mitään "header" herjaa ja skripti toimii aivan oikein, miten voi olla mahdollista!? =)
Tässä vielä muokkaus sivun php-osuus:
<?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); if(!empty($_POST["toiminto"])) { if(!empty($_POST['harjoitusajat_sisalto'])) { mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$_REQUEST[harjoitusajat_sisalto]'",$tietokantayhteys); } else { echo "<font color=red>Ei ole mitään..</font>"; } } //Esikatselun tulostus echo "<br /><br /><center><h2>PAINA TALLENNA NIIN NÄET SIVUSTON TEKSTISISÄLLÖN TÄSSÄ:</h2> <table><tr><td class=esikatselu>"; echo $harjoitusajat_sisalto; echo "</td></tr></table><br /><hr></center>"; // Tulostus //Sitten tehdään muuttuja, että mitä haetaan ja mistä. $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta. $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa. $tiedot = mysql_fetch_assoc($haku); echo "<center><h2>MUOKKAA SIVUSTOA</h2>"; echo "<form method='post' action='$_SERVER[PHP_SELF]' name='PaivitysLomake'>"; echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; echo "<p><input type='submit' name='toiminto' value='Tallenna'></form></center>"; ?>
Äskeisessä koodissa jäi tuohon tuo yksi "$_Request" muuten senkin "Postiksi".
Yksi kysymys vielä lisää.
Tämä kohta:
mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$_POST[harjoitusajat_sisalto]'",$tietokantayhteys);
Jos otan tuon muuttujan "$tietokantayhteys" pois niin skripti toimii silloinkin.
Eli tuo on aivan turha tuossa vai onko sillä tarkoitus?
(Tuon tyylin olen kyllä jo jostain koulun huonoilta oppitunneilta oppinut, että tuo pitäisi olla noin!? =) )
tsurigan muistuttamana lisään vielä tämän: mysql_real_escape_string
Vielä kun osaisin laittaa sen oikeaan kohtaan... Pari ekaa yritystä meni väärin.
Tuolla on se tarkoitus, että jos joskus käytät kahta yhteyttä tms., se tietää mistä haetaan.
Se on yksi niistä über-standardeista, joiden rikkomisesta sinut lynkataan nörttikerhon terveisten kera.
On se hyvä olla siellä, vaikka toimii muutenkin. Ei se todellakaan mitään haittaa tee, ja parin ylimääräisen tavun säästö ei ole hirvittävä ero.
EDIT: PHP.net sanoo tätä:
PHP.netin manuska kirjoitti:
If link_identifier isn't specified, the last opened link is assumed. If no link is open, the function tries to establish a link as if mysql_connect() was called with no arguments, and use it. The result of the query is buffered.
Eli jos sitä ei anneta, se käyttää viimeisintä yhteyttä. Jos ei ole yhteyttä, se koittaa miltei poikkeuksetta tuloksetta ottaa yhteyden ilman parametrejä tai muita. Anna sen muuttujan olla siellä. Säästyt pähkäilyltä, jos joskus vielä rukkaat koodiasi.
Muutenkin, jos vain osaat vähänkään englantia ja joku PHP:n funktio pähkäilyttää, käy katselemassa PHP.netistä, lataa vaikka niiden aputiedosto, siitä on hyötyä, jos koodaat offline. Käyttäjien kommenteissa on usein myös erittäin käytännöllisiä koodinpätkiä, jotka tekee aina juuri sen, mille ei ole erillistä funktiota PHP:ssä, vaikka pitäisi olla.
Kiitos SysRq868 kommenteista.
Englannin kieli on ihan hyvä, mutta jostain syystä vaikea välillä ymmärtää noita virallisia php-sivuja ja niiden esimerkkejä. Kivempi täällä keskustelualueella viilata asioita, jos vaan auttajia (ja hermoja) riittää.
Et kommentoinut tuota koodiani tai kun ihmettelin, että se toimii oikein. :D
Noh, ei kai moisesta kannata valittaa.
Muuten jatkan sen viilailemista vielä...
EDIT:
Äh, en saa tätä mihkään kohtaan oikein: mysql_real_escape_string
Googletin monta esimerkkiä, mutta en vaan tajua miksi mulla ei onnistu.
Ei testattu, mutta näin.
CREATE TABLE `harjoitusajat` ( `id` int(5) NOT NULL auto_increment, `harjoitusajat_sisalto` varchar(255) NOT NULL default 'ei syötetty arvoa', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
<?php if(headers_sent() == false) { header("Expires: -1"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); } /******************************************************************************/ $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $dbname = 'testikanta'; /******************************************************************************/ # Avataan tietokantayhteys $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Yhteys tietokantaan epäonnistui"); if ( !mysql_select_db($dbname,$conn) ) /******************************************************************************/ if(!empty($_REQUEST['mode']) && $_REQUEST['mode']=="tallenna") { TallennaTiedot(); } /******************************************************************************/ # echo $_SERVER['PHP_SELF']; Tarkoittaa, että hakee sivun osoitteen. Laita sitten kiinteänä jos haluat. echo '<pre>', print_r($_REQUEST), '</pre>'; ?> <html> <title></title> <head> <SCRIPT type="text/javascript"> function TarkistaLomake(form) { form.mode.value="tallenna"; form.submit(); } </SCRIPT> </head> <body> <form name="TestiHommelia" action="<?php $_SERVER['PHP_SELF']; ?>" method="post"> <input type="text" name="mode" value="" /> <table BORDER="0" COLOR="#CCCCCC" cellspacing="6" cellpadding="6"> <tr> <td> <center><h2>NYT SIVUN TEKSTISISÄLTÖ NÄYTTÄÄ TÄLTÄ:</h2></center> </td> </tr> <tr> <td> <?php # Limit yksi, koska haet aina vain yhtä arvoa. $k= "SELECT id, harjoitusajat_sisalto FROM harjoitusajat WHERE id='1' LIMIT 1"; $t = mysql_query($k); if(!$t) { # Jos tulos(t) on tyhjä, niin ilmoitetaan virhe echo mysql_error(); return; } while($rivi = mysql_fetch_row($t)) { # Rivit alkaa nollasta, joten id on $rivi[0] # stripslashes https://www.ohjelmointiputka.net/hak/?kieli=PHP&nimi=stripslashes echo '<textarea cols="50" name="teksti" rows="10">', stripslashes($rivi[1]),'</textarea>'; # Piilotetaan id echo '<input type="text" name="id" value="' . $rivi[0] .'">'; } ?> </td> </tr> <tr> <td> <input type="button" value="Päivitä lomale" onclick="TarkistaLomake(this.form);"> </td> </tr> </table> </form> <body> </html> <?php function TallennaTiedot() { # intaval = koska aina numero $id = intval($_REQUEST['id']); $teksti = mysql_escape_string($_REQUEST['teksti']); $k = "UPDATE harjoitusajat SET harjoitusajat_sisalto='$teksti' WHERE id='$id'"; $t = mysql_query($k); if(!$t) { echo mysql_error(); } else { echo '<p style="background:black; color:white; font:15px;>Tiedot on päivitetty onnistuneesti</p>'; } } ?>
Hienolta (se mitä ymmärsin) näyttää koodisi "Vasta_alkaja".
Tuo ilmeisesti oli vaan oma esimerkkisi miten koodin voi myös tehdä?
Enää en lähde tuota minun koodia kauheesti muuttamaan. Ainoastaan apua kaipaisin, että mihin kohtaan ja miten laitan tämän: mysql_escape_string
Tällä hetkellä koodini näyttää tältä:
<center> <table BORDER="0" COLOR="#CCCCCC" cellspacing="6" cellpadding="6"><tr><td> <?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); //Virallisella post muuttujalla käsitellään lomakkeen toimintoja ja tietoja if(!empty($_POST["toiminto"])) { //Jos muuttajani ei ole tyhjä... if(!empty($_POST['harjoitusajat_sisalto'])) { //...niin päivitetään haluttu muutos tietokantaan haluttuun paikkaan mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$_POST[harjoitusajat_sisalto]'",$tietokantayhteys); } else { //Jos tietokannassa ei ole mitään tietoa echo "<font color='red'>Ei ole mitään..</font>"; } } //Esikatselun tulostus echo "<br /><br /><h2>PAINA TALLENNA NIIN NÄET SIVUSTON TEKSTISISÄLLÖN TÄSSÄ:</h2> <table><tr><td class='esikatselu'>"; echo $harjoitusajat_sisalto; echo "</td></tr></table><br /><hr>"; // Tulostus //Sitten tehdään muuttuja, että mitä haetaan ja mistä $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa $tiedot = mysql_fetch_assoc($haku); echo "<h2>MUOKKAA SIVUSTOA</h2>"; //Lomake post metodilla. Käytetään samaa sivua lomakkeen käsittelyyn. echo "<form method='post' action='$_SERVER[PHP_SELF]' name='PaivitysLomake'>"; //Tulostetaan teksti-kenttään tietokannasta haluttu tieto. Htmlspecialcharacters näyttää html-koodit "oikein". echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; // Tallenna painike, lomakkeen/muokkausten tallentamiseen echo "<p><input type='submit' name='toiminto' value='Tallenna'></form>"; ?> </center>
EDIT:
Nyt Tajusin, eli näin?
{ //...niin päivitetään haluttu muutos tietokantaan haluttuun paikkaan $harjoitusajat_sisalto = mysql_escape_string($_POST['harjoitusajat_sisalto']); mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$_POST[harjoitusajat_sisalto]'",$tietokantayhteys); }
Ei tule ainakaan mitään virheitä.
Esikatseluun tulee enterin iskuista vai mistä lie: "\r\n" jne merkkejä.
Se sivu minne koodin tulostan niin siellä kuitenkin näkyy kaikki oikein.
EDIT2:
Kyse siis admin-osiosta, joten ei periaatteessa vaaraa väärinkäytöksistä, mutta tuleeko teille vielä jotain mieleen mitä kannattaisi aina laittaa jos haluaa "tietoturvallisen" skriptin?
Tämä "mysql_escape_string" oli yksi hyvä vihje.
Tuo mysql_escape_string
Aiheuttaa nuo "\r\n", merkit. Kokeileppa ilman sitä vielä. Muutat sen tuolla komennolla siihen muotoon. Jossain tapauksissa, esimerkiksi tässä olisi parempi olla käyttämättä mielestäni sitä. Laitoin sen vain esimerkiksi, kun siitä oli aiemmin mainittu.
Ja kyllä, tuo oli esimerkki siitä miten sen voi toteuttaa.
Aivan, ok.
Itsekin mietin, kun tiedän mihin tarkoitukseen tämä tulee ja minkälaiset admin-käyttäjät on niin he kyllä menevät sekaisin jos esikatselussa on tuollaisia merkkejä. Kommentoin sen pois, jotta muistaisin sitä kuitenkin muissa projekteissa käyttää.
Hienoa, eiköhän tämä ole toistaiseksi tässä. Kiitos kaikille auttajille, taas opin paljon uutta! Seuraavaksi teen varmaan tuolle admin-sivulle sisäänkirjautumisen... Eli lisää kysymyksiä luvassa varmaan. =)
Vieläpä viimeinen (niin varmaan) kysymys tietokantaan liittyen. Tyyppinä siellä on minulla "longtext", koska sivujen tekstisisältöä voi olla paljon... Eikö tuo viittaa siihen, että paljon mahtuu tekstiä/dataa? Vai pitäisikö jotain muuta käyttää?
mysql_real_escape_string. Tuosta Esimerkki 1437:stä on hyvä ottaa mallia noiden arvojen suodattamisen suhteen (ei niinkään tuon arvojen olemassaolon testauksen suhteen [isset ei tarkista, onko kenttä tyhjä]). Sinulla menee koodissa nyt väärään suuntaan tuo arvojen sijoitus. Suodatat arvot, mutta et käytä suodatettua syötettä tietokantakyselyssä, vaan taas sitä raaka-arvoa. Ohessa korjattu malli esimerkin 1437 malliin.
<?php function filterMySQLQueryValue($value, $link) { if (get_magic_quotes_gpc()) { $value = stripslashes($value); } return mysql_real_escape_string($value, $link); } $lauseke = sprintf(" UPDATE `harjoitusajat` SET `harjoitusajat_sisalto` = %s ", filterMySQLQueryValue($_POST['harjoitusajat_sisalto'], $tietokantayhteys)); mysql_query($lauseke, $tietokantayhteys); ?>
Tässä vaiheessa pitää kyllä tunnustaa, että käytännön tasolla en ole oikeasti näplännyt ja testaillut näitä asioita, mutta noin sen pitäisi toimia :). `-merkkien sisään sulkeminen estää yhteentörmäyksen varattujen sanojen kanssa, ilmeisesti pitäisi antaa myös performanssiboostia.
Kentän tyypiksi riittää VARCHAR tai TEXT:
http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html
Suosittelisin totuttelemaan käyttämään yhtä ja tiettyä tapaa merkkijonoja tulostessa, eli joko heitto- (') tai lainausmerkkejä ("). Itse suosin ns. WYSIWYG-tapaa, eli heittomerkkiä, jolloin ei tarvitse huolehtia niin usein erikoismerkkien eskapettamisesta (suomennos?), ja näkee helpommin, mitä on tulostamassa (https://www.php.net/types.string). Tässä voisi itse asiassa nuo HTML-tulostukset jättää kokonaan PHP-parseroinnin ulkopuolelle, eli et tulosta niitä PHP:llä, vaan heität lopetustagin, ja jatkat sitä PHP:tä taas siellä kun tarvitsee.
<?php // suoritetaan tässä vaikka joku mysql-query ?> <form action="" method="post"> <textarea name="harjoitusajat_sisalto"> <?php echo $harjoitusajat_sisalto; ?> </textarea> </form> <?php // jotain muuta ?>
Kuten yllä on tehty, actionin voi ehkä jättää tyhjäksi. action on kyllä vaadittu attribuutti, mutta en tiedä onko sille pakko antaa arvoa. Useat selaimet ymmärtävät tyhjän actionin merkiksi siitä, että osoitteena on sama sivu kuin missä formikin seisoo. Jos validaattori tästä älähtää, käytä $_SERVER['PHP_SELF'] sijaan $_SERVER['SCRIPT_NAME'].
Muutin tyypiksi "text".
tsuriga: Apua, ei saanut enää antaa vinkkejä, menen sekaisin! ;)
Tosin vihjeesi kuulostaa hyvälle. Vielä kun ton osaisin soveltaa omaan koodini sekaan. Katsotaan...
Argh.
-Kohta "$link", mikä tarkoitus?
-Kohta "sprintf", mikä tarkoitus?
-Kohta "%s", mikä tarkoitus?
ps. Kuten sanoin niin en tuota "mysql_real_escape_string" tarkistusta tarvitse tässä projektissa. Mutta tulevaisuuden kannalta olisi hyvä ymmärtää tuo koodisi oikein.
Jos englanti sujuu, niin manuaalista tosiaan löytyy nuo funktioiden parametrit ja selostukset.
https://www.php.net/manual/en/function.mysql-real-escape-string.php
https://www.php.net/manual/en/function.sprintf.
-$link on siis tuo tietokantayhteyden resurssi. Sama kuin mysql_queryssä, ei välttämätön parametri.
-sprintf:llä voit määritellä minkä tyyppistä dataa tietokantakyselyyn tulee. %s viittaa merkkijonoon.
tsuriga kirjoitti:
Jos englanti sujuu, niin manuaalista tosiaan löytyy nuo funktioiden parametrit ja selostukset.
https://www.php.net/manual/en/function.mysql-real-escape-string.php
https://www.php.net/manual/en/function.sprintf.php
Englanti sujuu, usein nuo monimutkaiset esimerkit saa vain pään sekaisin.
tsuriga kirjoitti:
-$link on siis tuo tietokantayhteyden resurssi. Sama kuin mysql_queryssä, ei välttämätön parametri.
-sprintf:llä voit määritellä minkä tyyppistä dataa tietokantakyselyyn tulee. %s viittaa merkkijonoon.
...Ja tästä ymmärsin heti. Kiitos. :)
ps. Palaan aikaisempaan viestiisi vähän myöhemmin.
----------------------------------------------------------
EDIT:
tsuriga kirjoitti:
Suosittelisin totuttelemaan käyttämään yhtä ja tiettyä tapaa merkkijonoja tulostessa, eli joko heitto- (') tai lainausmerkkejä ("). Itse suosin ns. WYSIWYG-tapaa, eli heittomerkkiä, jolloin ei tarvitse huolehtia niin usein erikoismerkkien eskapettamisesta (suomennos?), ja näkee helpommin, mitä on tulostamassa (https://www.php.net/types.string).
Kiitos, että palasit vielä tähän. Sehän ei hyväksy mitään lainausmerkkejä jos html-koodini on php koodin sisällä ja yritän siis jollekin html tagin atribuutille antaa jonkin arvon. Ei mitään merkkejä tai sitten heittomerkit käyttöön. (Joo, kenties lainausmerkkejä voi käyttää jollain kikkailulla, mutta ei suoraan onnistu... minun testien/ymmärryksen mukaan)
tsuriga kirjoitti:
Tässä voisi itse asiassa nuo HTML-tulostukset jättää kokonaan PHP-parseroinnin ulkopuolelle, eli et tulosta niitä PHP:llä, vaan heität lopetustagin, ja jatkat sitä PHP:tä taas siellä kun tarvitsee.
Noin kun korjaan ni anna kun arvaan, että joku tulee sen jälkeen sanomaan, että juuri toisinpäin olisi kannattanut tehdä. ;) Toisaalta koodi olisi mielestäni selkeämpää ehdottamallasi tavalla, taidan siis muuttaa...
tsuriga kirjoitti:
Kuten yllä on tehty, actionin voi ehkä jättää tyhjäksi. action on kyllä vaadittu attribuutti, mutta en tiedä onko sille pakko antaa arvoa. Useat selaimet ymmärtävät tyhjän actionin merkiksi siitä, että osoitteena on sama sivu kuin missä formikin seisoo. Jos validaattori tästä älähtää, käytä $_SERVER['PHP_SELF'] sijaan $_SERVER['SCRIPT_NAME'].
Ok, kiitos tästäkin vinkistä.
-------------------------------------
EDIT3: Nyt näyttäisi tältä. Vieläkö joku uskaltaa kommentoida? =)
<?php include("/enkerro/config/config.php");?> <html> <head><title></title> <style type="text/css"> td.esikatselu {background-color: #f5f5f5;border: 2px solid #FFFFFF;font:11px verdana; color:black;padding: 10px;} input {border: 1px solid red;padding: 2px;font:11px verdana; color:#5c5444;background-color:#d0cdae;} </style> </head> <body bgcolor="#CCCCCC" TEXT="black" ALINK="#074752" LINK="#074752" VLINK="#074752"> <center> <table BORDER="0" COLOR="#CCCCCC" cellspacing="6" cellpadding="6"><tr><td> <?php //Avataan yhteys tietokantaan $tietokantayhteys = mysql_connect($db_server,$db_user,$db_password) or die ("Yhteys tietokantaan epäonnistui!"); mysql_select_db($db_db,$tietokantayhteys) or die ("Tietokannan valitseminen epäonnistui!"); //Virallisella post muuttujalla käsitellään lomakkeen toimintoja ja tietoja if(!empty($_POST["toiminto"])) { //Jos muuttajani ei ole tyhjä... if(!empty($_POST['harjoitusajat_sisalto'])) { //Filtteröidään koodi ennen kuin tallennetaan tietokantaan, jotta sql-injektioita ja muuta "pahaa" koodia ei voi käyttää hyväkseen. //Kommentoin filtteröinnin pois koska se aiheuttaa esikatseluun "outoja" merkkejä. //HUOM! Tuo rivi ei riitä, pitää suodattaa myös kyselyssä sama asia... lisää koodia tarvitsee, jos tätä joskus käytän!!! /* $harjoitusajat_sisalto = mysql_escape_string($_POST['harjoitusajat_sisalto']); */ //...niin päivitetään haluttu muutos tietokantaan haluttuun paikkaan mysql_query("UPDATE harjoitusajat SET harjoitusajat_sisalto='$_POST[harjoitusajat_sisalto]'",$tietokantayhteys); } else { //Jos tietokannassa ei ole mitään tietoa echo "<font color='red'>Ei ole mitään..</font>"; } } ?> <!-- Esikatselun tulostus --> <br /><br /><h2>PAINA TALLENNA NIIN NÄET SIVUSTON TEKSTISISÄLLÖN TÄSSÄ:</h2> <table><tr><td class="esikatselu"> <?php echo $harjoitusajat_sisalto; ?> </td></tr></table><br /><hr> <?php // Tulostus //Sitten tehdään muuttuja, että mitä haetaan ja mistä $mitahaetaan = "SELECT harjoitusajat_sisalto FROM harjoitusajat"; //Sitten tehdään muuttuja, virallinen haku komento mysql-kannasta $haku = mysql_query($mitahaetaan, $tietokantayhteys); //Tiedot täytyy noutaa erillisellä funktiolla myös tässä tapauksessa $tiedot = mysql_fetch_assoc($haku); ?> <h2>MUOKKAA SIVUSTOA</h2> <!--Lomake post metodilla. Käytetään samaa sivua lomakkeen käsittelyyn. --> <?php echo "<form method='post' action='$_SERVER[PHP_SELF]' name='PaivitysLomake'>"; ?> <!--Tulostetaan teksti-kenttään tietokannasta haluttu tieto. Htmlspecialcharacters näyttää html-koodit "oikein". --> <?php echo '<textarea name="harjoitusajat_sisalto" cols="100" rows="15">'.htmlspecialchars($tiedot["harjoitusajat_sisalto"]).'</textarea>'; ?> <!-- Tallenna painike, lomakkeen/muokkausten tallentamiseen --> <p><input type="submit" name="toiminto" value="Tallenna"></form> <br /><br /> <a href="http://enkerro/admins/index.php">Takaisin admin alueelle</a> </td></tr></table></center> </body> </html>
<style type="text/css"> td.esikatselu {background-color: #f5f5f5;border: 2px solid #FFFFFF;font:11px verdana; color:black;padding: 10px;} input {border: 1px solid red;padding: 2px;font:11px verdana; color:#5c5444;background-color:#d0cdae;} </style>
tuon edellämainitun tyyli määrittelyn suosittelen määrittämään joko td tai tr:lle, joka määritttää sitten sen kaikki td:t näin.
.td.esikatselu
tai
.tr.esikatselu
Eli tuo piste meinaisi siis class arvoa.
Esimerkki:
<td class="td"> <- eli .
Tämä siksi, koska kaikki selaimet ( Internet explorer ) ei ymmärrä noin viisasta määritystä. eikä esim määritystä.
input[type="button"]
joka värjäisi kaikki napit automaattisesti haluamillasi määritteillä.
PS. Tietokannassa arvo text on vapaa määrä merkkejä. varchar taas vain 255, ellei ole maksullista MyQsl-kantaa, jossa voi olla poikkeus. Yleensä se on kuitenkin vain tuo 255.
Lisää css. määritteistä täältä.
http://myy.helia.fi/~vanvu/css/cssmaarittelyt.
Sori, nyt en ymmärtänyt mitä haet takaa? :|
Olen halunnut määritellä vain ja ainoastaan yhden erikoisen solun (td) ja siksi näin:
css:
td.esikatselu
{background-color: #f5f5f5;border: 2px solid #FFFFFF;font:11px verdana; color:black;padding: 10px;}
html:
<td class="esikatselu">
Eihän tuossa mitään väärin vai mitä tarkalleen hait takaa?
ps. Hienoa jos php-koodi kelpaa jo ;)
EDIT:
siis tuo "piste" vain pitäisi lisätä?
Oli miten oli niin täydellisesti on kaikissa selaimessani css-tyylini toimineet ilman pisteitä. =)
Ei kannata huonoa selitystä pyytää anteeksi. Sori minulta.
Tuo td.esikatselu ei toimi kaikilla salaimilla. (IE 7). Käytä sen sijaan siis :
.esikatselu <td class="esikatselu">
Ajaa saman asian, mutta kaikilla selaimilla.
Aikasemmin selitin sekavasti, joten se kannattaa unohtaa
Microsoftin tukemat css-määritteet.
http://msdn2.microsoft.com/en-us/library/ms531207.aspx
<!--Lomake post metodilla. Käytetään samaa sivua lomakkeen käsittelyyn. --> <?php echo "<form method='post' action='$_SERVER[PHP_SELF]' name='PaivitysLomake'>"; ?>
method="post" tarkoittaa, että sivua ollaan lähettämässä.
action:kenttä tarkoittaa minne sivu lähetetään.
$_SERVER['PHP_SELF'] = tarkoittaa, että lähetetään tälle samalle sivulle
Siinä voi olla myös vaikka tannenain.php ja tiedot lähetetään sinne sivulle ja voit sitten taas siellä ottaa niitä käyttöösi tuolla $GET -metodilla.
Saman asian ajaa myös $_REQUEST['tietoa'] -komento. ( eli hakea niitä tietoja )
Vasta_alkaja kirjoitti:
Tuo td.esikatselu ei toimi kaikilla salaimilla. (IE 7).
Ihan oikeastiko näin? O_o Kyllä se vain on muistaakseni ihan hyvin toiminut jo iät ja ajat, sen verran perusominaisuus.
Voin olla väärässäkin, mutta sitä riskiä en enää ota. Yleensä IE7:n kanssa on tullut ongelmia vähän joka suunnassa. Kokeileppa vaikka tätä määritettä:
input[type="button"]
Samaa mieltä "Metabolixin" kanssa. Toimiihan tuo nytkin! :)
Mutta jos joskus jotain ongelmaa tulee niin muistan vinkkisi "Vasta_alkaja".
EDIT:
Tuosta ja muista mahdollisista erikoisuuksista en sitten tiedä, mutta taulukkojen/solujen kanssa ei ongelmia.
Kyllähän nuo normaalit luokkavalitsimet ovat toimineet IE:ssä jo aikoja. Eli ihan turvallisesti voi laittaa td.esikatselu. Noi erikoisemmat on sitten oma juttunsa, vaikka niitäkin tarvitsisi todella usein.
Niitä kyllä tarvitsee ja tämä helpottaisi monen urakkaa.
( Offtopic:
Löysin AJV:n loistavan koodivinkin tuohon kirjautumis-systeemiin:
https://www.ohjelmointiputka.net/koodivinkit/
Sitä nyt olen muokannut jo jonkin verran ja esim. rekisteröitymistä en tarvitse jne. Onneksi se on kommentoitu hyvin niin taas oppii uutta. )
Vasta_alkaja kirjoitti:
<!--Lomake post metodilla. Käytetään samaa sivua lomakkeen käsittelyyn. --> <?php echo "<form method='post' action='$_SERVER[PHP_SELF]' name='PaivitysLomake'>"; ?>method="post" tarkoittaa, että sivua ollaan lähettämässä.
action:kenttä tarkoittaa minne sivu lähetetään.$_SERVER['PHP_SELF'] = tarkoittaa, että lähetetään tälle samalle sivulle
Siinä voi olla myös vaikka tannenain.php ja tiedot lähetetään sinne sivulle ja voit sitten taas siellä ottaa niitä käyttöösi tuolla $GET -metodilla.Saman asian ajaa myös $_REQUEST['tietoa'] -komento. ( eli hakea niitä tietoja )
Tyhjä merkkijono actionin arvona ajaa saman asian kuin saman sivun osoite, näyttääpä olevan validia HöTöMöLöä jopa. Suosittelisin tekemään erillisen käsittelysivun, joka sitten ohjaisi (heitin valmiin koodin ylempänä, header("Location..." -vinkki) takaisin muokkaussivulle - näin sivun päivittäminen selaimen Refresh-namiskasta ei lähetä tietoja uudelleen käsiteltäväksi, ja koodikin selkiää. Name-attribuutti ei ole lomakkeelle pakollinen, eikä sitä tässä käytetä mihinkään, joten sen voi huoletta jättää pois. Kannattaa myös suosia pienellä kirjotettuja arvoja attribuuteille, löytyy muistaakseni XHTML:n ohjeistuksista. Esimerkkisi lomakkeen metodi on post, joten arvot löytyvät $_POST-taulukosta, eivät "$GET-metodilla". Ja aiemmin tässä jo kerorinkin miksi REQUESTin käyttäminen ei ole suositeltavaa.
Aivan oikein, ne löytyvät $_POST metodilla. Hyvä, että joku korjaa huolimattomuudet. Ja samaa mieltä olen myös omasta sivun käsittelijästä. Se kannattaisi aina tehdä. Mitä vähemmän koodia yhdellä sivulla on, niin sitä selkeämpää se on.
name = määritteen käyttäminen ei ole pakollinen, mutta mielestäni sitä kannattaa käyttää. Nämä kuitenkin ovat vain mielipiteitä.
Eli action kohtaan vaikka 'kasitteleSivu.php'
Täällä suoritat tallennuksen ja ohjaat takaisin sen jälkeen oikealle sivulle.
headear("location:tanneTakas.php");
exit;
Vasta_alkaja kirjoitti:
Aivan oikein, ne löytyvät $_POST metodilla.
Ei, vaan $_POST-taulukosta.
Vasta_alkaja kirjoitti:
headear("location:tanneTakas.php");
header('Location: http://' . $_SERVER['SERVER_NAME'] . '/tanneTakas.php');
Vasta_alkaja kirjoitti:
headear("location:tanneTakas.php");
Blaza kirjoitti:
header('Location: http://' . $_SERVER['SERVER_NAME'] . '/tanneTakas.php');
header("location:./tanneTakas.php"); exit;
Riittää kyllä.
Vasta_alkaja kirjoitti:
Riittää kyllä.
Speksi sanoo, että absoluuttinen URI. Ehkä se joskus toimii suhteellisellakin, mutta sitä ei kukaan takaa.
Tehdään ne asiat oikein, kun se ei ole edes vaikeaa.
Jonkun Nokialaiseni xhtml-selain ei ainakaan toiminut ilman absoluuttista URIa.
Kiitoksia tästä infosta.
ajv kirjoitti:
Jonkun Nokialaiseni xhtml-selain ei ainakaan toiminut ilman absoluuttista URIa.
Kaivoin tuon vanhan nokialaiseni ja testasin, niin toimihan tuo suhteellinen osoite silläkin. Muistin väärin, mutta jotain tuollaisi ongelmia mulla kuitenkin sen kaa joskus oli :)
Tuossa testisivu, jos joku muu haluaa testata jollain eksoottisemmalla selaimella:
http://ajv.lautatarha.com/testing/redirect.php?
http://ajv.lautatarha.com/testing/redirect.php?
Kummatkin pitäisi ohjautua osoitteeseen
http://ajv.lautatarha.com/testing/redirect.php ja näyttää sivun lähdekoodi.
Toimii ja uskoisin, että toimii muillakin. Mutta aina kannattaa kuitenkin tehdä oikeaoppisesti vaikka ei virheitä löytyisikään. Aina löytyy joku joka kaivaa sen toimimattomankin esiin.
Hyvä, että selvisi. :)
offtopic:
https://www.ohjelmointiputka.net/koodivinkit/
seuraakohan kukaan noita, tuonne saa mennä meikäläistä taas auttamaan. ;)
Musta tuntuu ettei noihin koodivinkkeihin kannata mennä mistään omista sovelluksista kyselemään, vaan kommentointi on tarkoitettu lähinnä _kyseisen_ koodivinkin kommentointiin.
Eli pysy mieluummin vain _tässä_ aiheessa! Sekoitat vaan koodivinkin käyttäjiä omalla soveltamisellasi.
Antti80 kirjoitti:
https://www.ohjelmointiputka.net/koodivinkit/
24301-php-kirjautuminen-rekisteröityminen-mysql-llä
seuraakohan kukaan noita, tuonne saa mennä meikäläistä taas auttamaan. ;)
Ei seuraa. Ei kenelläkään oo resursseja monitoroia tuhatta vinkkiä uusien kommenttien varalta.
Asia on juuri kuten Lebe80 sano.
Jos on kysyttävää jonku vinkin soveltamisesta, kannattaa tehä uus aihe, kertoa, mitä on tekemässä, ja linkata alkuperäseen vinkkiin.
Ok, kiitos. (Kirjoitin sinne, että unohtakaa kysymykseni.
Kannattaisko jatkaa tätä viestiketjuani vai oiskohan parempi tehdä just ihan uusi viestiketju? =)
EDIT: Ihan eri aihe, joten teen uuden viestiketjun kun kerkiän.
Viestejä voi poistaa ja editoida myös koodien kommenteista.
Ainiin, myöhäinen sytytys. Aniway, uusi viestiketju tehty.
Ja vielä kerran iso kaunis kiitos kaikille tämän viestiketjun "opettajille"! :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.