webForumDet fria alternativet

Problem med en ' i en sql sats

Java

11 svar · 382 visningar · startad av tosses

Medlem sedan aug. 2003190 inlägg
Frågan#1

Jag ska skick in företagsnamn i en db och får error så fort namnet innehåller en ' .

T.ex. MC Donald's

Här är koden:

String lagraQr = "insert into ftglistadeljsp (PEORGNR, NAMN, ADDR, PNR, BEORT, TEL, ANV) values ('"+request.getParameter("PEORGNR")+"' , '"+request.getParameter("NAMN")+"' , '"+request.getParameter("ADDR")+"' , '"+request.getParameter("PNR")+"' , '"+request.getParameter("BEORT")+"' , '"+request.getParameter("TEL")+"' , '"+session.getAttribute("user")+"')";

Finns det någon bra lösning på detta!

Snälla hjälp mig!

Medlem sedan mars 20007 896 inlägg
#2

Ett enkelt sätt är att ta bort den helt, genom metoden replace() i String-klassen:

String string = "MC Donald's";
string = string.replace( '\\'', '' );

Det finns ingen lättare metod, replace() tar nämligen bara emot tecken som parametrar. Då får du använda reguljära uttryck eller skriva en egen metod som escape:ar/byter ut tecknet.

Medlem sedan aug. 20021 752 inlägg
#3

Sök och ersätt alla ' med ", tror det ska fungera. När du har en ' i texten så tror SQL servern att det är slut på den strängen.

request.getParameter("BEORT").replace('\'','\"')

:OO SPiN är också ledig idag verkar det som :e

/Viktor

Medlem sedan aug. 2003190 inlägg
#4

Tack!! Ni är guld värda!!!!!

Finns det någon manual med olika funktioner eller kommandon eller objekt och methoder? Ungefär som php's documentation!

PHP.net kan man hitta allt + exempel på hur man gör det!

/Tomas

Medlem sedan aug. 20021 752 inlägg
#5

Dessa 2 måste man ha om man ska utveckla i Java :)
J2SE 1.4.2 API
J2EE 1.3 API
Du hittar kanske inte så mycket exempel men det är bara att googla lite med funktions namnen så hittar man exempel.

/Viktor

Medlem sedan mars 20007 896 inlägg
#6

Viktor skrev:

SPiN är också ledig idag verkar det som

Nänä, jag har haft tenta hela morgonen... Ledig existerar inte i min värld! Åtminstone inte längre, nu när Pascal-kursen är avslutad...

Medlem sedan maj 20012 237 inlägg
#7

Kör med PreparedStatement istället.

String query = "SELECT username from admin where username = ? AND password = ?";

PreparedStatement stmt = connection.prepareStatement(query);
// connection är en Connection-objekt

stmt.setString(1, "O'reilly"); // ersätter första ? med O'reilly
stmt.setString(2, "tripleX"); // ersätter andra ? med "tripleX"

result = stmt.executeQuery();
// result är en ResultSet-objekt

nu behöver du inte ersätta ' med \' för detta sköts automatiskt av PreparedStatement(gissar jag på)

Medlem sedan feb. 2003202 inlägg
#8

Jag brukar anropa denna metod innan jag slänger in någonting i databasen:

public static String formatString(String str)
{
   if(str == null || str.length() == 0)
      return "";

   str = str.trim();

   int len = str.length();
   char c;
   StringBuffer sb = new StringBuffer(len + 20);

   for (int i=0; i<len; i++)
   {
      c = str.charAt(i);

      switch(c)
      {
         case 39: sb.append("''");
            break;
         case 34: sb.append("\"");
            break;
         case 92: sb.append("\\\\");
            break;
         default: sb.append(c);
      }
   }
   return sb.toString();
}

Denna metod låter dig spara enkelfnuttar i databasen, utan att sabba någonting... De övriga förslagen, (innan detta) var också bra!

Medlem sedan apr. 20007 588 inlägg
#9

Denna metod låter dig spara enkelfnuttar i databasen, utan att sabba någonting... De övriga förslagen, (innan detta) var också bra!

Nej, det enda förslag som var bra var jme:s förslag: ANVÄND PREPAREDSTATEMENT. Det finns ingen anledning att leka ASP-programmerare och fippla med enkelfnuttar när Java API:et ger tillgång till PreparedStatement.

Det finns även en annan stor fördel med PreparedStatement precis som dess namn antyder, den förbereder frågan och man kan sedan köra den upprepade gånger mot databasen med prestandavinst jämfört med om man i en loop skapar ett nytt Statement varje gång.

Medlem sedan aug. 2003190 inlägg
#10

Kan någon skriva en vanlig sqlfråga med preparedStatement methoden. Inklusive att loopa ut resultatet. Var så snill!

/Tomas

Medlem sedan aug. 20021 752 inlägg
#11

Kan någon skriva en vanlig sqlfråga med preparedStatement methoden. Inklusive att loopa ut resultatet. Var så snill!

Visst :)

PreparedStatement pstmnt=connection.prepareStatement("SELECT PEORGNR, NAME, ADDR, PNR, BEORT, TEL, ANV FROM ftglistadeljsp WHERE BEORT=?");
pstmnt.setString(1,"Stockholm");
ResultSet rs=pstmnt.executeQuery();
System.out.println("Stockholm");
while(rs.next())
{
	System.out.println(rs.getString("NAME")+rs.getString("TEL"));
}
pstmnt.setString(1,"Göteborg");
rs=pstmnt.executeQuery();
System.out.println("Göteborg");
while(rs.next())
{
	System.out.println(rs.getString("NAME")+rs.getString("TEL"));
}

/Viktor

Medlem sedan aug. 2003190 inlägg
#12

Tack! va ni är bra!!

/Tomas

254 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)