Swift 2 php mysql注册问题

时间:2016-04-25 10:29:49

标签: php mysql xcode swift

我在Xcode中使用Swift编程相当新,所以我最近关注了位于http://swiftdeveloperblog.com/store-user-information-in-mysql-database/的Sergey Kargopolov的精彩php sql注册教程。

不幸的是,该教程略显过时,需要针对Swift 2.0进行更新。我设法通过实现do / catch语句来替换有问题的代码,这似乎很有效,除非我收到来自服务器端php脚本的响应,我似乎无法根据结果导航到不同的视图控制器。例如,如果响应是"注册成功"用户被定向到受保护的页面,但是如果数据库中已经存在电子邮件地址,我希望它保持在同一页面上。

目前我的代码工作到警报出现的位置(用户已经存在或成功)但是当用户点击"确定"时,无论结果如何,都会将它们定向到受保护的页面。我想这将是一个简单的例子,告诉它根据这个结果进入下一个视图" if"语句:

    if (resultValue == "Success") {

    isUserRegistered = true 

    let next = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedViewController") as! ProtectedViewController
    self.presentViewController(next, animated: true, completion: nil)
    }

但它似乎不起作用。希望我能做的事情很有意义,非常感谢任何帮助。

这是我的代码:

                let myUrl = NSURL(string: "http://localhost/PhpProject1/scripts/registerUser.php")
                let request = NSMutableURLRequest(URL: myUrl!)
                request.HTTPMethod = "POST"

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

                request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);

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

                    data, response, error in

                    if error != nil {

                        print("error=\(error)")

                        return

                    }

                    do {

                        let 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(), {

                                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)
                                let next = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedViewController") as! ProtectedViewController
                                self.presentViewController(next, animated: true, completion: nil)

                                }

                                myAlert.addAction(okAction)

                                }

                            )}

                    } catch { print(error)}

                }

                task.resume()

            }

            func displayAlertMessage(userMessage:String) {

                let 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)

            }
        }

我还应该补充一点,当用户注册成功时,我得到"结果:200"在输出窗口中但是当用户电子邮件已经存在时,我得到"结果:400"。我只是不知道如何利用这一点。

提前致谢!

2 个答案:

答案 0 :(得分:0)

从我从JSON响应中可以看到,parseJSON["status"]是HTTP statusCode,它是一个数字状态代码。 200是成功,400是坏请求,404是未找到,500是错误。

您可以从字典中读取消息,也可以根据PHP代码的工作方式将状态转换为整数,并且只有在状态为200时才会生效。对于任何其他状态代码,您可能希望显示消息给用户。

这取决于您是否故意根据结果返回状态代码,例如状态代码401为un-authorised

正确使用状态代码比比较字符串更可靠。

编辑:

import Foundation

let jsonData = "{ \"message\": \"Successfully registered new user\", \"status\": 200, \"userEmail\": \"abc\", \"userFirstName\": \"a\", \"userId\": 22, \"userLastName\": \"a\" }".dataUsingEncoding(NSUTF8StringEncoding)

do {

    let json = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: .MutableContainers) as? NSDictionary

    if let parseJSON = json {
        let statusCode = parseJSON["status"] as! Int

        switch statusCode {
        case 200:
            print("successfully logged in")
        case 400, 401:
            print("access denied")
        default:
            print("error occurred")
        }
    }
}

上面,我添加了一个如何在Swift中处理此问题的示例,您只需根据要处理的statusCodes以及如何更改行为

答案 1 :(得分:0)

嗯,我熬了一会儿,多亏了你的脚本,我能够弄清楚。

基本上我所做的只是创建一个新变量:

var statuscheck: Int!

然后在“if let parseJSON = json {”语句之后我将“status”作为Int转换为:

self.statuscheck = (parseJSON["status"]! as! NSString).integerValue

然后在“dispatch_async(dispatch_get_main_queue()”下面的行之后:

let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default) { action in

我做了检查:

if (self.statuscheck == 200) {
     let next = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedViewController") as! ProtectedViewController
     self.presentViewController(next, animated: true, completion: nil)
}

现在看起来效果很好。

再次感谢您的所有帮助脚本。你的确指出了我正确的方向!