无法从 iOS 添加条目到 MySQL

Posted

技术标签:

【中文标题】无法从 iOS 添加条目到 MySQL【英文标题】:unable to add entry into MySQL from iOS 【发布时间】:2015-05-10 01:15:05 【问题描述】:

更新

尽管这里有不同的帖子,但我还没有找到在我的 mysql 表中添加条目的解决方案。我从 ios 应用程序发布了一个 json 字典,我想将它输入到数据库中。它由一个带有 4 个字段(名字、姓氏...)的条目组成。下面是服务器端的 php 代码(使用 MAMP 在本地运行):

<?php

DEFINE('DB_USERNAME', 'root');
DEFINE('DB_PASSWORD', 'root');
DEFINE('DB_HOST', 'localhost');
DEFINE('DB_DATABASE', 'syncList');

$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DATABASE);

if (mysqli_connect_error()) 
    die('Connect Error (' . mysqli_connect_errno(). ') ' . mysqli_connect_error());


$body = file_get_contents('php://input');
$jsonArray = json_decode($body);

echo json_encode($jsonArray); // ---> send back for testing.

$firstname = $jsonArray['firstname']; 
$firstname = $mysqli->real_escape_string($firstname);

$lastname = $jsonArray['lastname'];
$lastname = $mysqli->real_escape_string($lastname);

$eds = $jsonArray['eds'];

$dateOfBirth = $jsonArray['dateOfBirth'];

$sql = "INSERT INTO tbl_syncList (firstname, lastname, EDS, dateOfBirth) VALUES ('$firstname', '$lastname', '$eds', '$dateOfBirth')";


if ($mysqli->query($sql) === TRUE) 
    echo "New record created successfully";
 else 
    echo "Error: " . $sql . "<br>" . $mysqli->error;


$mysqli->close();

?>

问题似乎是我的 json_array[key](如 '$firstname')无法识别,因为当我将 json_array 写入文件时,我看到密钥在方括号内,就像它是一个数组一个元素:

stdClass Object
(
    [firstname] => Robert
    [eds] => 1234567
    [lastname] => Redford
    [dateOfBirth] => 12.01.1965
)

这是一个正常的发现还是可以解释为什么我不能在我的 sql 语句中提取值?而且我不能返回一个数组对象而不是一个 stdClass 对象,即使我使用 json_decode($body, TRUE)。

我添加了 obj-C 代码,使用 POST 方法发送我的字典。这是调用上面的php脚本。

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:nil delegateQueue: [NSOperationQueue mainQueue]];

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setValue:@"Robert" forKey:@"firstname"];
[dictionary setValue:@"Redford" forKey:@"lastname"];
[dictionary setValue:@"1234567" forKey:@"eds"];
[dictionary setValue:@"12.01.1965" forKey:@"dateOfBirth"];

NSError *error;

//serialize the dictionary data as json
NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];

NSString *urlString = @"http://192.168.1.106:8888/postPerson.php";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];

[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:data]; //set the data as the post body
[urlRequest addValue:@"postValues" forHTTPHeaderField:@"METHOD"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[urlRequest addValue:[NSString stringWithFormat:@"%d",data.length] forHTTPHeaderField:@"Content-Length"];

NSURLSessionDataTask *dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *dataRaw, NSURLResponse *response, NSError *error) 
    NSDictionary *json = [NSJSONSerialization
                          JSONObjectWithData:dataRaw
                          options:kNilOptions error:&error];

    NSString *result = [NSString stringWithFormat:@"%@", json];

    if (error) 
        UIAlertView * av = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Got error %@.\n", error] message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [av show];
    

    UIAlertView *av = [[UIAlertView alloc] initWithTitle:result message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [av show]; // --> this is to check the array sent with POST-method which is json_encode() in the php script above.

我希望这可能有用...

【问题讨论】:

【参考方案1】:

由于我们处理的是字符串,因此您的 VALUES 中的变量需要被引用:

VALUES ('$firstname', '$lastname', '$eds', '$dateOfBirth')

有关字符串文字的更多信息,请访问:

http://dev.mysql.com/doc/refman/5.1/en/string-literals.html

【讨论】:

感谢您的回复,但不幸的是,这并没有成功。直接传入字符串时我也遇到了同样的问题(比如VALUES('string1','string2'等)。在浏览器中运行脚本但不是从我的应用程序中运行脚本时它似乎工作......我以为是一个 obj-C 错误,但我在我的应用程序中收到 json_encode() 响应,因此脚本也被执行。我快疯了...... 事实上它看起来像来自 php://input 的 $body (表单 POST 方法)是正确的,因为它产生了一个数组,我可以 json_encode() 并返回我的应用程序(我看到了结果在 UIAlertView 中),但这听起来像 sql 语句没有被调用,因为它不工作。但同样,它不仅仅从我的应用程序中调用,因为我可以从浏览器使用默认字符串(VALUES('string1'...)在 mySQL 数据库中添加一个条目。我不知道出了什么问题...... @Trichophyton 不客气。如果您可以发布更多代码并且相对于您刚才所说的内容,它将帮助我或其他跟踪您的问题的人,希望为您提供正确的解决方案。 @Trichophyton 或者,这是您的完整代码吗?我对php://input 和TBH 不太熟悉,我以前从未使用过它。将错误报告添加到您的打开 PHP 标记(例如 &lt;?php error_reporting(E_ALL); ini_set('display_errors', 1);)之后的文件顶部,然后是其余代码,以查看它是否产生任何结果。 我在我的问题中添加了我的 obj-C 代码。 php脚本是完整的代码......它在浏览器中工作,但不是obj-C代码,虽然这个可以返回json......根据php.net, php://input 是一个读取 -仅允许您从请求正文中读取原始数据的流(我引用了它们:-))。

以上是关于无法从 iOS 添加条目到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

java.io.IOException:无法解密安全内容条目:javax.crypto.BadPaddingException:给定最终块未正确填充

我无法从 php 页面将用户添加到 mysql 数据库

无法添加类型为“add”且唯一键属性“name”设置为“aspNetCore”的重复集合条目

无法将图像添加到 iOS 模拟器

MySQL忘记密码无法登录

无法使用 PHP 添加 sqlite 条目