首页 > 解决方案 > 每次我尝试使用 Swift 和 Alamofire 将数据发布到 MySQL 数据库时,数据显示为空?

问题描述

func uploadPostData() {

    let parameters: [String: Any] =
        ["title": "\(titleName!)", // string
        "link": "\(link!)", // string
        "available_shares": sharesNum!, // int
        "risk": riskLevel!, // int
        "description": descriptionView.text!, // string
        "postID": postID, // string
        "price": 0.99,
        "timestamp": 700
        ]
    print(parameters)

    Alamofire.request("example.com", method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: nil)
        .responseJSON() { response in
            switch response.result {



    }
}

以上是我调用 PHP 脚本的 Swift 方法,我将在下面附上。我相信问题出在我的 PHP 上,因为肯定收到了 POST 请求。当调用该方法时,我的数据库实际上会更新,但所有列中的数据都是 null/默认值。我尝试打印出参数字典,但它完全符合预期,没有空值。

    <?php

    $item1 = $_POST['title'];
    $item2 = $_POST['link'];
    $item3 = $_POST['available_shares'];
    $item4 = $_POST['risk'];
    $item5 = $_POST['description'];
    $item6 = $_POST['postID'];
    $item7 = $_POST['price'];
    $item8 = $_POST['timestamp'];

// Create connection
    $mysqli=mysqli_connect("localhost","username","password","database"); 

// Check connection
    if (mysqli_connect_errno())
    {
      echo "
Failed to connect to MySQL: " . mysqli_connect_error();
    }

    $query = "INSERT INTO `TB_POSTS` (postID, timestamp, link, price, title, available_shares, risk, description) VALUES ('".$item6."','.$item8.','".$item2."','".$item7."','".$item1."','".$item3."','".$item4."','".$item5.")";

    $result = mysqli_query($mysqli,$query);

    echo $result; // sends 1 if insert worked
?>

如果插入有效,则输出 1 的底线令人惊讶地有效。但同样,问题似乎是更新的数据实际上从未出现在数据库中。我知道它正在更新,因为表中还有一行,但实际值永远不会出现。我在使用 .responseJSON 时也遇到了 Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength 错误,但是当我将其更改为 .responseString 时,我会得到“SUCCESS”的输出。非常感谢任何可以提供帮助的人。

标签: phpmysqljsonswiftalamofire

解决方案


您应该使用参数化查询来防止 sql 注入。这是一个链接,您应该通读并添加书签,以便快速参考。

https://websitebeaver.com/prepared-statements-in-php-mysqli-to-prevent-sql-injection

我使用参数化查询作为模型更新了您的代码,供您检查。

$item1 = $_POST['title'];
$item2 = $_POST['link'];
$item3 = $_POST['available_shares'];
$item4 = $_POST['risk'];
$item5 = $_POST['description'];
$item6 = $_POST['postID'];
$item7 = $_POST['price'];
$item8 = $_POST['timestamp'];

// Create connection
$mysqli=mysqli_connect("localhost","username","password","database"); 

// Check connection
if (mysqli_connect_errno()){
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$query = "INSERT INTO `TB_POSTS` 

(
  postID, 
  timestamp, 
  link, 
  price, 
  title, 
  available_shares, 
  risk, 
  description 

) VALUES(?, ?, ?, ?, ?, ?, ?, ?)";

$stmt = $mysqli->prepare($query);  //Prepare
$stmt->bind_param("ssssssss", $item6, $item8, $item2, $item7, $item1, $item3, $item4, $item5);  //Bind
$stmt->execute();//Execute
if($stmt->affected_rows === 0) exit('Nothing was inserted.');  //Check to see if it worked
$stmt->close();

推荐阅读