将多个参数POST到PHP到MYSQL数据库

时间:2014-10-31 03:20:25

标签: php ios mysql post

对于我的生活,我似乎无法弄清楚为什么会这样。我们将身体从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);
}

有人看错了什么,或者能指出我正确的方向吗?这让我疯了,似乎找不到这个原因无法解决的原因。

1 个答案:

答案 0 :(得分:0)

有几点想法:

  1. 您应暂时回显/打印所有变量值并将其放入响应中,以便确认已成功找到所有内容。并记录SQL。

    例如,我注意到一些字段的大小写并不匹配(例如img1Titleimg1title

  2. 您应该检查SQL调用的结果并报告错误。例如,mysql_query文档建议:

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

    我通常会将错误消息添加到JSON响应中,但您明白了这一点:检查您的返回值。

  3. 暂且不说:

    1. 您真的应该使用mysqli_query(或PDO::query),因为mysql_query自PHP 5.5起已被弃用。

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

    3. BTW,当您开始构建响应以在JSON中包含SQL错误时,您可能会发现使用json_encode而不是自己构建JSON响应更容易(也更强大)。

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

      header("Content-Type: application/json");
      
    5. 在您的iOS代码中,还有一些风格内容:

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

      • 您不必创建postBody。你仍然有jsonData,那么为什么要重新转换已记录的字符串呢?

      • 您不必创建Content-Length,因为NSURLConnection会为您做到这一点。

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