Каждый раз, когда я пытаюсь отправить данные в базу данных MySQL с помощью Swift и Alamofire, данные отображаются нулевыми? - PullRequest
0 голосов
/ 07 июня 2018
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 {



    }
}

Выше мой метод Swift, который вызывает скрипт PHP, который я прикреплю ниже.Я считаю, что проблема заключается в моем 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, если вставка сработала, неожиданно работает.Но опять же, проблема заключается в том, что обновленные данные никогда не появляются в базе данных.Я знаю, что это обновление, потому что есть еще одна строка в таблице, но фактические значения никогда не присутствуют.Я также получил ошибку Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength при использовании .responseJSON, но когда я изменил его на .responseString, я получу вывод «SUCCESS».Большое спасибо всем, кто может помочь.

1 Ответ

0 голосов
/ 07 июня 2018

Вы должны использовать параметризованные запросы для предотвращения внедрения 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();
...