2017-11-14 23 views
0

は、ユーザーを登録するための私の迅速である:ここではスウィフト/ MySQLの/ PHPの必須パラメータの欠落 'エラー

//Information fields 
@IBOutlet weak var user: UITextField! 
@IBOutlet weak var pass: UITextField! 
@IBOutlet weak var pass2: UITextField! 
@IBOutlet weak var name: UITextField! 
@IBOutlet weak var email: UITextField! 
@IBOutlet weak var Message: UILabel! 


//Register button 
@IBAction func register(_ sender: Any) { 

    let Parameters = ["username": user.text, "password": pass.text, "email": email.text, "name": name.text] 

    let url = URL(string: "http://cgi.soic.indiana.edu/~lvweiss/prof4/register.php")! 

    let session = URLSession.shared 

    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 

    do { 
     request.httpBody = try JSONSerialization.data(withJSONObject: Parameters, options: .prettyPrinted) 
    } catch let error { 
     print(error.localizedDescription) 
     Message.text = String(error.localizedDescription) 
    } 

    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in 

     guard error == nil else { 
      return 
     } 

     guard let data = data else { 
      return 
     } 

     do { 
      if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { 
       print(json) 
       } 
     } catch let error { 
      print(error.localizedDescription) 
      self.Message.text = String(error.localizedDescription) 
     } 
    }) 
    task.resume() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

はPHPである:ここでは

<?php 
require_once 'DbOperation.php'; 

$response = array(); 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
if (!verifyRequiredParams(array('username', 'password', 'email', 'name'))) { 
    //getting values 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $email = $_POST['email']; 
    $name = $_POST['name']; 

    //creating db operation object 
    $db = new DbOperation(); 

    //adding user to database 
    $result = $db->createUser($username, $password, $email, $name); 

    //making the response accordingly 
    if ($result == USER_CREATED) { 
     $response['error'] = false; 
     $response['message'] = 'User created successfully'; 
    } elseif ($result == USER_ALREADY_EXIST) { 
     $response['error'] = true; 
     $response['message'] = 'User already exist'; 
    } elseif ($result == USER_NOT_CREATED) { 
     $response['error'] = true; 
     $response['message'] = 'Some error occurred'; 
    } 
} else { 
    $response['error'] = true; 
    $response['message'] = 'Required parameters are missing'; 
} 
} else { 
$response['error'] = true; 
$response['message'] = 'Invalid request'; 
} 

//function to validate the required parameter in request 
function verifyRequiredParams($required_fields) 
{ 

//Looping through all the parameters 
foreach ($required_fields as $field) { 
    //if any requred parameter is missing 
    if (!isset($_POST[$field]) || strlen(trim($_POST[$field])) <= 0) { 

     //returning true; 
     return true; 
    } 
} 
return false; 
} 

echo json_encode($response); 
?> 

ですデータベースに投稿しようとしている情報: iOS登録フィールド:

enter image description here

し、登録ボタンを押すときに、エラーが、私はXcodeのから受け付けております:

2017年11月14日00:42:01.529344から0500 WeissProf4 [8754:662299] [MC]を遅延ロード NSBundle MobileCoreServices.framework
2017年11月14日00:42:01.530670から0500 WeissProf4 [8754:662299] [MC]ロードMobileCoreServices.framework
2017年11月14日00:42:01.550941から0500 WeissProf4 [ 8754:662299] [MC] systemgroup.com.apple.configurationprofのシステムグループコンテナilesパスは/Users/leviweiss/Library/Developer/CoreSimulator/Devices/C98EE410-1CA2-4B4B-9ED8-A4F112C629E2/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2017-11-14 00: 42:03.468653-0500 WeissProf4 [8754:662299] [MC]個人的な有効なユーザー設定からの読み取り。 2017-11-14 00:42:04.769899-0500 WeissProf4 [8754:662505]プライベートな効果的なユーザー設定。
[「メッセージ」:必須パラメーターが欠落している、「エラー」:1]

私は何が起こっているかわからないんだけど、私はPHPが正常にDBに接続している知っているし、投稿することができます必要な情報(郵便配達員でテスト済み)私はSwiftがPHPでの投稿をどう扱うかは誤りかもしれないと思っていますが、私はPHPの専門家ではありません。

+0

それがポストマンで動作する場合、それは単に正しくのparamsを投稿しませんあなたのスウィフトコードです。あなたのPHPコードに 'var_dump($ _ POST)'を追加し、Swiftが実際に投稿するものを確認してください。 –

+0

実際には、通常のwww-form( 'param1 = value1&param2 = value2&...'のようなデータをポストする)ではなく、本体にjson文字列を投稿しているようです。本文にjson文字列を投稿する場合は、文字列を抽出してPHPで手動で解析する必要があります。この質問の答えを確認してください:https://stackoverflow.com/questions/37400639/post-data-to-a-php-method-from-swift –

+0

ありがとう、それを指摘して、素晴らしい作品! Swift 4のソリューションの編集を追加しました。 –

答えて

0

SOLUTION Swift4:

@IBAction func register(_ sender: Any) { 

let request = NSMutableURLRequest(url: NSURL(string: "http://cgi.soic.indiana.edu/~lvweiss/prof4/register.php")! as URL) 
request.httpMethod = "POST" 
let postString = "username=\(user.text!)&password=\(pass.text!)&email=\(email.text!)&name=\(name.text!)" 
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 = \(String(describing: response))") 

    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
    print("responseString = \(String(describing: responseString))") 
} 
task.resume() 

}

関連する問題