【发布时间】:2021-03-15 16:50:13
【问题描述】:
首先,我目前仍在学习 Swift,只是想尝试从我的应用程序中将数据发送到某种后端。 不确定是否重要,但如果重要:
- 我正在使用 fast comet 作为 Web 服务器和 SQL 中的 PHPMyAdmin 数据库。 (努力想清楚,可能会说错,提前道歉!)
根据我所能收集到的信息(请说明我是否把它倒过来),数据库上的执行是用 SQL 编写的,我已将其包含在我的应用程序的 fetch 请求中(成功运行)。 PHP文件充当了打开数据库和我端之间的连接的桥梁。
我已经尝试(半成功)3 天来快速编写一个 POST 请求,该请求将从我的应用程序发送数据并将其插入到我的数据库中。当我说半成功时,我的意思是当从应用程序触发我的 swift 代码中的惰性方法时,数据确实会插入到数据库中,但它是 nil-coalescing 运算符另一侧的数据,而不是我的数据。这让我相信我的 .PHP 文件一切都(几乎)没问题,或者我的 swift 代码有问题,或者我没有在数据库本身中正确设置一些东西?
具有名为“Students”的表的数据库 - 由 5 个字段组成:
-
id:INT -
first_name:文字 -
last_name:文字 -
subject:文字 -
grade:INT
swift - 我要插入数据库的内容:
-
id: 诠释 -
firstName:字符串 -
lastName:字符串 -
subject:字符串 -
grade: 诠释
快速代码:
func postRequest(id: Int, firstName: String, lastName: String, subject: String, grade: Int, completion: @escaping (Error?) -> ()) {
let insertGradesURL = URL(string: "http://kysodev.com/classroomGrades/insertClassroomGrades.php")!
var urlRequest = URLRequest(url: insertGradesURL)
urlRequest.httpMethod = "POST"
let postString = "id=\(id)&firstName=\(firstName)&lastName=\(lastName)&subject=\(subject)&grade=\(grade)"
urlRequest.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
if error != nil {
print("error = \(error)")
return
}
print("response - \(response)")
let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print("response string - \(responseString)")
}
task.resume()
}
我没有从这里返回任何错误,但调试器中的响应:
response - Optional(<NSHTTPURLResponse: 0x280526f80> { URL: http://kysodev.com/classroomGrades/insertClassroomGrades.php } { Status Code: 200, Headers {
Connection = (
"Upgrade, Keep-Alive"
);
"Content-Encoding" = (
gzip
);
"Content-Type" = (
"text/html; charset=UTF-8"
);
Date = (
"Mon, 15 Mar 2021 16:37:33 GMT"
);
"Keep-Alive" = (
"timeout=5, max=100"
);
Server = (
Apache
);
"Transfer-Encoding" = (
Identity
);
Upgrade = (
"h2,h2c"
);
Vary = (
"Accept-Encoding"
);
"X-Powered-By" = (
"PHP/7.2.34"
);
}})
插入ClassroomGrades.php 文件:
<?php
$connection=mysqli_connect("localhost","knockyou_seb","*******","knockyou_classroomGrades");
if ($connection->connect_error) {
error_log ("not connected to db");
die("Connection failed: " . $conn->connect_error);
} else {
$id = $_POST['id'] ?? 13;
$firstName = $_POST['firstName'] ?? 'Test';
$lastName = $_POST['lastName'] ?? 'McTest';
$subject = $_POST['subject'] ?? 'Test Subject';
$grade = $_POST['grade'] ?? 5;
$sql = "INSERT INTO Students (id, first_name, last_name, subject, grade) VALUES ('".$id."','".$firstName."','".$lastName."','".$subject."','".$grade."');";
}
mysqli_close($connection);
?>
以前的 php 允许我使用示例学生 Test McTest 更新数据库,唉,现在也无法正常工作,我不确定我是否有某种超时问题,如果有,如何解决或者如果它是我的快速代码,或者只是所有内容的混合!
我已确保不会将重复的 id 字段值提交到数据库中,因为我已将该字段设置为唯一。我还尝试更改我的 swift 代码,以便将 postString 作为字符串值发送,但也没有解决它。
如果有人能指出我正确的方向,我将不胜感激,谢谢。
【问题讨论】:
-
澄清一下,你必须(a)百分比逃避你的 Swift 网络请求; (b) 将值绑定到 PHP MySQL 代码中的
?占位符。 “不要逃避”警告是说不要依赖real_escape_string,但你绝对确实需要百分比逃避网络请求。
标签: php swift post mysqli request