我正在尝试使用 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!