php - 从 Swift 发送 HTTP post 请求到数据库 mysql

标签 php mysql swift

我正在制作一个注册系统(获取用户信息,如姓名、电子邮件),使用 Swift 作为前端,php 作为后端,mysql 作为数据库。 (使用我自己的服务器,而不是本地主机)并尝试从 Swift 发送 HTTP post 请求以将数据插入用户表。(mySQL)。我正在使用安全的 https 网址。

问题是,当我尝试传递数据(名字、姓氏、电子邮件、密码)时,我总是收到错误的请求 (400)“缺少必需的信息”,如屏幕截图,并且无法让用户注册… enter image description here

如果我可以传递数据,我应该会得到成功响应 (200)“注册成功”。 调用了 php 中的函数,所以我假设我的 php 代码没有问题,但 Swift 代码没有问题。

我想知道我无法将数据传递到我的服务器的原因(可能来自 MySQL 设置?)。 提前致谢,祝编码愉快!

我的php文件(文件名:registerUser.php):

<?php

  require("Conn.php");
  require("MySQLDAO.php");

  $returnValue = array();

  if(empty($_REQUEST["userEmail"]) || empty($_REQUEST["userPassword"]) || empty($_REQUEST["userFirstName"]) || empty($_REQUEST["userLastName"]))

  {

    $returnValue["status"]="400";
    $returnValue["message"]="Missing required information";
    echo json_encode($returnValue);
    return;
  }

  $userEmail = htmlentities($_REQUEST["userEmail"]);
  $userPassword = htmlentities($_REQUEST["userPassword"]);
  $userFirstName = htmlentities($_REQUEST["userFirstName"]);
  $userLastName = htmlentities($_REQUEST["userLastName"]);

  //generate secured passowrd 
  $salt = openssl_random_pseudo/bytes(16);
  $secured_password = sha1($userPassword . $salt);

  $dao = new MySQLDAO(Conn::$dbhost, Conn::$dbuser, Conn::$dbpassword, Conn::$dbname);
  $dao->openConnection();

  //check if user with provided username is available 
  $userDetails = $dao->getUserDetails($userEmail);
  if (!empty($userDetails))
  {
    $returnValue["status"]="400";
    $returnValue["message"]="Please choose a different email address";
    echo json_encode($returnValue);
    return; 

  }

  //Register new User 
  $result = $dao->registerUser($userEmail, $userFirstName, $userLastName, $secured_password, $salt);

  if($result){

    $userDetails = $dao->getUserDetails($userEmail);
    $returnValue["status"] = "200";
    $returnValue["message"] = "Registration successful";
    $returnValue["userId"] = $userDetails["user_id"];
    $returnValue["userFirstName"] = $userDetails["first_name"];
    $returnValue["userLastName"] = $userDetails["last_name"];
    $returnValue["userEmail"] = $userDetails["email"];

  } else {
      $returnValue["status"]="400";
      $returnValue["message"]="Couldn't register";

  }

$dao->closeConnection();

echo json_encode($returnValue);

?>

我的 Swift 代码:

 lazy var submitButton: UIButton = {
    let button = UIButton(type: .system)
    button.backgroundColor = UIColor(red:0.09, green:0.51, blue:0.92, alpha:1.0)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.setTitle("Signup", for: .normal)
    button.setTitleColor(.white, for: .normal)
    button.addTarget(self, action: #selector(handleSubmit), for: .touchUpInside)
    return button

}()

func handleSubmit() {
    guard let userFirstName = userFirstNameTextField.text, let userLastName = userLastNameTextField.text, let userEmail = emailTextField.text, let userPassword = passwordTextField.text, let repeatPassword = repeatPasswordTextField.text

        else {
            print("Form is not valid")
            return
    }

    if (userPassword != repeatPassword) {
        self.displayAlertMessage(userMessage: "Passwords do not match")
        return
    }

    if (userFirstName.isEmpty || userLastName.isEmpty || userEmail.isEmpty || userPassword.isEmpty) {

        self.displayAlertMessage(userMessage: "All fields are required")
        return
    }

let myUrl = NSURL(string: "https://my URL name/registerUser.php")
let request = NSMutableURLRequest(url: myUrl! as URL)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

let postString = "userEmail=\(userEmail)&userFirstName=\(userFirstName)&userLastName=\(userLastName)&userPassword=\(userPassword)"

request.httpBody = postString.data(using: String.Encoding.utf8)

let task = URLSession.shared.dataTask(with: request as URLRequest) {(data:Data?, response:URLResponse?, error: Error?) -> Void in

    DispatchQueue.main.async {

        if error != nil {
            self.displayAlertMessage(userMessage: "Error")
            return
        }

        do {

        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

        if let parseJSON = json {
            let userId = parseJSON["userId"] as? String

            if (userId != nil) {

            let myAlert = UIAlertController(title: "Success", message: "Registration Successful", preferredStyle: UIAlertControllerStyle.alert)
            let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
            myAlert.addAction(okAction)
                self.present(myAlert, animated: true, completion: nil)

        } else {

                print(123)
            let errorMessage = parseJSON["message"] as? String
                if (errorMessage  != nil) {

                self.displayAlertMessage(userMessage: errorMessage!)
                }
            }
        }

    } catch {
        print(error)

    }

    }

    }

    task.resume()
}

最佳答案

由于您收到 400 错误“缺少必需的信息”,这不是能够将信息存储在数据库中的问题,而是从 POST 请求(由此行触发)获取值的问题:

if(empty($_REQUEST["userEmail"]) || empty($_REQUEST["userPassword"]) || empty($_REQUEST["userFirstName"]) || empty($_REQUEST["userLastName"] )))

我将从打印出这些值开始。他们中的任何一个出现了吗?只有一个是空的吗?如果它们都是空的,那么问题是您如何从前端发送参数。

关于php - 从 Swift 发送 HTTP post 请求到数据库 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41736625/

相关文章:

php - PDO PHP __construct() 警告?

php - 从存储在另一个类中的实例访问类常量

ios - 使 UIPinchGestureRecognizer 在 imageview 之外工作,就像 Instagram 故事中的贴纸一样

php - 在 PHP 中的类方法中使用命名空间

php - 清理放置在 URL 中的字符串的最佳方法是什么,例如 SO 上的问题名称?

php - 使用 Doctrine 按 FIELD() 排序,这可能吗?

php - PHP 循环中的 SQL 查询

mysql - 如何在一个时间范围内只统计一次记录?

ios - 在另一个 Controller 中从 TableView 编辑 Firebase 数据

ios - Swift:用于 uiimageview 的 UITapGestureRecognizer 在自定义 View 中终止应用程序