2016-01-30 75 views
0

我在swift應用程序中遇到問題,每當我註冊一個新用戶登錄到我的系統時,該字符串被解析爲不同的東西例如,將用戶名存儲爲see data entryphp在mysql中存儲數據爲可選(" a ")而不是普通字符串

我不知道爲什麼它這樣做。這是我在Xcode SWIFT代碼:

let myURL = NSURL(string: "http://localhost:8888/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)") 
     return 
     } 


     do{ 

     let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary 
      if let parseJSON = json{ 
      let 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(), { 
        let 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(); 

我的PHP文件(userRegister.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"] = "Missing required field"; 
echo json_encode($returnValue); 
return; 
} 

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

if(!empty($userDetails)) 
{ 
$returnValue["status"] = "error"; 
$returnValue["message"] = "User already exists"; 
echo json_encode($returnValue); 
return; 
} 

$secure_password = md5($password); // I do this, so that user password cannot  be read even by me 

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

if($result) 
    { 
    $returnValue["status"] = "Success"; 
    $returnValue["message"] = "User is registered"; 
    echo json_encode($returnValue); 
    return; 
    } 

$dao->closeConnection(); 

?> 

最後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("Could not establish connection with database"); 
} 

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 username='" . $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,username from users where username='" . $email . "' and  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 username=?, password=?"; 
$statement = $this->conn->prepare($sql); 

if (!$statement) 
throw new Exception($statement->error); 

$statement->bind_param(ss, $email, $password); 
$returnValue = $statement->execute(); 

return $returnValue; 
} 

} 
?> 

謝謝

+0

看起來你的電子郵件和密碼字段是可選的,你應該在發佈之前將它們插入到字符串中時將它們解開包裝 – pbush25

+0

輸出的$ _POST [「email」]是什麼?爲什麼要將電子郵件和密碼實體化(密碼應該散列)? – chris85

+0

我看不到我的字段是可選的。你可以指出:pbush25 – user3423164

回答

0

這是我的工作代碼之前和之後。剛剛打開可選變量。

前:

let postString = "email=\(email)&password=\(password)&phone=\ (phone)&name=\(name)" 

例如名稱保存這樣的:Optional("Wissa")

後:

let postString = "email=\(email!)&password=\(password!)&phone=\ (phone!)&name=\(name!)" 

這樣,它與我的工作非常出色。