0

我有一个如此令人沮丧的时间来解决这个问题。我正在为在我的本地服务器上运行良好的 iOS 应用程序创建登录/注册功能。我想将它导入到一个实际的服务器,但我一直没有成功。我在本文末尾包含了示例代码以供参考。

我设置了一个 EC2 实例并确保在安全组中打开端口 3306(参见此处)。我遇到的问题是当我尝试通过应用程序与实例建立初始连接时。当我连接到http://54.215.166.236API.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");
4

1 回答 1

0

得到它的工作。原来我使用mysqli_connect() 函数错误地发送了端口参数,该函数清楚地显示端口是第五个参数。iOS 中与 EC2 实例的初始连接也不应在地址中包含端口。这些是我使用的有效设置:

#define kAPIHost @"http://54.215.166.236"

$link = mysqli_connect("54.215.166.236","user","password", "db", "3306");
于 2013-08-14T08:07:44.967 回答