Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php ongelma "" => \"\"

Sivun loppuun

Vasta_alkaja [22.08.2008 20:54:14]

#

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.

jmp [22.08.2008 21:36:52]

#

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];

Grez [22.08.2008 22:11:58]

#

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ä.

jmp [22.08.2008 22:24:41]

#

Grez kirjoitti:

Sen verran tarkentaisin, että lopputulos ehtolauseen kumpikin lause ei tuota samaa lopputulosta paitsi jos syötteessä ei ole \ -merkkejä.

Aivan totta.

Vasta_alkaja [23.08.2008 11:24:19]

#

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']);
 }

Grez [23.08.2008 12:26:23]

#

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.

Chiman [23.08.2008 13:27:29]

#

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.

Vasta_alkaja [24.08.2008 12:06:30]

#

Tuossa se on liitettynä pastieen. Ongelmanani näyttäisi olevan se että merkit \\tallentuvat tietokantaan.

http://pastie.org/258864

Chiman [24.08.2008 12:46:00]

#

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()) {

Vasta_alkaja [24.08.2008 14:03:25]

#

Tuossahan se vika taitaakin olla. Pitääpä illan päälle testata.

Vasta_alkaja [24.08.2008 21:30:54]

#

Kiitos paljon viestiketjuun osallistujille. Vika on nyt kunnossa.

Metabolix [24.08.2008 21:44:05]

#

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. ;)

Vasta_alkaja [25.08.2008 19:18:56]

#

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.

reca [26.08.2008 16:07:54]

#

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]

Vasta_alkaja [28.08.2008 08:53:24]

#

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.

reca [28.08.2008 15:53:37]

#

Homma pihvi :-)

Hyvä kuitenkin, että nyt asia on ratkaistu... ;-)

Vasta_alkaja [28.08.2008 20:20:58]

#

joo.

Sehän se pääasia on. Tämäkin viesti venyttää jo tätä ketjua neljännellä turhalla viestillä. Mutta pakko laittaa :)

OskariB [31.08.2008 19:35:45]

#

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);

ville-v [31.08.2008 19:42:45]

#

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.

OskariB [31.08.2008 19:57:41]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta