Не удается подключить приложение Swift к MySQL

Я разрабатываю приложение для iOS с использованием Swift 2. Я хочу, чтобы информация для входа в систему (имя пользователя и пароль) была сохранена в онлайн-базе данных MySQL, которая находится на простом VPS-сервере.
Это класс для регистрации:

import UIKit

class RegisterPageViewController: UIViewController {

@IBOutlet weak var userEmailTextField: UITextField!
@IBOutlet weak var userPasswordTextField: UITextField!
@IBOutlet weak var repeatPasswordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

@IBAction func registerButtonTapped(sender: AnyObject) {

let userEmail = userEmailTextField.text
let userPassword = userPasswordTextField.text
let userRepeatPassword = repeatPasswordTextField.text

//Check for empty fields
if(userEmail!.isEmpty || userPassword!.isEmpty || userRepeatPassword!.isEmpty) {

//Display alert message
displayMyAlertMessage("Todos los campos son requeridos")
return
}
//Check if password match
if(userPassword != userRepeatPassword) {
//Display an alert message
displayMyAlertMessage("Passwords no coinciden")
return
}

//Send user data to server side
let myURL = NSURL(string: "https://gastonberenstein.com/pruebasmysql/userRegister.php")
let request = NSMutableURLRequest(URL: myURL!)
request.HTTPMethod = "POST"
let postString = "email=\(userEmail)&password=\(userPassword)"request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in

if error != nil {
print("error=\(error)")
}

do {
var json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

if let parseJSON = json {
var resultValue = parseJSON["status"] as! String!
print("result: \(resultValue)")

var isUserRegistered:Bool = false
if(resultValue == "Success") {
isUserRegistered = true
}

var messageToDisplay:String = parseJSON["message"] as! String
if(!isUserRegistered) {
messageToDisplay = parseJSON["message"] as! String
}

dispatch_async(dispatch_get_main_queue(), {

//Display alert message with confirmation
var myAlert = UIAlertController(title: "Alert", message: messageToDisplay, preferredStyle: UIAlertControllerStyle.Alert)

let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default){ action in
self.dismissViewControllerAnimated(true, completion: nil)
}
myAlert.addAction(okAction)
self.presentViewController(myAlert, animated: true, completion: nil)
})
}
} catch {
print(error)
}
}
task.resume()
}

func displayMyAlertMessage(userMessage:String) {
var myAlert = UIAlertController(title:"Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.Alert)

let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)
myAlert.addAction(okAction)

self.presentViewController(myAlert, animated: true, completion: nil)
}

}

Conn.php:

<?php
class Conn {
public static $dbhost = "166.62.92.31";
//public static $dbhost = "localhost"public static $dbuser = "gastonbe_gaston";
public static $dbpass = "xxx";
public static $dbname = "gastonbe_pruebasmysql";
}
?>

MySQLDao.php:

<?php
class MySQLDao {
var $dbhost = null;
var $dbuser = null;
var $dbpass = null;
var $conn = null;
var $dbname = null;
var $result = null;

function __construct() {
$this->dbhost = Conn::$dbhost;
$this->dbuser = Conn::$dbuser;
$this->dbpass = Conn::$dbpass;
$this->dbname = Conn::$dbname;
}

public function openConnection() {
$this->conn = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
if (mysqli_connect_errno())
echo new Exception("No se pudo establecer la conexion a la base de datos");
}

public function getConnection() {
return $this->conn;
}

public function closeConnection() {
if ($this->conn != null)
$this->conn->close();
}

public function getUserDetails($email) {
$returnValue = array();
$sql = "select * from users where user_email='" . $email . "'";
$result = $this->conn->query($sql);
if ($result != null && (mysqli_num_rows($result) >= 1)) {
$row = $result.fetch_array(MYSQLI_ASSOC);
if (!empty($row)) {
$returnValue = $row;
}
}
return $returnValue;
}

public function getUserDetailsWithPassword($email, $userPassword) {
$returnValue = array();
$sql = "select id, user_email from users where user_email='" . $email . "' and user_password='" .$userPassword . "'";
$result = $this->conn->query($sql);
if ($result != null && (mysqli_num_rows($result) >=1)) {
$row = $result->fetch_array(MYSQLI_ASSOC);
if (!empty($row)) {
$returnValue = $row;
}
}
return $returnValue;
}

public function registerUser($email, $password) {
$sql = "insert into users set user_email=?, user_password=?";
$statement = $this->conn->prepare($sql);
if (!$statement)
throw new Exception($statement->error);
$statement->bind_param("ss", $email, $password);
$returnValue = $statement->execute();
return $returnValue;
}
}
?>

