Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用iOS中的POST将数组传递给PHP_Php_Ios_Post - Fatal编程技术网

使用iOS中的POST将数组传递给PHP

使用iOS中的POST将数组传递给PHP,php,ios,post,Php,Ios,Post,所以我看过无数类似的问题,但没有一个能完全回答我的问题,希望你们能帮我解决 我需要使用POST或其他方式将restaurantID的数组从iOS传递到一个PHP文件。我知道ASIHTTPRequest,但我正在寻找内置的东西,它已经被开发人员放弃了。最后,我不想通过URL传递它们,因为我不知道会有多少条目 这就是我到目前为止得到的 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLW

所以我看过无数类似的问题,但没有一个能完全回答我的问题,希望你们能帮我解决

我需要使用POST或其他方式将restaurantID的数组从iOS传递到一个PHP文件。我知道ASIHTTPRequest,但我正在寻找内置的东西,它已经被开发人员放弃了。最后,我不想通过URL传递它们,因为我不知道会有多少条目

这就是我到目前为止得到的

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:theURL]];

[request setHTTPMethod:@"POST"];

NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];
[jsonDict setValue:restaurants forKey:@"restIDs"];
NSLog(@"JSON Dict: %@",jsonDict);//Checking my array here


NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON String: %@",jsonString); //Checking my jsonString here...

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setValue:@"json" forHTTPHeaderField:@"Data-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: jsonData];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"Return DATA contains: %@", [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil]);
NSArray *restMenuCount = [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil];
所以,从这个角度来看,我检查了所有的东西,看起来都很好,但是从PHP角度看,它甚至没有把它捡起来

下面是我的PHP文件的外观:

$restIDs = $_POST['restIDs'];
echo $restIDs; //Checking to see if it even has anything......but nothing there
for ($i = 0; $i < $restIDs.count; $i++) {
    $query = "SELECT * FROM `MenuItems` WHERE rest_id = '$restID'";
    $result = mysqli_query($connect, $query);
    $number = mysqli_num_rows($result);
    $menuNumber[$i] = $number;
}

echo json_encode($menuNumber);
$restIDs=$\u POST['restIDs'];
echo$restIDs//看看里面有没有什么东西……但什么都没有
对于($i=0;$i<$restIDs.count;$i++){
$query=“从'MenuItems'中选择*,其中rest\u id='$restID';
$result=mysqli\u查询($connect,$query);
$number=mysqli\u num\u行($result);
$menuNumber[$i]=$number;
}
echo json_编码($menuNumber);
最后,我做错了什么?为什么我的PHP端没有收到任何东西。最重要的是,有人能给我解释一下如何通过帖子发送数组吗。因为我觉得这才是我真正的问题,我还没有足够的理解来解决这个问题。我不明白你怎么能从iOS端把所有东西都放进去,然后从PHP端捡起来

我希望所有这些都足够清楚,提前谢谢

编辑:

我尝试将数组作为字符串通过URL传递,然后将其分解,幸运的是它成功了…但我刚刚处于URL限制之下,所以我仍然想找出另一个解决方案。至少,现在我知道我的其余代码工作正常。

您似乎对如何填写
$\u POST
变量有一个基本的误解。将文档类型指定为JSON并将JSON字符串作为post正文插入不会自动填充此数组。正文必须采用特定的格式。通常,这意味着url编码对,例如
a=1&b=2&c=2&d=%2fg+y
等。这在一定程度上限制了您可以发送的数据类型。特别是,如果希望任意JSON对象自动显示在$\u POST变量中,则从这个意义上讲,它是不可能的。这里有几个选项:

选项一:不要使用
$\u POST
,而是直接使用POST主体。使用
fopen(“php://input”
并使用PHP JSON解析器解析:

$input = file_get_contents("php://input");
$obj = json_decode($input,true);
$restIDs = $obj['restIDs'];
但是,如果您选择了此路线,则不需要使用名为
restIDs
的字段创建对象。相反,您可以简单地序列化数组并使用
$obj
作为
$restIDs

选项二,假设RESTID中的对象只是字符串,而不是将数据作为JSON对象传入,将正文格式化为PHP使用的格式:

NSMutableString *bodyStr = [NSMutableString string];
for (NSString *restID in restaurants) {
    [bodyStr appendFormat:@"restIDs[]=%@&",[restID stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody: body];

现在,您应该能够像预期的那样使用
$\u POST['restIDs']
访问它。

您传递的数组错误。首先将它放在JSON字符串中,然后没有将JSON字符串放在post变量中,而是作为HTML消息的主体。如果要使用JSON通过POST消息将数据传输到PHP,则需要将其设置为POST变量。然后在PHP中,读取变量并解码json以获得原始变量。下面是我如何做到这一点的一个例子

很抱歉,我最初将Java代码粘贴在这里。这可能更有意义

-(void) setPath: (NSString *) input
{
    Path=input;
}

-(void) run
{
    NSDictionary* jsonDictionary=[NSDictionary dictionaryWithObject: data1 forKey:@"data"];
    NSString* jsonString = [jsonDictionary JSONRepresentation];
    AFHTTPClient *httpClient=[[AFHTTPClient alloc] initWithBaseURL:url];
    NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys:
                           apps,@"app",
                           jsonString,@"smpdata",nil];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params];

    NSURLResponse *response = nil;
    NSError *error = nil;

    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if (error) {
        NSLog(@"Error: %@",error);
    }
    else {
        id JSON = AFJSONDecode(data, &error);
        NSArray *dataarray=[JSON valueForKey:@"Data"];
        status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]];
        NSLog(@"%@",status);
        returndata= dataarray;

    }
}

-(NSArray *) returndata {
    return returndata;
}

-(NSString *) status {
    return status;
}

@end
PHP



您使用的是php框架吗?您的代码包含一个。你在使用mysqli,为什么不使用预处理语句?嗨,Charles,是的,我的代码确实包含SQL注入漏洞,但你所说的预处理语句是什么意思?嗨,Ed,我尝试了第二个选项,但没有完全理解如何实现它,因为在另一方面没有任何结果。如何将bodyStr构造成$u POST内的数组?另外,对于第一个选项,我保留了我的问题的所有内容,并将您的三行代码添加到我的PHP代码中,然后echo'd$obj['restIDs']和$obj,结果什么也没有出现。我可能做错了什么?我的帖子在iOS端设置错误吗?从我所看到的,一切看起来都是对的。除此之外,php脚本的顶部有一个echo语句,当您试图在iOS端将其解析为JSON时,它会破坏您的输出。我建议在Objective-C代码中使用大量的
NSLog
语句,并在php端使用大量的
var\u dump
语句来跟踪情况。特别是,请尝试
var\u dump(file\u get\u contents(“php://input"));<?
$jsondata=$_POST['smpdata'];
$data = json_decode($jsondata);
?>