【问题标题】:Trying to insert data from Swift into a MySQLi database using POST request via php尝试通过 php 使用 POST 请求将数据从 Swift 插入 MySQLi 数据库
【发布时间】: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


【解决方案1】:

您没有在 PHP 代码中执行您的查询,请尝试像这样编辑您的代码:

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$connection = new mysqli("localhost", "knockyou_seb", "*******", "knockyou_classroomGrades");

$id = $_POST['id'] ?? 13;
$firstName = $_POST['firstName'] ?? 'Test';
$lastName = $_POST['lastName'] ?? 'McTest';
$subject = $_POST['subject'] ?? 'Test Subject';
$grade = $_POST['grade'] ?? 5;

$sql = $connection->prepare("INSERT INTO Students (id, first_name, last_name, subject, grade) VALUES (?, ?, ?, ?, ?)");
$sql->bind_param("isssi", $id, $firstName, $lastName, $subject, $grade);
$sql->execute();
$sql->close();

$connection->close();

【讨论】:

  • 嘿,谢谢你找我。我已将该代码添加到 .PHP 文件中!我仍然没有得到任何返回值。 .php 中没有回显,也没有 error_log 消息。我的调试器在 swift 中仍然没有什么不同的响应。我来自 swift 的数据尚未通过(我认为我的主要问题在于我的 POST 请求),但也没有输入来自 nil-coalescing 运算符的替代数据。
  • 我收回最后的评论!我认为错误是在所述目录中有重复的 .php 文件!我已经更正了这个问题并更新了我的代码,它现在可以在我的 Swift 代码中运行,谢谢!
【解决方案2】:

注意两点:

  1. 在 Swift 中构建 application/x-www-form-urlencoded 请求时,您必须对值进行百分比编码。例如。 https://stackoverflow.com/a/41092318/1271826。如果您发送带有未转义的保留字符的发布请求(例如,如果“主题”中有空格),它将失败。

  2. 不要只在 SQL 语句中插入值。您应该将值绑定到 ? 占位符。见https://stackoverflow.com/a/59298729/1271826。如果插入带有' 字符的值,您的服务器代码将失败。另外,您正在向 SQL 注入攻击敞开大门。

【讨论】:

猜你喜欢
  • 2013-08-24
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多