我有一个如此令人沮丧的时间来解决这个问题。我正在为在我的本地服务器上运行良好的 iOS 应用程序创建登录/注册功能。我想将它导入到一个实际的服务器,但我一直没有成功。我在本文末尾包含了示例代码以供参考。
我设置了一个 EC2 实例并确保在安全组中打开端口 3306(参见此处)。我遇到的问题是当我尝试通过应用程序与实例建立初始连接时。当我连接到http://54.215.166.236
API.m(我的实例的弹性 IP)时,我没有成功连接。我的意思是,这个方法的失败块被调用:
[operation setCompletionBlockWithSuccess: failure: ];
但是,php 文件确实在成功/失败确定之前运行,这就是我在 apache 错误日志中看到的内容:
mysqli_connect(): (HY000/1130): Host '54.215.166.236' is not allowed to connect to this MySQL server in /var/www/html/php/lib.php on line 6
那是我通过以下方式访问 MySQL 数据库的时候:
$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): Unknown MySQL server host '54.215.166.236:3306' (0) in /var/www/html/php/lib.php on line 6
同样,这就是我尝试与 address 建立初始实例连接时的全部内容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 数据库(因为没有日志输出,也没有成功输入数据库中的数据),为什么在初始连接时添加 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");