2009-11-29 107 views
2

我正在爲mysql c api構建一個類包裝,特別是在mysql_real_escape_string的時刻,我不認爲我做得很對。C++ Mysql C API mysql_real_escape_string

這是我對功能:

std::string Database::EscapeString(const char *pStr) 
{ 
    char *tStr = new char[strlen(pStr)*2+1]; 
    mysql_real_escape_string(m_sqlCon, tStr, pStr, strlen(pStr)); 
    string retStr(tStr); 
    delete [] tStr; 
    return retStr; 
} 

我試圖通過運行這個,但如預期在MySQL錯誤,結束了它沒有執行。

+1

具體是什麼導致了mysql錯誤?你有沒有嘗試使用printf或cout打印結果字符串(包括tStr和retStr),然後再將它們送入mysql?結果是什麼? – 2009-11-29 01:39:20

回答

2

對我很好。我懷疑你的數據庫問題是在其他地方。

有一個簡單的方法來檢查:暫時地以虛擬函數替換Database::EscapeString,即

std::string Database::EscapeString(const char *pStr) {return string(pStr);} 

然後看看你得到同樣的錯誤。

編輯: 不知道究竟是什麼錯誤,或查詢導致它是什麼,它是很難被縮小問題。這裏有一些事情要嘗試:

A)只是擺脫所有需要逃脫的字符。它會把假的數據到數據庫中,但希望你只是測試反正:

std::string Database::EscapeString(const char *pStr) { 
    string result; 
    while (*pStr) { 
     if (strchr("\"'\r\n\t",*pStr)) 
     { 
      //bad character, skip 
     } 
     else 
     { 
      result.push_back(*pStr); 
     } 
     ++pStr; 
    } 
    return result; 
} 

B)查找錯誤別處。 Database :: Execute是否編碼良好?也許它在內部使用硬編碼緩衝區大小(您可能會超出)snprintf

C)嘗試將調試輸出並直接輸入到mysql客戶端程序中(不要忘記在末尾添加分號)。同樣的錯誤?

+0

當/如果你這樣做,確保你傳入的字符串不包含任何需要轉義的字符(例如引號) – Managu 2009-11-29 01:42:33

+0

當不使用mysql_real_escape_string時,我得到相同類型的錯誤,但在字符串的不同位置。 Erorr: 20:46:36 E數據庫:數據庫查詢失敗:您的SQL語法中有錯誤 ;請檢查與您的MySQL服務器版本對應的手冊,以便yntax可以使用在附近的領先設計團隊中,並在下一個較低的ranking支持人員處混合使用 – Undawned 2009-11-29 01:48:18

+0

需要引用該字符串。例如。 「INSERT INTO表(string_column)VALUES(somebodys領先的設計團隊,擔心下一個排名較低的支持人員擔憂)」是無效的SQL。 – Managu 2009-11-29 01:51:40