2016-04-25 5 views
0

Ich bin ziemlich neu zu programmieren mit Swift in Xcode, so habe ich kürzlich die fantastische php sql Anmeldung Tutorial von Sergey Kargopolov hier http://swiftdeveloperblog.com/store-user-information-in-mysql-database/.Swift 2 PHP mysql Anmeldung Problem

Leider war das Tutorial etwas veraltet und musste für Swift 2.0 aktualisiert werden. Ich habe es geschafft, den problematischen Code durch eine do/catch-Anweisung zu ersetzen, die gut zu funktionieren scheint, außer wenn ich eine Antwort vom serverseitigen php-Skript erhalte, kann ich nicht zu verschiedenen View-Controllern navigieren, basierend auf dem Ergebnis. Wenn die Antwort beispielsweise "Registrierung erfolgreich" lautet, wird der Benutzer zur geschützten Seite weitergeleitet. Wenn die E-Mail-Adresse jedoch bereits in der Datenbank vorhanden ist, möchte ich, dass sie auf derselben Seite bleibt.

Derzeit habe ich den Code arbeiten an dem Punkt, wo die Warnung angezeigt wird (entweder Benutzer bereits vorhanden oder erfolgreich), aber wenn der Benutzer auf "OK" klickt, werden sie auf die geschützte Seite unabhängig von dem Ergebnis geleitet. Ich dachte, es wäre es ein einfacher Fall zu sagen, auf die nächste Ansicht auf das Ergebnis in diesem „if“ Anweisung basiert gehen:

if (resultValue == "Success") { 

    isUserRegistered = true 

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

, aber es scheint nicht zu funktionieren. Hoffentlich macht es Sinn, was ich zu tun versuche und jede Hilfe wird sehr geschätzt.

hier ist mein Code:

   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) 

      } 
     } 

Ich möchte auch hinzufügen, dass, wenn der Benutzer erfolgreich anmeldet, I „Ergebnis: 200“ erhalten im Ausgabefenster, aber wenn der Benutzer E-Mail bereits I „Ergebnis existiert erhalten: 400 ". Ich weiß einfach nicht, wie ich das ausnutzen soll.

Vielen Dank im Voraus!

+0

nach 'wenn lassen Sie parseJSON = json {' könnten Sie 'print (parseJSON)' und aktualisieren Sie die Antwort mit der Ausgabe – Scriptable

+0

{ message = "Erfolgreich neuer Benutzer registriert"; Status = 200; userEmail = abc; userFirstName = a; userId = 22; userLastName = a; } Ergebnis: 200 – Rhys

Antwort

0

Nun, ich bin ein bisschen länger geblieben und dank dir Scriptable konnte ich es herausfinden.

Im Grunde alles, was ich war eine neue Variable erstellt haben:

var statuscheck: Int! 

Und dann nach dem "wenn wir parseJSON = json {" Erklärung warf den "Status" als Int wie folgt aus:

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

Dann nach der Zeile unter dem "dispatch_async (dispatch_get_main_queue()":

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

habe ich das che ck:

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

Das scheint jetzt gut zu funktionieren.

Nochmals vielen Dank für Ihre Hilfe Scriptable. Du hast mich definitiv in die richtige Richtung gelenkt!

0

Von was ich von Ihrer JSON Antwort sehen kann, ist parseJSON["status"] der HTTP statusCode, der ein numerischer Statuscode ist. 200 ist erfolgreich, 400 ist eine schlechte Anfrage, 404 wird nicht gefunden, 500 ist ein Fehler.

Sie könnten stattdessen entweder die Nachricht aus dem Wörterbuch lesen oder je nachdem, wie Ihr PHP-Code funktioniert, können Sie den Status als Integer darstellen und nur dann segue, wenn der Status 200 ist. Für jeden anderen Statuscode möchten Sie wahrscheinlich den Nachricht an den Benutzer.

Dies hängt davon ab, ob Sie absichtlich Statuscodes basierend auf dem Ergebnis zurückgeben, z. B. ein Statuscode 401 ist un-authorised.

Die korrekte Verwendung des Statuscodes wäre wesentlich zuverlässiger als der Vergleich von Strings.

EDIT:

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") 
     } 
    } 
} 

Oben habe ich ein Beispiel hinzugefügt, wie Sie diese in Swift nähern könnte, müssen Sie nur das Verhalten, auf dem je ändern Statuscodes, mit denen Sie beschäftigen möchten und wie

+0

Hallo Scriptable, das ist genau das, was ich tun wollte "je nachdem, wie Ihr PHP-Code funktioniert, könnten Sie den Status als Integer und nur überleiten, wenn der Status 200 ist". Zuvor habe ich versucht, den Statusstring als Ganzzahl in eine andere Variable zu schreiben, aber ich konnte immer noch nicht herausfinden, wo ich dies im Code implementieren sollte, da er scheinbar nichts in einer if-Anweisung zu tun hatte. Ich denke, ich kann sehen, wo ich falsch gelaufen bin, also werde ich es noch einmal versuchen :) – Rhys

+0

Ich habe meine Antwort mit ein paar Beispielcode auf einem Spielplatz, der helfen könnte – Scriptable

+0

Dank Scriptable, werde ich auf jeden Fall das überprüfen, wenn ich eine Chance bekommen. Es wird ziemlich spät, wo ich kurz ins Bett gehe, aber ich schätze deine Hilfe sehr! – Rhys