1

それが私のコードです:

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

メッセージは、私が間違っていることを置き換えることなく、そのままデータベースに送信されますか?

4

2 に答える 2

9

Replaceそれが既存の*文字列を変更すると仮定しています。そうではありません。変更が加えられた新しい文字列を返します。.NET では文字列は不変であるため、そうする必要があります。文字列を変更すると予想されるすべての文字列操作 (など)は、実際には新しい文字列を返します。SubstringToUpper

したがって、すべての呼び出しは次のようになります。

msg.Replace(...);

おそらく次のようになります。

msg = msg.Replace(...);

また、すべての値を直接 SQL クエリに入れるのではなく、パラメーター化された SQL の使用を開始する必要があります。これにより、コードが読みやすくなり、SQL インジェクション攻撃が回避され、多くのデータ型変換の問題が解消されます。

さらに、すべてのステートメントで中かっこを使用し、ifステートメントを別の行に配置します。

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

ああ、そして現在、ステートメントのために1セットの交換のみを行います. すでに交換している場合、本当に交換したくないですか?最初にチェックを行う必要は本当にありません...私は無条件に呼び出しを連鎖させます:msgif / 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'/> ");

はるかに簡単です。

于 2013-03-11T14:46:06.723 に答える
1

呼び出しstring.Replaceても文字列は実際には変更されないため、再割り当てする必要があります。

msg = msg.Replace( ... );
于 2013-03-11T14:47:04.063 に答える