2011-08-11 25 views
3

私は自分のアプリケーションでデータベースのログイン変数をチェックするPHPスクリプトを実行しようとしています。以下のコードは、ファイルの実行方法です。私はスクリプトを実行して、配列に結果を格納しています。 「はい」の結果はユーザーのログインデータが正しいことを意味し、「いいえ」の結果はそれが正しくないことを意味します。IPhone IOS:PHPスクリプトの実行に時間がかかりますか?

このコードは機能しますが、私の問題は時間です。私はタイマーを設定しています。私のPHPファイルが空白の場合でも、最初のブロックを実行するのに8秒かかります。他のすべて、でも、次のページをロードすることははるかに高速である(3秒トップス)

//first block 
NSString * post = [NSString stringWithFormat:@"userId=%@&password=%@",userId.text,password.text]; 
NSString * hostStr = @"http://domain.com/check_login.php?"; 
hostStr = [hostStr stringByAppendingString:post];  
NSURL *location = [NSURL URLWithString:hostStr]; 
NSDictionary *dictionaryData = [[ NSDictionary alloc ] initWithContentsOfURL:location ]; 

//second block 
NSArray *resultArray = [dictionaryData objectForKey:@"result"]; 

NSArray *loginidArray = [dictionaryData objectForKey:@"loginid"]; 

NSArray *usernameArray = [dictionaryData objectForKey:@"username"]; 

だけでなく、コードの最初のブロックの間に、約1〜4回のうち、私はこのエラーが出る「SendDelegateMEssage:デリゲートを返すために失敗しました10秒間待ってからメインループモード:_kCFURLConnectionPrivateRunLoopMode "を実行します。私はそれを調べようとしてきましたが、自分のコードに従って何が意味するのか分かりません。私はこのエラーが発生すると、コードは30〜60秒かかることがあります!!!

いずれの方向にも感謝します。

おかげで、

アマンダ

それがコード内でサーバーサイドを何が起こっているか知っていると便利です包み、PHPを含むように編集。

<?php 
header('Content-type: text/xml'); 
session_start(); 
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">\n<plist version=\"1.0\">\n"; 

$username = "user"; 
$password = "pass"; 
$host = "localhost"; 
$database = "database"; 

// Make the connect to MySQL or die 
// and display an error. 
$link = mysql_connect($host, $username, $password); 
if (!$link) { 
die('Could not connect: ' . mysql_error()); 
error_log("CANT CONNECT DB"); 
} 
else 
{ 
error_log("DB CONNECTED"); 
} 


mysql_select_db ($database); 


    $userId  = $_GET['userId']; 
    $password = $_GET['password']; 


    $sql = "SELECT user_login_id,userid from user_login WHERE userId ='". $userId ."' AND password ='".$password."'"; 
    $rs_login = mysql_query($sql, $link) or die (mysql_error()); 

    if(mysql_num_rows($rs_login) ==1) 
    { 

     $row = mysql_fetch_array($rs_login); 
     $user_login_id = $row['user_login_id']; 
     $user_login_name = $row['userid']; 

    // The data that needs to be transferred: 
    $my_data = array(); 

    $my_data["result"]  = array("YES"); 
    $my_data["loginid"]  = array($user_login_id); 
    $my_data["username"]  = array($user_login_name); 

    // Open the dictionary 
    echo "<dict>\n"; 

    // Putting the data into the plist format 
    foreach ($my_data as $key => $array) 
    { 
    // Loop for every value in $my_data 
    echo " <key>$key</key>\n <array>\n"; // Make a key with the key from $my_data and open an array for it's values. 
    foreach ($array as $value) 
    { // Go through every value in the current array from $my_data 
     echo "  <string>$value</string>\n"; // Print the value as a string in the array 
    } 
    echo " </array>\n"; // Close the array 
    } 

    echo "</dict>\n</plist>\n"; // Close the dictionary & plist 

} 
else 
{ 
    $my_data["result"] = array("NO"); 
    $my_data["loginid"] = array("--"); 
    $my_data["username"]  = array("--"); 

    // Open the dictionary 

    echo "<dict>\n"; 

    // Putting the data into the plist format 
    foreach ($my_data as $key => $array) 
    { 
    // Loop for every value in $my_data 
    echo " <key>$key</key>\n <array>\n"; // Make a key with the key from $my_data and open an array for it's values. 
    foreach ($array as $value) 
    { // Go through every value in the current array from $my_data 
     echo "  <string>$value</string>\n"; // Print the value as a string in the array 
    } 
    echo " </array>\n"; // Close the array 
    } 
    echo "</dict>\n</plist>\n"; // Close the dictionary & plist 



} 
mysql_free_result($rs_login); 

