使用iOS中的POST将数组传递给PHP
所以我看过无数类似的问题,但没有一个能完全回答我的问题,希望你们能帮我解决 我需要使用POST或其他方式将restaurantID的数组从iOS传递到一个PHP文件。我知道ASIHTTPRequest,但我正在寻找内置的东西,它已经被开发人员放弃了。最后,我不想通过URL传递它们,因为我不知道会有多少条目 这就是我到目前为止得到的使用iOS中的POST将数组传递给PHP,php,ios,post,Php,Ios,Post,所以我看过无数类似的问题,但没有一个能完全回答我的问题,希望你们能帮我解决 我需要使用POST或其他方式将restaurantID的数组从iOS传递到一个PHP文件。我知道ASIHTTPRequest,但我正在寻找内置的东西,它已经被开发人员放弃了。最后,我不想通过URL传递它们,因为我不知道会有多少条目 这就是我到目前为止得到的 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLW
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"));好的,我找到罪犯后会发回的,谢谢!嗨,Codeguy,这种方法的问题是,我不知道提前会有多少变量,所以名称/值对不会起作用。有没有一种方法可以将json解码成一个可以迭代的数组?我该怎么做?另外,您提到我错误地传递了JSON数据。如何将其作为post变量传递?那么我如何在PHP端获取它呢?谢谢。我们使用数组处理了这个问题。数组可以包含与变量数量相同的行。有时我们只是将变量放入csv字符串中,并在JSON字符串中传递。数组或csv字符串都没有定义行或列,因此它们可以是可变的。可能有更好的方法,但传递csv字符串早在使用JSON之前就决定了。
<?
$jsondata=$_POST['smpdata'];
$data = json_decode($jsondata);
?>