if(get_magic_quotes_gpc == 1) { $lopullinenviesti = mysql_real_escape_string(stripslashes($r[0])); } else { $lopullinenviesti = mysql_real_escape_string($r[0]); } echo $lopullinenviesti;
Tulostukseen tulee mukaan "" mekkien kanssa \" \" merkit. Aikaisemmin tästä ongelmasta jo kysyin ja sain vastauksia, mutta vika ei näköjään olekaan vielä korjaantunut.
Funktio mysql_real_escape_string() lisää kenoviivat lainausmerkkeihin. Kutsut kyseistä funktiota ehtolauseen molemmissa osissa, joten tottakai lopputulos on aina sama. Ehdon ollessa tosi teet jopa niinkin veikeästi, että ensin poistat kenoviivat stripslashes()
-funktiolla ja sen jälkeen lisäät ne uudelleen mysql_real_escape_string()
:llä. :-)
Kokeile esim. näin:
if (get_magic_quotes_gpc()) $lopullinenviesti = stripslashes($r[0]); else $lopullinenviesti = $r[0];
Sen verran tarkentaisin, että lopputulos ehtolauseen kumpikin lause ei tuota samaa lopputulosta paitsi jos syötteessä ei ole \ -merkkejä.
Mutta tosaain, tuo mysql_real_escape_string on tarkoitettu siihen tilanteeseen, kun tekstiä laitetaan osaksi MySQL-kyselyä, ei käyttäjälle näytettäväksi. MySQL:lle tuo \ on erikoismerkki, joten \" tallentuu kantaan muodossa "
Sinänsä itse asiassa yllätyin että tuo edes laittaa kenoviivat "-merkkien eteen, itse käytän aina SQL:ssä tekstinerottimena '-merkkiä.
Grez kirjoitti:
Sen verran tarkentaisin, että lopputulos ehtolauseen kumpikin lause ei tuota samaa lopputulosta paitsi jos syötteessä ei ole \ -merkkejä.
Aivan totta.
jmp kirjoitti:
Kokeile esim. näin:
if (get_magic_quotes_gpc()) $lopullinenviesti = stripslashes($r[0]); else $lopullinenviesti = $r[0];
edelleenkin tuolla tavalla laitettuna tulee seuraava tulos
\"testi\"
Tiedon tallennus menee näin
if(get_magic_quotes_gpc == 1){ $v = mysql_real_escape_string(stripslashes($_REQUEST['viesti'])); } else{ $v = mysql_real_escape_string($_REQUEST['viesti']); }
Edelleen, tuolla tavalla kuuluukin tulla \"testi\" jos katsot sitä muuttujaa $lopullinenviesti tai muuttujaa $v
Jos sinulla on ongelma koodissa, niin laita mielellään kuvaus siitä miten ongelma esiintyy ja koko koodi (jos se on ihan hirmuisen pitkä niin käytä jotain pastebiniä, vaikka pastie). Nyt näyttää vahvasti siltä, että etsit vikaa väärästä kohdasta.
Vaikuttaa siltä, ettei ketjun aloittaja ole ymmärtänyt mysql_real_escape_string-funktion käyttötarkoitusta. Kuten Grez jo alussa sanoi, sitä käytetään muotoilemaan tietokantaan menevä data sopimaan SQL-lauseen sisään. Tämä tarkoittaa käytännössä kenoviivojen lisäämistä tiettyjen merkkien eteen. Tietokantaan nuo erikseen lisätyt kenoviivat eivät tallennu.
Jos merkkijono halutaan tulostaa sivulle näkyviin, sitä ei tietenkään käsitellä mysql_real_escape_string-funktiolla (ellei kyseessä ole koodausvaiheen aikainen debug-tulostus, jolla halutaan varmistaa SQL-lauseen oikea muoto).
Vasta_alkaja kirjoitti:
Tiedon tallennus menee näin ...
Ei mene. Tuo ei tallenna mitään. Se vain muotoilee datan mysql_query-funktiota varten.
Tuossa se on liitettynä pastieen. Ongelmanani näyttäisi olevan se että merkit \\tallentuvat tietokantaan.
Varmistan vielä: Ylimääräiset kenot näkyvät, kun otat mysql_query("SELECT ...") -lauseella tavaraa kannasta ja tulostat sen sellaisenaan?
Esim.
<?php // ... $result = mysql_query("SELECT ..."); // täydennä itse echo "<pre>" . print_r(mysql_fetch_assoc($result), true) . "</pre>"; ?>
Edit: virhe saattoi löytyä:
if(get_magic_quotes_gpc == 1){
pitää olla
if(get_magic_quotes_gpc() == 1){
tai vielä siistimmin
if (get_magic_quotes_gpc()) {
Tuossahan se vika taitaakin olla. Pitääpä illan päälle testata.
Kiitos paljon viestiketjuun osallistujille. Vika on nyt kunnossa.
Tahtoisin vain huomauttaa, että mainitsin tuosta virheestä jo edellisessä ketjussasi:
Metabolix kirjoitti:
Eikö funktioita yleensä pitäisi kutsua? Yllä siis get_magic_quotes_gpc(), huom sulut.
Annoin aiheesta myös koodiesimerkin. Muistapa lukea vastaukset ensi kerralla, ettei tarvitse turhaan paasata. ;)
Kyllä annoit esimerkin ja olet oikeassa vastausten lukemisessa. Mutta olet varmasti itsekkin huomannut, että joskus kun koodaat niin silmäsi ei näe aina sellaistakaan virhettä mikä olisi ihan itsestäänselvyys, niinkuin tässä nyt pääsi käymään.
Vasta_alkaja kirjoitti:
Mutta olet varmasti itsekkin huomannut, että joskus kun koodaat niin silmäsi ei näe aina sellaistakaan virhettä mikä olisi ihan itsestäänselvyys, niinkuin tässä nyt pääsi käymään.
[offtopic]Vaikuttiko silmien väsyminen koodiin myös siihen, että et jaksanut lukea vinkkejä täältä?[/offtopic]
Reca:kaan ei nyt tajunnut sitä, että luulin vian olevan paljon muuallakuin aikaisemmassa viestiketjussa. Siihen asti mitä siellä käsittelin tästä aiheesta, luulin vian olevan kunnossa, mutta ei. Sen vuoksipa ei tullut ajateltua, että pitäisipä sitä vanhaa viestiketjuakin lukea.
Homma pihvi :-)
Hyvä kuitenkin, että nyt asia on ratkaistu... ;-)
joo.
Sehän se pääasia on. Tämäkin viesti venyttää jo tätä ketjua neljännellä turhalla viestillä. Mutta pakko laittaa :)
Itselläni on tällä hetkellä samantapainen ongelma. Haluaisin tallentaa "-merkin sellaisenaan. Osaisikohan joku näppärämpi neuvoa, kuinka pääsisin haluamaani lopputulokseen.
Kun kirjoitan näin:
<p style="padding-left: 30px;">Testi</p>
phpMyAdminilla näyttää kannassa tältä:
<p style=\"padding-left: 30px;\">Testi</p>
Tulostuu näin:
<p style=\"padding-left: 30px;\">Testi</p>
Tekstihän tosiaan käsitellään mysql_real_escape_string-funktiolla, joka on ilmeisesti tässä tapauksessa väärin.
$viesti = mysql_real_escape_string($_POST["viesti"], $yhteys);
OskariB kirjoitti:
Itselläni on tällä hetkellä samantapainen ongelma. Haluaisin tallentaa "-merkin sellaisenaan. Osaisikohan joku näppärämpi neuvoa, kuinka pääsisin haluamaani lopputulokseen.
Kun kirjoitan näin:
<p style="padding-left: 30px;">Testi</p>phpMyAdminilla näyttää kannassa tältä:
<p style=\"padding-left: 30px;\">Testi</p>Tulostuu näin:
<p style=\"padding-left: 30px;\">Testi</p>Tekstihän tosiaan käsitellään mysql_real_escape_string-funktiolla, joka on ilmeisesti tässä tapauksessa väärin.
$viesti = mysql_real_escape_string($_POST["viesti"], $yhteys);
Laita tulostettaessa stripslashes()-funktion lävitse. Ei sinne kantaan voi tuollaisia merkkejä oikein tallentaa. Jos taas kannan sisältöön pitää verrata, voit laittaa haluamaasi tekstipätkään kauttaviivat mukaan.
ville-v kirjoitti:
Laita tulostettaessa stripslashes()-funktion lävitse. Ei sinne kantaan voi tuollaisia merkkejä oikein tallentaa. Jos taas kannan sisältöön pitää verrata, voit laittaa haluamaasi tekstipätkään kauttaviivat mukaan.
Tämähän näyttäisi toimivan. Eikä edes hajoa editorissa, kun avattaessa ajaa myös stripslashes()-funktion lävitse.
Aihe on jo aika vanha, joten et voi enää vastata siihen.