2014-10-31 43 views
0

对于我的生活,我似乎无法弄清楚为什么会发生这种情况。我们从一个iOS应用程序发送正文到一个php后端POST API,写入一个MYSQL服务器。我们已经将请求主体打印到一个txt文件中,并且显然获取了所有数据,但是当我们尝试存储它时,它每次都会失败。如果我们从iOS应用程序发送不包含Base64编码字符串的数据,它会将数据存储到数据库中。我们试图将字符串的Base64存储LONGTEXT格式:POST多个参数到PHP到MYSQL数据库

<?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

把问题解决一点。确保您正确地将JSON发布到服务器,使用Charles Proxy来验证。在收到数据后立即在服务器上记录并在解序列化之后记录,确保在这些点上有正确的数据。然后,如果所有这些都是正确的,请查看MySQL代码。如果仍有问题,请将日志结果添加到问题中。 – zaph 2014-10-31 04:01:25

回答

0

一对夫妇的想法:

  1. 你应该暂时回声/打印所有变量的值,并把它们的响应,因此您可以确认一切都被成功找到。并记录SQL。

    例如,我注意到,一些领域的资本不匹配(如img1Title VS img1title

  2. 您应该检查你的SQL调用的结果和报告错误。例如,mysql_query文档提示:

    $result = mysql_query('SELECT * FROM TEST'); 
    if (!$result) { 
        die('Invalid query: ' . mysql_error()); 
    } 
    

    我通常添加的错误消息的JSON响应,但你的想法:检查返回值

顺便说一句:

  1. 你真的应该使用mysqli_query(或PDO::query)为mysql_query被弃用的PHP 5.5的。

  2. 你真的应该引用你的值mysqli_real_escape_string(或者我喜欢用mysqli_stmt_bind_param绑定列值)。实际上,您的代码容易受到SQL注入攻击。

  3. 顺便说一句,当您开始构建响应以包含JSON中的SQL错误时,您可能会发现使用json_encode更容易(也更稳健),而不是自己构建JSON响应。

  4. 另外,如果你提供JSON响应,PHP应指定响应的Content-Type

    header("Content-Type: application/json"); 
    
  5. 在您的iOS的代码,有一些风格的东西在那里,太:

    • 您正在实例化dataImage1dataImage2,然后在使用UIImagePNGRepresentation时丢弃这两个对象。

    • 您不必创建postBody。您仍然有jsonData,那么为什么再次将已记录的字符串重新转换回来?

    • 您不必创建Content-Length,因为NSURLConnection可以帮助您。

    • 您不应该使用同步网络请求。使用异步呈现。