diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/README.md b/README.md index 2dca3df..a7546ad 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ -golang版本的mysql_escape_string() +golang version of mysql_escape_string() -参考了mysql的C版本api \ No newline at end of file +refer to mysql C api's escape_string_for_mysql function : https://github.com/twitter/mysql/blob/865aae5f23e2091e1316ca0e6c6651d57f786c76/mysys/charset.c + +tested with some simple manual written data and compare with php5's mysql_escape_string. \ No newline at end of file diff --git a/mysql_escape.go b/mysql_escape.go index defbc4b..784e142 100644 --- a/mysql_escape.go +++ b/mysql_escape.go @@ -1,61 +1,40 @@ -package main +package mysql_escape -import ( - "errors" - "fmt" -) - -func mysql_escape(source string) (string, error) { - var j int = 0 +func MysqlEscapeString(source string) string { if len(source) == 0 { - return "", errors.New("source is null") + return "" } tempStr := source[:] + + var j int = 0 desc := make([]byte, len(tempStr)*2) for i := 0; i < len(tempStr); i++ { - flag := false var escape byte + escape = 0 switch tempStr[i] { + case 0: + escape = '0' case '\r': - flag = true - escape = '\r' - break + escape = 'r' case '\n': - flag = true - escape = '\n' - break + escape = 'n' case '\\': - flag = true escape = '\\' - break case '\'': - flag = true escape = '\'' - break case '"': - flag = true escape = '"' - break case '\032': - flag = true escape = 'Z' - break - default: } - if flag { + if escape != 0 { desc[j] = '\\' desc[j+1] = escape - j = j + 2 + j += 2 } else { desc[j] = tempStr[i] - j = j + 1 + j += 1 } } - return string(desc[0:j]), nil -} - -func main() { - if str, err := mysql_escape(`SELECT * FROM users WHERE user=20 AND password='%s'`); err == nil { - fmt.Println(str) - } + return string(desc[0:j]) } diff --git a/mysql_escape_test.go b/mysql_escape_test.go new file mode 100644 index 0000000..a4baf81 --- /dev/null +++ b/mysql_escape_test.go @@ -0,0 +1,65 @@ +package mysql_escape + +import ( + "bytes" + . "github.com/smartystreets/goconvey/convey" + "io/ioutil" + "testing" +) + +var phpCode string = `// use z to seperate, so no z in data +$src = array( + "normal", + "aaa\ro", // \r + "iam\0ooo", // \0 + "\"shou\x08ldbe", // " and \b + "+123", + "'youyou'", // ' + "\n gogogo", + "\026haha", + "tab \t iam tab", + "yoyo\\ yoyo", + "heros never die", + "heros%", + "heros_", + "heros$(&&^*&$##%^(*(*&$##&^^&(*)", + "??>><<>>