2013-05-07 6 views
0

Ce code fonctionne parfaitement dans l'iphone, simulateur d'ipad à la fois xcode 4.5 et xcode 4.6. Également Déboguer parfaitement avec le dispositif dans xcode 4.5. mais quand j'essaye de déboguer le périphérique dans xcode 4.6.2 alors cette erreur montre.Sqlite montre EXC_BAD_ACCESS dans ios SDK

C'est la requête

NSString *insertQuery=[NSString stringWithFormat:@"Insert into %@ (ID,Question,Answer,Option1,Option2,Option3,Explanation,ImageName,Used) values(%d,'%@','%@','%@','%@','%@','%@','%@','%@')",table,[[d objectForKey:@"ID"]intValue],[d objectForKey:@"Question"],[d objectForKey:@"Answer"],[d objectForKey:@"Option1"],[d objectForKey:@"Option2"],[d objectForKey:@"Option3"],[d objectForKey:@"Explanation"],[d objectForKey:@"ImageName"],@"N"]; 
         NSLog(@"insert query-%@",insertQuery); 
         [database executeNonQuery:insertQuery]; 

est ici le code qui montre l'erreur EXC_BAD_ACCESS

- (BOOL)executeNonQuery:(NSString *)sql, ... 
    { 
    va_list args; 
    va_start(args, sql); 

    NSMutableArray *argsArray = [[NSMutableArray alloc] init]; 
    NSUInteger i; 
    for (i = 0; i < [sql length]; ++i) 
     { 
     if ([sql characterAtIndex:i] == '?') 

        [argsArray addObject:va_arg(args, id)]; //This line shows error. 
    } 

    va_end(args); 

    BOOL success = [self executeNonQuery:sql arguments:argsArray]; 

    [argsArray release]; 
    return success; 
    } 

Répondre

2

Boy Howdy qui est un code dangereux; composition de requête non protégée + analyse syntaxique! Le potentiel d'attaque par injection SQL est élevé! Le problème est que vous interprétez des contenus de chaîne générés dynamiquement sans tenir compte de ce qui se trouve dans les chaînes. La version de Xcode n'est pas pertinente.

Lorsque vous composez votre insertQuery puis passer à executeNonQuery:, si cette chaîne contient des caractères ?, alors cela nécessitera un autre argument soit transmis à cette méthode.

I.e. dire [[d objectForKey:@"ID"]intValue] renvoie @"fd?Edfds???sdfefsads?f?"; cela sera interprété comme ayant besoin de six arguments dans votre méthode executeNonQuery:.

BOOM

Si vous allez composer une requête complète dans votre chaîne insertQuery, alors vous devrez passer à tout ce qui peut directement évaluer le SQL. En regardant l'appel, je parierais que executeNonQuery:arguments: fera encore un autre passage à travers la chaîne et/ou les arguments pour lier les arguments aux ? s.

+0

merci pour la réponse..mais je suis encore confus s'il vous plaît donnez-moi un exemple comment puis-je passer la requête directement à [database executenonquery: ...] –

+0

[database executeNonQuery: @ "INSERT INTO? VALUES (?,?,? ,?,?,?,?,?,?); ", table, [[d objectForKey: @" ID "] intValeur], [d objectForKey: @" Question "], [d objectForKey: @" Réponse "] , [d objectForKey: @ "Option1"], [d objectForKey: @ "Option2"], [d objectForKey: @ "Option3"], [d objectForKey: @ "Explication"], [d objectForKey: @ "ImageName"] , @ "N"]; // J'ai essayé ce suis-je raison ..? –

+0

Cela semble être la façon dont l'API est conçue, oui. – bbum

Questions connexes