2009-07-26 8 views
2

J'essaie de télécharger une série de lignes depuis ma base de données MySql, à travers une application de cacao que je développe. J'utilise un php qui reçoit un index de mon application et renvoie toutes les lignes jusqu'à cet index. Mon code de cacao est:Récupération de la base de données MySql à partir de l'application Cocoa - Mise en pont PHP

NSInteger index = 0; 
NSString *urlString = [NSString stringWithFormat:@"http://localhost/test.php?index=%d&", index]; 

NSArray *items = [NSArray arrayWithContentsOfURL:[NSURL URLWithString: urlString]]; 

NSLog(@"%@", [items description]); 

Lorsque le php reçoivent la variable indexGET il exécute ce code:

$index = $_GET['index']; 
$Keys = array(...); 

mysql_connect($Host, $User, $Password) or die("Unable to connect to database"); 
mysql_select_db($Database) or die("Unable to select database"); 


$result = mysql_query("SELECT * FROM transactions where id > $index ORDER BY id"); 

$plist = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
$plist .= "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"; 
$plist .= "<plist version=\"1.0\">\n"; 
$plist .= "<array>\n"; 

while($row = mysql_fetch_array($result)) { 
    $plist .= "\t<dict>\n"; 

    foreach($Keys as $key){ 
     $plist .= "\t\t<key>$key</key>\n"; 
     $plist .= "\t\t<string>$row[$key]</string>\n"; 
    } 

    $plist .= "\t</dict>\n"; 
} 

$plist .= "</array>\n"; 
$plist .= "</plist>"; 

echo $plist; 

unset($_GET['index']); 

Tout cela fonctionne très bien s'il y a jusqu'à 30 lignes de index et le dernier id de la base de données! Si, à partir de mon code cacao, je mets index pour demander jusqu'à 30 lignes ou que je mets index à zéro (pour demander toute la base de données) ... l'objet NSArray ne contient rien!

Qu'est-ce que je fais mal?

Répondre

0

Je suis désolé! J'ai résolu par moi-même! Il y avait un problème d'encodage! ont juste changé:

utf8_encode($row[$key]) 

et je l'ai résolu le problème!

3

Cela ne répondra pas à votre question, mais votre code est largement ouvert à une attaque par injection SQL. La façon de le fixer est un sprintf très simple:

$result = mysql_query(sprintf("SELECT * FROM transactions where id > %d ORDER BY id", intval($index)));

Maintenant, si un utilisateur malveillant tente d'injecter du texte dans la variable $ index, alors la combinaison intval + sprintf va simplement activer dans le nombre 0, ce qui protéger votre db.

+0

Merci pour la suggestion! – BitDrink

Questions connexes