亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mysql_real_escape_string 等效于 Golang

mysql_real_escape_string 等效于 Golang

Go
慕斯709654 2021-10-25 17:01:14
我想轉義構成數據庫查詢一部分的值,但我不能使用參數化查詢。Go 是否具有mysql_real_escape_string可用于轉義查詢值的 PHP 等價物?
查看完整描述

3 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

我想出了自己的解決方案來自己創建函數。

希望它對某人有用。


func MysqlRealEscapeString(value string) string {

    replace := map[string]string{"\\":"\\\\", "'":`\'`, "\\0":"\\\\0", "\n":"\\n", "\r":"\\r", `"`:`\"`, "\x1a":"\\Z"}


    for b, a := range replace {

        value = strings.Replace(value, b, a, -1)

    }

    

    return value;

}

1.MysqlRealEscapeString 不對,下面的測試用例會失敗


func TestEscape(t *testing.T) {

    mysqlEscapeList := map[string]string{

        "\\": "\\\\", "'": `\'`, "\\0": "\\\\0", "\n": "\\n", "\r": "\\r", `"`: `\"`, "\x1a": "\\Z"}


    for old, want := range mysqlEscapeList {

        testEscape(t, old, want)

    }

    testEscape(t, `<p>123</p><div><img width="1080" />`, `<p>123</p><div><img width=\"1080\" />`)

}

func testEscape(t *testing.T, origin, want string) {

    escaped := MysqlRealEscapeString(origin)

    assert.Equal(t, want, escaped)

}

改用這個

func Escape(sql string) string {

    dest := make([]byte, 0, 2*len(sql))

    var escape byte

    for i := 0; i < len(sql); i++ {

        c := sql[i]


        escape = 0


        switch c {

        case 0: /* Must be escaped for 'mysql' */

            escape = '0'

            break

        case '\n': /* Must be escaped for logs */

            escape = 'n'

            break

        case '\r':

            escape = 'r'

            break

        case '\\':

            escape = '\\'

            break

        case '\'':

            escape = '\''

            break

        case '"': /* Better safe than sorry */

            escape = '"'

            break

        case '\032': //十進制26,八進制32,十六進制1a, /* This gives problems on Win32 */

            escape = 'Z'

        }


        if escape != 0 {

            dest = append(dest, '\\', escape)

        } else {

            dest = append(dest, c)

        }

    }


    return string(dest)

}


查看完整回答
反對 回復 2021-10-25
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

改進的答案:


func MysqlRealEscapeString(value string) string {

    var sb strings.Builder

    for i := 0; i < len(value); i++ {

        c := value[i]

        switch c {

        case '\\', 0, '\n', '\r', '\'', '"':

            sb.WriteByte('\\')

            sb.WriteByte(c)

        case '\032':

            sb.WriteByte('\\')

            sb.WriteByte('Z')

        default:

            sb.WriteByte(c)

        }

    }

    return sb.String()

}


查看完整回答
反對 回復 2021-10-25
  • 3 回答
  • 0 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號