Juu, minulla on tälläinen omanlainen harjoitus-projekti meneillään, mutta törmäsin 'ylivoimaiseen esteeseen'. Taitonihan ei ole ihan huipussaan, joten tulin hieman neuvoa pyytämään.
Eli ongelma on tämä. Minulla on 3 inputtia(type="text") ja yksi textarea. Kaikki toimii muuten loistavasti, mutta jos jossakin näistä on jokin seuraavista (',",# ja varmaan muitakin erikoismerkkejä) niin tiedot eivät tallennu tietokantaan, teksti kyllä tulostuu ruudulle. (ja textarean sisällön saan tulostettua 'normaaliksi' nl2br():n avulla, mutta se ei ratkaisuun mitenkään vaikuta)
Olen monenlaisia purkkaviritelmiä yrittänyt väsätä, mutta mikään ei ole ratkaissut ongelmaani. = /
Vielä olisi kysymys, että kun en ole hirveesti perehtynyt 'omiin'(?) funktioihin, niin voiko ratkaisusta tehä funktion joka sitten jokaiselle 4 inputille tekee sen, ettei tarvitse montaa kertaa samaa kirjoittaa
<?php function tarkista($n){ //jtn koodia tähän }... ?>
ja sitten sitä voisi käyttää tyyliin
tarkista($input1)
tarkista($input2)
Kai käytät jotain escape-funktiota tallentamisessa. Eli esim jos käytät ihan perus mysql_query() -funktiota niin kai käsittelet syötteet mysql_real_escape_string() -funktiolla?
tarkista(mysql_real_escape_string($input1));
Macro kirjoitti:
tarkista(mysql_real_escape_string($input1));
??
mysql_real_escape_string($input1) riittänee ;))
Jos nimi tuntuu pitkältä, siitä voi kyhätä oman lyhennelmän.
function tarkista($str){ return mysql_real_escape_string($str); }
Tässä myös auttaa kun laittaa mysql_queryn loppuun mysql_error tarkistuksen.
Funktio kyselyn suorittamista ja virheen tulostamista varten:
<?php function mysql_kysely($kysely) { $ret = mysql_query($kysely); // Jos onnistui, palautetaan, muuten ilmoitetaan virheestä. if ($ret) return $ret; trigger_error("<pre>Virhe!\n". htmlspecialchars(mysql_error(). "\n". $kysely). "</pre>", E_USER_ERROR); }
Tallennus tietokantaan:
<?php $luku = $_POST['luku']; $teksti = $_POST['teksti']; // Muutetaan luku aina luvuksi. (Desimaaliluvulle floatval.) $luku2 = intval($luku); // Muutetaan erikoismerkit turvallisiksi tallennusta varten. $teksti2 = mysql_real_escape_string($teksti); // Käytetään kyselyssä hipsuja tekstin ympärillä. $kysely = "INSERT INTO taulu SET sarake = '$teksti2', toinen = $luku2"; // Suoritetaan kysely omalla, virheistä ilmoittavalla funktiolla. mysql_kysely($kysely);
Tulostus sivulle:
<?php $tieto = "jotain tietokannasta tai lomakkeelta tullutta..."; // Muutetaan tulostusvaiheessa HTML:n erikoismerkit kuten < ja > turvallisiksi. echo htmlspecialchars($tieto);
Näistä ohjeista (kyselyn suorittaminen, mysql_real_escape_string, intval, floatval, hipsut, htmlspecialchars) saa poiketa vasta, kun ymmärtää itse kunnolla, mitä tekee.
Pekka Mansikka kirjoitti:
Macro kirjoitti:
tarkista(mysql_real_escape_string($input1));
??
mysql_real_escape_string($input1) riittänee ;))
No, mistä tiedät mitä tarkista-funktiossa on?
Noniin, nyttenhän tekstit sun muut tallentuvat mainiosti tietokantaan, tuon mysql_real_escape_string funktion avulla. =)
Käytin ensin kyllä tälläistä kyselyä:
$query = "INSERT INTO lyrics (kentta1,kentta2,kentta3,kentta4) VALUES ('" . $tekstia2 . "','" . $tekstib2 . "','" . $tekstic2 . "','" . $tekstid2 . "')"
Mutta se ei toiminut (varmaan jokin virhe tuolla tai sinne päin) ja vaihoin sen
$query = "INSERT INTO lyrics SET kentta1 = '$tekstia2', kentta2 = '$tekstib2', kentta3 = '$tekstic2', kentta4 = '$tekstid2'";"
Juu tuo funktio homman selitin aika huonosti, unohdin mainita muutaman jutun ja sillein. Yöllä ei kannata kirjoittaa mitään xP Funktion ideana oisi ollut suurinpiirtein jokin tälläinen
Syöte --> Tarkistetaan ettei ole ">,<" merkkejä tekstissä ja jos on, niin poistetaan --> mysql_real_escape_string
Jokin tuollainen ihme idea päässä, että jos sen oisi voinut funktiolla. Mutta ei siitä sen enempää, kun sitä tarvitse, yöllisiä ihmeajatuksia taas =) Kiitos avusta!
Kiva homma, kun sait pelaan. Tuossa ekassa kokeilussa sulla näkyi olevan välilyöntejä " merkin jälkeen ja ennen VALUES- osiossa, ne query-lauseen katkaisut olivat muutenkin siinä turhia, kuten tuo alempi skripti osoittaa. ;)
Macro kirjoitti:
No, mistä tiedät mitä tarkista-funktiossa on?
Mitä hyödyllistä siellä voi olla? Itse en keksi mitään, ellei moisen tarkoitus ole tarkistaa itse escape-funktion toimivuutta, mutta sellainen testaus kuulunee muualle.
Tietokantasyötteen escapetus on ainakin minun nähdäkseni viimeinen vaihe ennen kyselyn kokoamista ja suorittamista. Syötteiden tarkistus on syytä tehdä sitä ennen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.