?> 


ソリューション
は、ここで私は一緒に行ったものだ、とそれだけでみんなありがとう...今にログ用の4秒かかります。

NSHTTPURLResponse * response = nil; 
NSError* error = nil; 

NSString * post = [NSString stringWithFormat:@"userId=%@&password=%@",userId.text,password.text]; 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL: [NSURL URLWithString:@"http://domainname.com/check_login.php?"]]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request 
              returningResponse:&response 
                 error:&error]; 
NSString *result = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 


NSString *errorDesc = nil; 
NSPropertyListFormat format; 

NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization 
             propertyListFromData:returnData 
             mutabilityOption:NSPropertyListMutableContainersAndLeaves 
             format:&format 
             errorDescription:&errorDesc]; 
if (!temp) { 
    NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); 
} 

NSArray *resultArray = [temp objectForKey:@"result"]; 

NSArray *loginidArray = [temp objectForKey:@"loginid"]; 

NSArray *usernameArray = [temp objectForKey:@"username"]; 
+0

デスクトップWebブラウザからそのファイルにアクセスしようとすると、サーバーからの応答にどれくらいの時間がかかりますか? – esqew

+0

1秒。私が言ったように、このファイルにアクセスするには、たとえそのファイルが空白であっても、かなりの時間がかかります。 – amanda

+1

私自身の好奇心の中で、それから辞書を直接形成できるように出力をどのようにフォーマットしていますか?私のWebサービスでは、JSONを出力し、パーサを使用して辞書に変換します。そして、PHPを投稿すると助けになるかもしれません。 –

答えて

1
NSString* res = nil; 
NSHTTPURLResponse * response = nil; 
NSError* error = nil; 

NSString * post = [NSString stringWithFormat:@"userId=%@&password=%@",userId.text,password.text]; 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL: [NSURL URLWithString:@"http://domain.com/check_login.php"]]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:&response 
             error:&error]; 
NSString *result = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

私は実際には上記のコードと同じことのようなものをやっているし、それは私に秒未満かかります。試してみる!

また、ブラウザからcheck_login.phpにアクセスし、読み込みに時間がかかるかどうかを確認してください。そのような場合は、問題の原因となっているPHPファイルです。それが即座にロードされた場合(それがそうであるように)、それはあなたのObjective-Cコードです。

+0

もしあなたが '$ _GET'を' $ _POST'または ' $ _REQUEST' –

+0

@Jules ...あなたの例に従い、ロボットが提案したように$ _GETを$ _REQUESTに変更する...フィールドにアクセスできるように結果を保存するにはどうすればいいですか?私は "NSDictionary * dictionaryData = [[NSDictionary alloc] initWithContentsOfFile:result];" 、私はresultArrayのインデックス0にアクセスしようとすると、(null)値を取得しています。 – amanda

+1

@amandaどういう意味ですか?コードスニペットを試しましたか?これはあなたのウェブページを呼び出して、その結果を 'NSString * result = ...'に入れます。だから、あなたが得るものを見るために、結果を 'NSLog'に入れてみてください。すべてがうまくいけば、XML出力が表示されます。 – Jules

関連する問題