php - 每次我尝试使用 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”的输出。非常感谢任何可以提供帮助的人。
解决方案
您应该使用参数化查询来防止 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();