错误域=NSCocoa错误域代码=3840 比较两个值时为“无值”.PHP,JSON和Swift


Error Domain=NSCocoaErrorDomain Code=3840 "No value." when comparing two values. PHP, JSON and Swift

我正在尝试使用 swift 将信息从 mysql 数据库获取到应用程序中。我的问题是,我想,每当我将(使用 if 状态)值与数据库中的值进行比较时,我都会收到错误消息:

Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value.}
这也是我仅使用如下所示的

if状态比较值的时候(例如,我稍后将发布整个代码):

$input = $_POST["inputFromUser"];
$resultValue = array();
if($input = "value"){
$resultValue["status"] = "Correct";
echo json_encode($resultValue);
}else{
$resultValue["status"] = "The input do not match";
echo json_encode($resultValue);
}

我的结论是,每当 php 代码比较它所做的事情的值时,我不知道。因为当我刚刚收到帖子并将该值发回时,例如:

$input = $_POST["inputFromUser"];
$resultValue = array();
$resultValue["status"] = $input;
echo json_encode($resultValue);

它会发回我发送到服务器的相同输入。

这是我的代码,包括 Swift 和 php。

迅速:

import UIKit
class loginView: UIViewController {
    @IBOutlet weak var userUsernameTextField: UITextField!
    @IBOutlet weak var userPasswordTextField: 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 loginButtonClicked(sender: AnyObject) {
        let userUsername = userUsernameTextField.text
        let userPassword = userPasswordTextField.text
        if(userUsername!.isEmpty || userPassword!.isEmpty){
            displayAlertMessage("All fields are required!")
            return;
        }
        let hiURL = NSURL(string: "http://testdomaincom/AppLogin/login.php")
        let request = NSMutableURLRequest(URL: hiURL!)
        request.HTTPMethod = "POST"
        let postString = "username='(userUsername)&password='(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 {
                let resultValue:String = parseJSON["status"] as! String!
                print("result: '(resultValue)")
                if(resultValue=="Success") {
                    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isUserLoggedIn")
                    NSUserDefaults.standardUserDefaults().synchronize()
                    self.dismissViewControllerAnimated(true, completion: nil)
                }
            }
            }catch{
                print(error)
            }
        }
        task.resume()
    }
    func displayAlertMessage(userMessage:String) {
        let alert = UIAlertController(title: "Alert!", message: userMessage, preferredStyle: UIAlertControllerStyle.Alert)
        let okAction = UIAlertAction(title: "Ok!", style: UIAlertActionStyle.Default, handler:nil)
        alert.addAction(okAction)
        self.presentViewController(alert, animated: true, completion: nil)
    }
}

.PHP:

//$user = "1";
//$pass = "2";
$user = $_POST["username"];
$pass = $_POST["password"];

我知道这不是连接到 mysql 的最佳方式,但现在当我测试这些东西时,它会这样做。 $servername = "服务器"; $username = "用户名"; $password = "密码"; $dbname = '数据库';

    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die('Connection failed: ' . $conn->connect_error);
    }
$sql = "SELECT * FROM AppLogin WHERE Username = '".$user."' AND Password = '".$pass."' ";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    $resultValue["status"] = "Yeah!";
    echo json_encode($resultValue);
}else{
    $resultValue["status"] = "No!";
    echo json_encode($resultValue);
?>

我不知道是什么导致了这个问题,也许是 swift 代码(取自教程,Json 新手)或 php。

阿尔宾。

我的猜测是,您将用户名和密码值作为可选的 a 提交,因为当您获得值时您不会解开它们。因此,在获取用户名和密码时设置断点,并确保它们不是可选的,因为 swift 会将可选变量传递给 php,这将导致像这样看似无害的错误。

为清楚起见,编辑:

由于你似乎对 Optionals 一无所知,我推荐 Swift 编程指南来尝试并至少对它们有一个基本的了解,因为它们对 Swift 的任何开发都至关重要。可选意味着在访问变量时不能保证该值会存在,因此在具有可选值的情况下,您必须检查它们以查看它们是否存在,如果存在,那么您可以安全地解包它们。因此,在您的情况下,文本字段中的文本始终可以解开包装,因为 API 保证它不会为 nil,并且至少是一个空字符串。因此,在这些行中,您只剩下可选变量:

let userUsername = userUsernameTextField.text
let userPassword = userPasswordTextField.text

如果要选择单击Xcode中的变量名称,则其类型将String?,因为您尚未解开包装。在这种情况下,当您将其传递给PHP服务时,传递的值实际上是username=Optional("TheUsername")&password=Optional("ThePassword")这就是为什么您没有从数据库中返回任何内容的原因。因此,为了获得非可选值,您必须使用 ! 运算符强制解包可选值。所以它会是,

let userUsername = userUsernameTextField.text!
let userPassword = userPasswordTextField.text!