对于我的生活,我似乎无法弄清楚为什么会这样。我们将身体从ios应用程序发送到写入MYSQL服务器的php后端POST API。我们已经将请求主体打印到txt文件,它显然获取了所有数据,但是当我们尝试存储它时,它每次都会失败。如果我们从iOS应用程序发送不包含Base64编码字符串的数据,它会很好地存储到数据库中。我们试图以Longtext格式存储Base64字符串:
<?php
include('db_connect.php');
$http_data = file_get_contents('php://input'); //This is json data
$data = json_decode($http_data);
$b64img1 = $data->img1; //A Base64 Encoded String
$b64img2 = $data->img2; //A Base64 Encoded String
$img1 = $data->img1Title;
$img2 = $data->img2Title;
$cat = $data->category;
$user = $data->userID;
$current = date('Y-m-d H:i:s');
$time = $data->length;
$length = date('Y-m-d H:i:s', time() + $time);
$postID = $current . '_' . $user . '_' . $length;
$loc = mysql_query("SELECT * FROM users WHERE BINARY userID = '$user';");
$row = mysql_fetch_array($loc);
$location = $row['location'];
$numPosts = $row['post_number'];
$posts = $row['postIDs'];
$newNum = $numPosts + 1;
$newPosts = $posts . $postID . ', ';
mysql_query("INSERT INTO `content` (`postID`,`img1`,`img2`,`img1title`,`img2title`,`category`,`user`,`location`,`postUntil`) VALUES ('$postID','$b64img1','$b64img2','$img1','$img2','$cat','$user','$location','$length');");
mysql_query("UPDATE users SET post_number = '$newNum', postIDs = '$newPosts' WHERE BINARY userID = '$user';");
echo "{\"Success\":\"Yes\"}";
mysql_close($con);
exit;
?>
以下是我们用来发送到POST API的iOS代码...
NSData *dataImage = [[NSData alloc] init];
NSData *dataImage2 = [[NSData alloc] init];
UIImage *selectedImage = info[UIImagePickerControllerEditedImage];
dataImage = UIImagePNGRepresentation(selectedImage);
NSString *image = [dataImage base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
dataImage2 = UIImagePNGRepresentation(selectedImage);
NSString *image2 = [dataImage2 base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSDictionary *dictionaryOrArrayToOutput = @{@"img1" : image,
@"img2" : image2,
@"img1title" : titleOne,
@"img2title" : titleTwo,
@"category" : category,
@"userID" : userID,
@"length" : time};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionaryOrArrayToOutput
options:NSJSONWritingPrettyPrinted
error:&error];
if (! jsonData)
{
NSLog(@"Got an error: %@", error);
}
else
{
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonString);
NSData *postData = [jsonString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:SAMPLEURL]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
NSURLResponse *requestResponse;
NSData *requestHandler = [NSURLConnection sendSynchronousRequest:request returningResponse:&requestResponse error:nil];
NSString *requestReply = [[NSString alloc] initWithBytes:[requestHandler bytes] length:[requestHandler length] encoding:NSASCIIStringEncoding];
NSLog(@"REPLY FROM SERVER: %@", requestReply);
}
有人看错了什么,或者能指出我正确的方向吗?这让我疯了,似乎找不到这个原因无法解决的原因。
答案 0 :(得分:0)
有几点想法:
您应暂时回显/打印所有变量值并将其放入响应中,以便确认已成功找到所有内容。并记录SQL。
例如,我注意到一些字段的大小写并不匹配(例如img1Title
与img1title
。
您应该检查SQL调用的结果并报告错误。例如,mysql_query
文档建议:
$result = mysql_query('SELECT * FROM TEST');
if (!$result) {
die('Invalid query: ' . mysql_error());
}
我通常会将错误消息添加到JSON响应中,但您明白了这一点:检查您的返回值。
暂且不说:
您真的应该使用mysqli_query
(或PDO::query
),因为mysql_query
自PHP 5.5起已被弃用。
您确实应该使用mysqli_real_escape_string
引用您的值(或者我更喜欢使用mysqli_stmt_bind_param
绑定列值)。实际上,您的代码容易受到SQL注入攻击。
BTW,当您开始构建响应以在JSON中包含SQL错误时,您可能会发现使用json_encode
而不是自己构建JSON响应更容易(也更强大)。
此外,如果您提供JSON响应,PHP应指定响应的Content-Type
:
header("Content-Type: application/json");
在您的iOS代码中,还有一些风格内容:
您正在实例化dataImage1
和dataImage2
,然后在使用UIImagePNGRepresentation
时丢弃这两个对象。
您不必创建postBody
。你仍然有jsonData
,那么为什么要重新转换已记录的字符串呢?
您不必创建Content-Length
,因为NSURLConnection
会为您做到这一点。
您不应该使用同步网络请求。使用异步再现。