سؤال

وأنا بناء مجمع فئة ل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;
}

وحاولت تشغيل هذا من خلال كنها لم يؤدوا كما هو متوقع، وانتهت في أخطاء الخلية.

هل كانت مفيدة؟

المحلول

وتبدو جيدة بالنسبة لي. وأظن مشكلة قاعدة البيانات الخاصة بك في مكان آخر.

وهناك طريقة سهلة للتحقق: استبدال 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) ابحث عن أخطاء في أي مكان آخر. وقاعدة البيانات :: تنفيذ ترميز بشكل جيد؟ ربما يقوم snprintf داخليا مع حجم المخزن المؤقت ضمني (والتي يمكن أن تزيد)

وC) حاول التقاط إخراج التصحيح ودخولها مباشرة في برنامج عميل الخلية (لا تنسى أن تضع فاصلة منقوطة في النهاية). نفس الخطأ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top