2013-03-11 2 views
1

내 코드의 그 : 그것은 교체없이 년대에 그대로 MSG가 데이터베이스로 전송됩니다는 C#에서 이미지에서 텍스트를 교체

[WebMethod] 
public static void SendChatMessage(string msg, int ToClient) 
{ 
    if (msg != null && ToClient != 0) 
    { 
     if (msg.Contains(":-)")) msg.Replace(":-)", "<img src='Styles/emojie/smile.png' /> "); 
     else if (msg.Contains(":-(")) msg.Replace(":-(", "<img src='Styles/emojie/sad.png' /> "); 
     else if (msg.Contains(":'-(")) msg.Replace(":'-(", "<img src='Styles/emojie/cry.png' /> "); 
     else if (msg.Contains(":-$")) msg.Replace(":-$", "<img src='Styles/emojie/shy.png' /> "); 
     int FromClientID = Convert.ToInt32(HttpContext.Current.Session["ClientID"]); 
     string query = "insert into chat (FROM_CLIENT,TO_CLIENT,CHAT_MSG) values (" + FromClientID + "," + ToClient + ",'" + msg + "')"; 
     new SQLHelper(SQLHelper.ConnectionStrings.WebSiteConnectionString).Insert(query); 
    } 
} 

내가 뭘 잘못하고 있는가?

+0

, 다른 생각 : 내가 데이터베이스에서 읽은 후 교체 할 것,하지에 쓰기 전에 그것. 위의 방법을 사용하면 예를 들어 URL이 바뀔 때 문제가 발생할 수 있습니다. 또는 브라우저에서 실행되지 않고 새 클라이언트를 구현하려는 경우 (html을 마크 업으로 사용하는 경우조차도). 또한, 새로운 스마일을 추가하면, 그들은 과거의 스마일에만 적용되지 않고 미래의 메시지에만 적용됩니다. 당신의 질문에 대한 답변은 완벽하게 jon skeet (어떤 명예 : D) –

답변

9

Replace은 기존 * 문자열을 수정한다고 가정합니다. 그렇지 않습니다. 수정 된 내용으로 문자열을 반환합니다. 문자열은 .NET에서 불변이므로. 문자열 작업 (Substring, ToUpper 등)을 변경하면 실제로 새 문자열이 반환됩니다. 이 같은 통화의 그래서

모든 :

msg.Replace(...); 

아마해야합니다 :

msg = msg.Replace(...); 

당신이해야 매개 변수화 된 SQL을 사용하는 대신 SQL 쿼리에 직접 모든 값을 넣어 시작 . 이렇게하면 코드를보다 읽기 쉽게 만들고 SQL injection attacks을 피하고 많은 데이터 형식 변환 문제를 제거 할 수 있습니다.

또한, 나는 모든 if 문에 괄호를 사용하고 별도의 라인에 문을 넣어 것 :

if (msg.Contains(":-)")) 
{ 
    msg = msg.Replace(":-)", "<img src='Styles/emojie/smile.png' /> "); 
} 

아, 그리고 현재 만 인해에 msg에 교체의 하나 세트를 만들 수 있습니다 if/else 진술. :-)을 이미 교체 한 경우 :-(을 교체하지 않으시겠습니까? 먼저 Contains 확인을 할 필요가 정말 없다 ... 나는 무조건 함께 전화를 단지를 체인 것 :

msg = msg.Replace(":-)", "<img src='Styles/emojie/smile.png'/> ") 
     .Replace(":-(", "<img src='Styles/emojie/sad.png'/> ") 
     .Replace(":'-(", "<img src='Styles/emojie/cry.png'/> ") 
     .Replace(":-$", "<img src='Styles/emojie/shy.png'/> "); 

훨씬 더 간단합니다.

+0

에 의해 정교하게 작성되었으므로 내 메시지가 '예 :-)'인 경우 교체 후 ''이라고 표시됩니까? – Sora

+0

답장을 보내 주셔서 감사합니다 :) – Sora

1

실제로 문자열을 변경하지 않는 string.Replace를 호출, 그래서 당신이 그것을 다시 할당 할 필요도

msg = msg.Replace(...); 
관련 문제