私はこれを理解するのにとてもイライラする時間を過ごしています。ローカル サーバーで正常に動作している iOS アプリのログイン/登録機能を作成しています。実際のサーバーにインポートしたいのですが、ほとんど成功していません。参考までにサンプルコードを最後に載せておきます。
EC2 インスタンスをセットアップし、セキュリティ グループでポート 3306 を開いていることを確認しました (こちらを参照)。私が抱えている問題は、アプリを介してインスタンスに最初に接続しようとするときです。API.m (私のインスタンスのエラスティック IP) に接続すると、接続にhttp://54.215.166.236
成功しません。つまり、このメソッドの失敗ブロックが呼び出されます。
[operation setCompletionBlockWithSuccess: failure: ];
ただし、成功/失敗の決定の前にphpファイルが実行されます。これは、Apacheエラーログに表示されるものです。
mysqli_connect(): (HY000/1130): ホスト '54.215.166.236' は、6 行目の /var/www/html/php/lib.php にあるこの MySQL サーバーへの接続を許可されていません
そして、それが次の方法でMySQL dbにアクセスしているときです。
$link = mysqli_connect("54.215.166.236","user","password");
mysqli_select_db($link, "db");
しかし、アドレスを変更して 3306 ポートを含めると...
$link = mysqli_connect("54.215.166.236:3306","user","password");
mysqli_select_db($link, "db");
mysqli_connect(): (HY000/2005): 行 6 の /var/www/html/php/lib.php の不明な MySQL サーバー ホスト '54.215.166.236:3306' (0)
繰り返しますが、アドレスで最初のインスタンス接続を作成しようとすると、これがすべてhttp://54.215.166.236
です。したがって、これは EC2 インスタンスに正常に接続していることを示していますが、MySQL データベースには接続していないため、failure:
ブロック に送信されます。
戻って API.m の初期接続アドレスを に変更するhttp://54.215.166.236:3306
と、接続はブロックに進みsetCompletionBlockWithSuccess:
ますが、apache、php、または mysql からログ出力が得られず、サーバー データベースにエントリもありません。あたかもphpファイルが実行されていないかのようです。実際、これはおそらくまさに起こっていることです。なぜなら、のようなphpファイルを実行しようとするとhttp://54.215.166.236:3306/index.php
、ブラウザはphpファイルを実行するのではなく、ダウンロードしようとするからです。これが私がとても混乱している理由です。MySQL データベースにログインしようとしてもいない場合 (ログ出力がなく、db にデータが正常に入力されないため)、最初の接続で 3306 ポートを追加すると「正常に」接続されるのはなぜですか?
私はここで途方に暮れています。私はこの問題に何日も悩まされてきました。私は本当にここでいくつかの助けを借りることができました. 私の問題を説明するサンプルコードをいくつか含めます。
//Test.m
@implementation
[API sharedInstance]
@end
.
//API.h
typedef void (^JSONResponseBlock)(NSDictionary* json);
@interface API : AFHTTPClient
...
@end
//API.m
#define kAPIHost @"http://54.215.166.236:3306"
#define kAPIPath @"php/"
@implementation API
@synthesize user;
+ (API *) sharedInstance
{
static API *sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:kAPIHost]];
});
//Just making some test parameters to store in the db
NSMutableDictionary *params =[NSMutableDictionary dictionaryWithObjectsAndKeys:
@"register", @"command",
@"name", @"username",
@"pass", @"password",
nil];
[sharedInstance commandWithParams:params
onCompletion:^(NSDictionary *json)
{
NSLog(@"Error: %@", [json objectForKey:@"error"]);
}];
return sharedInstance;
}
- (void) commandWithParams: (NSMutableDictionary *) params
onCompletion: (JSONResponseBlock)completionBlock
{
NSMutableURLRequest *apiRequest =
[self multipartFormRequestWithMethod:@"POST"
path:kAPIPath
parameters:params
constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
}];
AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
//success!
completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//failure :(
completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
}];
[operation start];
}
//intialize the API class with the destination host name
- (API *) init
{
//call super init
self = [super init];
if (self != nil) {
//initialize the object
user = nil;
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
// Accept HTTP Header
[self setDefaultHeader:@"Accept" value:@"application/json"];
}
return self;
}
@end
すべての PHP を含めるつもりはありませんが、関連する部分だけを含めます。
$link = mysqli_connect("54.215.166.236:3306","user","password");
mysqli_select_db($link, "db");