最近在做學校專題,目前正在製作登入的頁面,目前遇到的問題是swift連接php 無論輸入正確或錯誤的帳號或密碼 都會接收到Account does not exists的回覆,想請問我的php或swift是哪裡出了問題了嗎? 先謝謝大家的回覆
<?php
$servername = "XXX";
$username = "XXX";
$password = "XXX";
$dbname = "XXX";
$loginAccount = @$_POST["loginAccount"];
$loginPass = @$_POST["loginPass"];
$conn = new mysqli($servername, $username, $password, $dbname);
if($conn->connect_error){
die("Connection Failed:" . $conn->connect_error);
}
$sql = "SELECT * FROM member_list WHERE Account = '".$loginAccount."' " ;
$result = $conn->query($sql);
if ($result->num_rows > 0){
while($row = $result->fetch_assoc()){
if($row["Pass"] == $loginPass){
echo "Login Success.";
}
else{
echo "Wrong Password or Account.";
}
}
}
else {
echo "Account does not exists" ;
}
$conn->close();
?>
以下是swift
@IBAction func LoginButton(_ sender: Any) {
let userAccount = userAccountTextField.text!
let userPassword = userPasswordTextField.text!
if (userAccount.isEmpty)==true {
let controller = UIAlertController(title: "", message: "請輸入帳號", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
controller.addAction(okAction)
present(controller, animated: true, completion: nil)
}
if (userPassword.isEmpty)==true {
let controller = UIAlertController(title: "", message: "請輸入密碼", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
controller.addAction(okAction)
present(controller, animated: true, completion: nil)
}
let myUrl = NSURL(string: "http://************.php")
let request = NSMutableURLRequest(url : myUrl! as URL);
request.httpMethod = "POST";
let postString = "loginAccount\(userAccount)&loginPass=\(userPassword)"
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request as URLRequest){
data , response , error in
if error != nil {
print("error=\(String(describing: error))")
return
}
print("response =\(postString) ")
let responseString = NSString(data: data!,encoding: String.Encoding.utf8.rawValue)
//print("loginAccount=\(postString)")
print("responseString =\(responseString) ")
}
task.resume()
}
}
1.先確定 php 沒問題,方式如下
$loginAccount = @$_POST["loginAccount"];
$loginPass = @$_POST["loginPass"];
改成
$loginAccount = "realaccount"; //資料庫裡實際的 account
$loginPass = "realpassword"; //資料庫裡實際的 password
試試看
如果不成功
就想辦法把 $result = $conn->query($sql); 裡的 $sql 顯示出來看看
2.修改 Swift 這段試試看
let postString = "loginAccount\(userAccount)&loginPass=\(userPassword)"
改成
let postString = "loginAccount=\(userAccount)&loginPass=\(userPassword)"
如果不成功
也是想辦法顯示 postString 的內容看看
一般建議你先用postman串你的api能正常後。
再開始做api連接的問題。
先分清楚哪邊發生問題會比較好。免得一直再那邊除錯蟲。
浩瀚星空 他回答你的POSTMAN的部份就足以解決你的問題。
但我在意的是其他的地方,尤其是Swift。
(還有的可能是邏輯)
if (userAccount.isEmpty)==true
像上面這個,他回來就已經是 true 或 false的東西不用再讓他比對一次吧。
其次,Swift有很好用的guard機制,沒見你用上。這東西才條件未達成可以直接設else的結果。
然後,我看到了網址:『http:// 』
實在不太建議在測試階段就用http,想個辦法還是弄成https吧。不然上架時你會唉的不要不要的。
再然後……alert的動作你寫二次????
你的code中很大的問題是職責不明確,重複的程式碼沒有提取,多餘的邏輯
再最後一個,算是我的習慣也是建議。
通常如果@IBOutlet的元件能確定型態,就少用「Any」,像你的Button最好就指定為「UIButton」(畢竟Swift是強型別語言,定義好型別其實對Xcode也可以減輕些負擔。)
至於你php的問題…………
我就不提了。
因為通常php只要寫得不好我絕對相信不是學的人的錯。(所以不會是你的錯)