registerUser.php:

    <?php
require("Conn.php");
require("MySQLDao.php");

$email = htmlentities($_POST["email"]);
$password = htmlentities($_POST["password"]);

$returnValue = array();

if(empty($email) || empty($password)) {
$returnValue["status"] = "error";
$returnValue["message"] = "Falta un campo requerido";
echo json_encode($returnValue);
return;
}

$dao = new MySQLDao();
$dao->openConnection();
$userDetails = $dao->getUserDetails($email);

if(!empty($userDetails)) {
$returnValue["status"] = "error";
$returnValue["message"] = "El usuario ya existe";
echo json_encode($returnValue);
return;
}

$secure_password = md5($password);

$result = $dao->registerUser($email,$secure_password);

if($result) {
$returnValue["status"] = "Success";
$returnValue["message"] = "Usuario registrado";
echo json_encode($returnValue);
return;
}

$dao->closeConnection();

?>

Когда я запускаю / отлаживаю приложение в XCode, я ввожу имя пользователя и регистрацию в соответствующие поля и в строке 56, где я ставлю точку останова:

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {...

Консоль выдает эту ошибку:
2015-11-19 14: 02: 16.932 userLoginAndRegistration [17265: 6170848] Ошибка загрузки NSURLSession / NSURLConnection HTTP (kCFStreamErrorDomainSSL, -9813)

Любая помощь? большое спасибо!
Если я забыл добавить информацию, пожалуйста, дайте мне знать.

1

Решение

У меня было две ошибки:

  1. URL-адрес файла PHP должен начинаться с «http» вместо «https».
  2. Я не установил MySQLi на сервер VPS (находится здесь: Неустранимая ошибка: класс «MySQLi» не найден).
    После этого все заработало!
    Спасибо Мэтт за твой совет, он мне помог.
0

Другие решения

Вы создаете свое почтовое тело с помощью:

let userEmail = userEmailTextField.text
let userPassword = userPasswordTextField.text

let postString = "email=\(userEmail)&password=\(userPassword)"

Но userEmail а также userPassword являются опциональными (потому что text это необязательно). Вы должны изучить это postString и убедитесь, что это то, что вы хотели, потому что я считаю, что вы хотели сделать:

let userEmail = userEmailTextField.text!
let userPassword = userPasswordTextField.text!

или же

let userEmail = userEmailTextField.text ?? ""let userPassword = userPasswordTextField.text ?? ""

Честно говоря, вы также должны избегать этих процентов (например, что если пароль содержит & или другой зарезервированный символ в нем?). Например, в Swift 2:

extension String {

/// Percent escape value to be added to a HTTP request
///
/// This percent-escapes all characters besize the alphanumeric character set and "-", ".", "_", and "*".
/// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec:
///
/// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
///
/// - returns: Return percent escaped string.

func stringByAddingPercentEncodingForFormUrlencoded() -> String? {
let allowedCharacters = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._* ")

return stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters)?.stringByReplacingOccurrencesOfString(" ", withString: "+")
}
}

А потом:

let userEmail = userEmailTextField.text!.stringByAddingPercentEncodingForFormUrlencoded()
let userPassword = userPasswordTextField.text!.stringByAddingPercentEncodingForFormUrlencoded()

Или, если Swift 3:

extension String {

/// Percent escape value to be added to a HTTP request
///
/// This percent-escapes all characters besize the alphanumeric character set and "-", ".", "_", and "*".
/// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec:
///
/// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
///
/// - returns: Return percent escaped string.

func addingPercentEncodingForFormUrlencoded() -> String? {
let allowedCharacters = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._* ")

return addingPercentEncoding(withAllowedCharacters: allowedCharacters)?.replacingOccurrences(of: " ", with: "+")
}
}

А также

let userEmail = userEmailTextField.text!.addingPercentEncodingForFormUrlencoded()
let userPassword = userPasswordTextField.text!.addingPercentEncodingForFormUrlencoded()
0

По вопросам рекламы [email protected]